数学作业,要求我们写一篇数学读物的观后感(zzsz,OI-Wiki 他也是一本读物,对吧?)
在这个寒假,我在网上阅读了 OI-Wiki 的数学数论部分(Link:https://oi-wiki.org/math/),对此深有感悟,因此来写一篇观后感。
注:本文可能有些地方不严谨,因此如果错误请您谅解。
贝尔数
贝尔数又称作集合划分计数,oeis 中 有此记录(Link:https://oeis.org/A000110)。
问题 求有多少种划分基数为 (n) 的集合的方法。
贝尔数的定义如上所述,上面这个问题的答案即为 (B_n),第 (n) 个贝尔数。
那么我们尝试来求解贝尔数。
一个一个元素分开考虑,假设我们要分的集合是集合 (S),他的元素分别为 ({s_1,s_2,cdots,s_t})((t) 即为 (|S|)),那么考虑将新的元素 (s_{t+1}) 加入到这个集合时,对集合 (S) 划分个数的影响即为:
- 当 (s_{t+1}) 被单独划分时,剩下 (n) 个元素可以任意划分,套上贝尔数的定义,对答案的贡献即为:
[inom n n B_t
]
- 当 (s_{t+1}) 与 (1) 个元素划分到一块时,剩下 (n-1) 个元素可以任意划分,对答案的贡献即为:
[inom n{n-1} B_{t-1}
]
- ……
- 当 (s_{t+1}) 与 (k) 个元素划分到一块时,剩下 (n-k) 个元素可以任意划分,对答案的贡献即为:
[inom n{n-k} B_{t-k}
]
如果我们把反过来的再正过来归纳为一个式子的话,那么 (B_n) 的推导结果也就出来了:
[B_n=sumlimits_{i=0}^n inom n i B_i
]
根据定义,(B_0=1),因为划分一个基数为 (0) 的集合只有一种方式。
OI-Wiki 上还介绍了一种神奇的通过构建 Bell Triangle 的方式来求贝尔数。
Bell Triangle 类似杨辉三角,假设第 (i) 行第 (j) 列的数为 (b_{i,j}),那么构建 Bell Triangle 的方式是:
- (b_{1,1}=1),(b_{n,1}=b_{n-1,n-1} (n>1))。
- (b_{n,m}=b_{n,m-1}+b_{n-1,m} (m,n > 1))。
第一列的数即为贝尔数。
类欧几里得算法
类欧几里得算法致力于解决直线下整点个数问题,这种问题又能转化为一个固定的式子模式。
问题 1 给定 (n,a,b,c),求 (f(n,a,b,c)),其中 (f) 函数定义为:
[f(n,a,b,c)=sumlimits_{i=0}^n leftlfloordfrac{ai+b}{c}
ight
floor
]
首先介绍一种 升维转换,比如说对于下面这个求和:
[sumlimits_{i=1}^n p(i)
]
当我们发现这个式子很难求的时候,可以把 (p(i)) 单独作为一维进行升维,即:
[sumlimits_{i=1}^nsumlimits_{j=1}^{p(i)}1
]
那么我们将 (f) 函数也这么代入:
[egin{aligned}f(n,a,b,c)&=sumlimits_{i=0}^nsumlimits_{j=0}^{leftlfloorfrac{ai+b}{c}
ight
floor-1}1end{aligned}
]
然后我们将其进行 限制转换(又称 放缩),限制转换就是说比如说你有下面这个求和式子:
[sumlimits_{i=1}^nsumlimits_{j=1}^i p(i,j)
]
第二个求和有一个隐藏限制就是 (j le i)。
那么当我们交换两个求和时:
[sumlimits_{j=1}^nsumlimits_{i=1}^n p(i,j)
]
这个值就肯定和原来的值不相同,因为 (j) 的限制从 (j le i) 变成了 (j le n),因此如果想让上面两个式子相等,需要加一步进行限制:
[sumlimits_{j=1}^nsumlimits_{i=1}^n p(i,j) imes[j le i]
]
那么我们也将我们化简后的式子如此代入一下:
[=sumlimits_{j=0}^{leftlfloorfrac{an+b}{c}
ight
floor-1}sumlimits_{i=0}^n left[j<leftlfloordfrac{ai+b}{c}
ight
floor
ight]
]
我们把限制条件 (j<leftlfloordfrac{ai+b}{c}
ight
floor) 尝试进行一下推导:
[egin{aligned}j<leftlfloordfrac{ai+b}{c}
ight
floor& o j+1 le leftlfloordfrac{ai+b}{c}
ight
floor\& o j +1 le dfrac{ai+b}{c}\& o jc+c le ai+b\& o jc+c-b-1 < ai\& o leftlfloordfrac{jc+c-b-1}{a}
ight
floor<iend{aligned}
]
将限制条件代入原式继续化简(即试着把第二个循环处理掉):
[egin{aligned}sumlimits_{j=0}^{leftlfloorfrac{an+b}{c}
ight
floor-1}sumlimits_{i=0}^n left[leftlfloordfrac{jc+c-b-1}{a}
ight
floor<i
ight]&=sumlimits_{j=0}^{leftlfloorfrac{an+b}{c}
ight
floor-1}n-leftlfloordfrac{jc+c-b-1}{a}
ight
floor\&=nleftlfloordfrac{an+b}{c}
ight
floor-fleft(leftlfloorfrac{an+b}{c}
ight
floor,c,c-b-1,a
ight)end{aligned}
]
回观原来的式子,我们需要用 (mathcal O(n)) 的时间复杂度求解,然而这个我们只需要用 (mathcal O(log n)) 的时间复杂度求解即可。
问题 2 给定 (n,a,b,c),求 (f_1(n,a,b,c),f_2(n,a,b,c)),其中 (f_1,f_2) 函数定义为:
[f_1(n,a,b,c)=sumlimits_{i=0}^nileftlfloordfrac{ai+b}{c}
ight
floor
]
[f_2(n,a,b,c)=sumlimits_{i=0}^nleftlfloordfrac{ai+b}{c}
ight
floor^2
]
为了方便,(k_1=leftlfloordfrac{an+b}{c}
ight
floor),(k_2=leftlfloordfrac{ai+b}{c}
ight
floor),(k_3=leftlfloordfrac{jc+c-b-1}{a}
ight
floor)。
因为上面已经把具体步骤说的比较详细明白了,所以此处只把推导的结果给出。
(f_1) 的推导过程:
[egin{aligned}sumlimits_{i=0}^nileftlfloordfrac{ai+b}{c}
ight
floor & =sumlimits_{j=0}^{k_1-1}sumlimits_{i=0}^n (j<k_2) i\& = sumlimits_{j=0}^{k_1-1}sumlimits_{i=0}^n (i>k_3) i\& = sumlimits_{j=0}^{k_1-1}sumlimits_{i=k_3+1}^n i\& =sumlimits_{j=0}^{k_1-1}sumlimits_{i=1}^n i - sumlimits_{i=1}^{k_3}i\&=sumlimits_{j=0}^{k_1-1}dfrac{1}{2}n(n+1) - dfrac{1}{2}k_3(k_3+1)\& =dfrac{1}{2}left[k_1n(n+1)-sumlimits_{j=0}^{k_1-1}k_3^2-sumlimits_{j=0}^{k_1-1}k_3
ight]\& =dfrac{1}{2}[k_1n(n+1)-f_2(k_1-1,c,c-b-1, a)-f(k_1-1,c,c-b-1,a)]end{aligned}
]
(f_2) 的推导过程:
[egin{aligned}sumlimits_{i=0}^nleftlfloordfrac{ai+b}{c}
ight
floor^2&=sumlimits_{i=0}^nleft[left(2sumlimits_{j=1}^{k_2}j
ight)-k_2
ight]\&=left(2 sumlimits_{i=0}^nsumlimits_{j=1}^{k_2}j
ight)-f(n,a,b,c)\&=left[2left(dfrac{1}{2}nk_1(k_1+1)-sumlimits_{j=0}^{k_1-1}(j+1)k_3
ight)
ight]-f(n,a,b,c)\&=nk_1(k_1+1)-2f_1(k_1-1,c,c-b-1,a)-2f(k_1-1,c,c-b-1,a)-f(n,a,b,c)end{aligned}
]
(f_2) 的推导有一个公式需要使用:
[egin{aligned}n^2&=2 imes dfrac{n(n+1)}{2} -n\&=left(2 sumlimits_{i=0}^ni
ight)-nend{aligned}
]
至此,(f,f_1,f_2) 的公式已推导完毕,这即为类欧几里得算法的具体内容(这三个函数可以互相递归,(mathcal O(log n)) 的时间复杂度),当然有一个拓展形式:
问题 3 给定 (n,a,b,c,u,v),求 (f_3(n,a,b,c,u,v)),其中 (f_3) 函数定义为:
[f_3(n,a,b,c,u,v)=sumlimits_{i=0}^ni^uleftlfloordfrac{ai+b}{c}
ight
floor^v
]
这个内容需要用万能欧几里得算法进行解决,笔者实力 & 时间有限,因此只介绍到这里。
Thanks for Watching!!