乘性函数的详解:http://blog.csdn.net/luyuncheng/article/details/8017016#t3
在非数论的领域,积性函数指所有对于任何a,b都有性质f(ab)=f(a)f(b)的函数。
在数论中的积性函数:对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数。
若对于某积性函数 f(n),就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性的。[1]
因子和函数与因子个数函数都是乘性函数。
因子和:
s(6)=s(2)*s(3)=3*4=12;
s(20)=s(4)*s(5)=7*6=42;
再看 s(50)= 1+2+5+10+25+50=93=3*31=s(2)*s(25),s(25)=1+5+25=31.
这在数论中叫积性函数,当gcd(a,b)=1时 s(a*b)=s(a)*s(b);
如果p是素数 //特别重要的性质
s(p^n)=1+p+p^2+...+p^n= (p^(n+1)-1) /(p-1) (1)
T(p^n)=n+1;//因子的个数
定理:设正整数n的所有素因子分解n=p1^a1*p2^a2*p3^a3****Ps^as,那么
s(n)=[(p1^a1+1 -1)/(p1-1)]*[(p2^a2+1 -1)/(p2-1)]*[(p3^a3+1 -1)/(p3-1)]***[(ps^as+1 -1)/(ps-1)];
T(n)=(a1+1)*(a2+1)*(a3+1)***(an+1);
个数:
1. N的因子个数
条件:给定任意一个一个正整数N
要求:求其因子的个数
首先给出结论:对于任意的整型N,分解质因数得到N= P1^x1 * P2^x2* …… * Pn^xn;
则N的因子个数M为 M=(x1+1) * (x2+1) * …… *(xn+1);
证明过程:
首先 举个例子吧
24 = 2^3 * 3^1;
其质因子有:为2和3 指数为 3和1
那么对于2 有0 1 2 3四种指数选择,对于3 有0 1两种指数选择
所以 就是4 * 2 = 8 个因子个数
如果还是不懂,那么我们就列举出来吧
2 3
2^0*3^0=1 2^0*3^1=3
2^1*3^0=2 2^1*3^1=6
2^2*3^0=4 2^2*3^1=12
2^3*3^0=8 2^3*3^1=24
结果很清晰了吧??其实这里用到了数学的排列组合的知识
也就是说每一个质因子的不同指数幂与其它质因子相乘,得到的结果一定不会重复
因此能够将所有的因子都列举出来。
所以N的因子数M,我们可以用M=(x1+1) * (x2+1) * …… *(xn+1)表示
2. N!的因子个数
有上面的结论,这个问题就变得明朗多了吧?嘿嘿,不要着急,这里面还有许多细节问题需要我们考虑。
a. 最大的质因子一定不会大于N
b. N的质因子并不完全包含N!所有的质因子
至于原因是什么,自己想想吧,嘿嘿
那我们就直接说思路了:
首先,我们可以把所有的N以内的质数给打表求出来
然后,求每一个质因子的指数个数,这里用到了一个公式,:
ei=[N/pi^1]+ [N/pi^2]+ …… + [N/pi^n] 其中[]为取整
附:这一步最近又想到了一个更好的方法 int ei=0;while(N) ei+=(N/=pi); 怎么样??
(想一想为什么,实在想不通你就举个例子试一下)
最后,就是套公式计算了,M=(e1+1)*(e2+1)*……*(en+1)
算了,还是举个例子吧
比如5!
质因子2的指数是 2+1=3;
质因子3的指数是 1;
质因子5的指数是 1;
所以因子个数为 4 * 2 * 2 = 16
5!=120 因子有1 2 3 4 5 6 8 10 12 15 20 24 30 4060 120 刚好16
转载于:http://www.cnblogs.com/dolphin0520/archive/2011/04/11/2012891.html
求n的阶乘某个因子a的个数,如果n比较小,可以直接算出来,但是如果n很大,此时n!超出了数据的表示范围,这种直接求的方法肯定行不通。其实n!可以表示成统一的方式。
n!=(k^m)*(m!)*a 其中k是该因子,m=n/k,a是不含因子k的数的乘积
下面推导这个公式
n!=n*(n-1)*(n-2)*......3*2*1
=(k*2k*3k.....*mk)*a a是不含因子k的数的乘积,显然m=n/k;
=(k^m)*(1*2*3...*m)*a
=k^m*m!*a
接下来按照相同的方法可以求出m!中含有因子k的个数。
因此就可以求出n!中因子k的个数
int count(int n,int k) { int num=0; while(n) { num+=n/k; n/=k; } return num; }
3.给定数列的乘积因子个数
其实这个也是基于第一个结论得到的。
给定 a1 a2 a3 …… an;
我们可以找到最大的一个元素Max(a);
把Max以内的素数打表
然后把质因子清零,进行如下循环,就可以找到各个质因子的个数:
for(a=1;a<=n;a++)
for(p=1;p<_;p++ )
if(__) e(p)++;
这样质因子的质数个数就求出来了,然后就可以根据公式M=(e1+1)*(e2+1)*……*(en+1)求出因子个数