因数个数函数与因数和函数
d(n)表示n的因数的个数函数。σ(n)表示n的所有因数的和的函数。
积性
这两个函数都是积性函数。即gcd(a,b)=1⇒f(ab)=f(a)f(b).
因数个数函数d(n)积性证明思路
对于因数个数函数d(n)只需要用质因数分解的唯一性公式对进行质因数分解,利用简单的组合数学的知识可以知道d(n)的数学表达式。
当gcd(a,b)=1时,说明a与b分解质因数后没有公共的素因子。将d(ab),d(a),d(b)分解用数学表达式表达出来容易证明d(ab)=d(a)d(b).
因数和函数σ(n)积性证明思路
这个稍微复杂一丢丢。
gcd(a,b)=1,即它们互质。
通过分解质因数的方法,容易说明:
- a,b集合各取一个因数,它们的乘积一定是ab的因数。
- 容易证明ab的因数一定可以分解为两个数的积,一个是a的因数,一个是b的因数。
所以a,b各取一个因数ai,bj,就可以构造一个ab的因数aiaj.上面两点可以保证了我们不会漏取。
所以,剩下的工作就是说明不会重复即可。
也就是要说明ai1bj1=ai2bj2成立当且仅当i1=i2且j1=j2。
这个只需要利用a,b互质,有gcd(ai,bj)=1。
然后由gcd(ai1,bj2)=1,得到bj2∣bj1.
同理gcd(ai2,bj1)=1,可以得到bj1∣bj2.于是就迅速得到j1=j2.
同理就可以得到i1=i2.
这就说明不可能重复了。于是σ(ab)=i=1∑d(a)j=1∑d(b)(aibj)
之后只需要用求和符号求和化简即可得到符合积性的结论。
σ(ab)=i=1∑d(a)j=1∑d(b)(aibj)=i=1∑d(a)⎝⎛aij=1∑d(b)bj⎠⎞=i=1∑d(a)(aiσ(b))=σ(b)i=1∑d(a)(ai)=σ(a)σ(b)
说说这两个函数程序如何求值
对于个数函数,显然是分解质因数,获取各个素因子的指数,然后用那个数学表达式算了。
对于因数和函数,如果规模比较小,图方便的话,自然是暴力枚举,试除相加即可。
规模稍微大一点,就利用积性了,分成互质的数的乘积,然后分别算每一部分的因数和,最后相乘即可。
如何保证互质,分解质因数后的那个表达式,每个素因子连同指数当作一个数,不就两两互质了,而且σ(pk)的还是一个等比数列求和.
d(n)的一个性质——d(n)=x∣a∑y∣b∑[gcd(x,y)=1]
假设我们n=ab,不要求a,b互质。
那么有d(n)=x∣a∑y∣b∑[gcd(x,y)=1].
怎么理解
即将n分解成n=ab,然后找有序对(x,y),x,y分别是a,b的因数,并且限制x,y互质。
为什么等号成立?
分解质因数,组合数学就知道了。
对于一个数来说,要构造一个因数,就是对分解质因数后的每个质因子选一个指数,有多少种选法就有多少个因数。
不同质因数选指数是独立的,适用乘法原理;对一个固定的质因子p,假设分解质因数形式里的指数是k,则构造因数时选取指数的范围是从0到k共k+1种。
现在我们将n分成a,b分成两部分了,
下面是个示意图,每个各自代表一个质数,红色的是a和b共有的质因子。绿色的是a含有而b不含有的素因子,蓝色的是b含有而a不含有的素因子。
我们给素因子选一个指数的时候就是往代表这个素因子的格子里填一个指数。
只是我们现在不是直接往n分解之后的格子里填数。而是先分别对a,b的分解后的格子里填数构造因数x,y.

对于红色格子,我们限定a,b填数的时候不能同时往同一个格子里填数。即对于同一个红色格子,那么只有以下可能:
- a和b都没有选,即都填了0
- a选了,填的是1,2,…,ka中的一个;b没选,即填了0
- b没选,填了0;a没选,b选了,1,2,…,kb中的一个
于是a,b和b分开填对于这个红色格子,一共有1+ka+kb种可能。
而n=ab直接分解往里面填数字的时候,对于这个红色格子,能填的范围刚好是0,1,2,3,…,ka+kb共1+ka+kb种可能。
显然,做了不能往同一个格子里填数的限制之后,所有方案是一样的,如果不做这个限制,就不能保证一样了。
对于绿色格子和蓝色格子,由于是各自独有的,显然a,b分别填和n直接分解填的方案数是一样的。
所以最终方案数是一样的。
所以,我们只需要a和b分别填指数构造自己的因数x,y,统计填法的方案数即可,只是要保证不能对同一个素因子都填非零的指数即可。
那么怎么保证?那么怎么保证?那么怎么保证?
如果他们选用了相同的素因子p,显然a构造出的因数x和y构造的因数就含有公约数p,所以只需要保证x,y互质即可。