约数定理(约数个数定理,约束和定理)

来源:互联网 发布:轻网站源码 编辑:程序博客网 时间:2024/05/21 08:42

约数个数定理:

对于一个大于1正整数n可以分解质因数:
则n的正约数的个数就是
其中a1、a2、a3…ak是p1、p2、p3,…pk的指数。

定理简证:

首先同上,n可以分解质因数:n=p1^a1×p2^a2×p3^a3*…*pk^ak,
由约数定义可知p1^a1的约数有:p1^0, p1^1, p1^2......p1^a1 ,共(a1+1)个;同理p2^a2的约数有(a2+1)个......pk^ak的约数有(ak+1)个。
故根据乘法原理:n的约数的个数就是(a1+1)(a2+1)(a3+1)…(ak+1)。

例题:

例题:正整数378000共有多少个正约数?
解:将378000分解质因数378000=2^4×3^3×5^3×7^1
由约数个数定理可知378000共有正约数(4+1)×(3+1)×(3+1)×(1+1)=160个。

约数和定理:

对于一个大于1正整数n可以分解质因数:n=p1^a1*p2^a2*p3^a3*…*pk^ak,
则由约数个数定理可知n的正约数有(a₁+1)(a₂+1)(a₃+1)…(ak+1)个,
那么n的(a₁+1)(a₂+1)(a₃+1)…(ak+1)个正约数的和为
f(n)=(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)

定理证明:

证明:若n可以分解质因数:n=p1^a1*p2^a2*p3^a3*…*pk^ak,
可知p1^a1的约数有:p1^0, p1^1, p1^2......p1^a1
同理可知,pk^ak的约数有:pk^0, pk^1, pk^2......pk^ak ;
实际上n的约数是在p1^a1、p2^a2、...、pk^ak每一个的约数中分别挑一个相乘得来,
可知共有(a₁+1)(a₂+1)(a₃+1)…(ak+1)种挑法,即约数的个数。
由乘法原理可知它们的和为
f(n)=(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)

例题:

例题:正整数360的所有正约数的和是多少?
解:将360分解质因数可得
360=2^3*3^2*5^1
由约数和定理可知,360所有正约数的和为
(2^0+2^1+2^2+2^3)×(3^0+3^1+3^2)×(5^0+5^1)=(1+2+4+8)(1+3+9)(1+5)=15×13×6=1170
可知360的约数有1、2、3、4、5、6、8、9、10、12、15、18、
20、24、30、36、40、45、60、72、90、120、180、360;则它们的和为
1+2+3+4+5+6+8+9+10+12+15+18+20+24+30+36+40+45+60+72+90+120+180+360=1170

所有因子个数τ(n)与所有因子的和σ(n)都是乘(积)性函数。

定义1:因子和函数σ定义为整数n的所有正因子之和,记为σ(n)。

定义2:因子个数函数τ定义为正整数n的所有正因子个数,记为τ(n)。


定理1:设p是一个素数,a是一个正整数,那么

                                σ(n)=1+p+p^2+……+p^a=【p^(a+1)-1】/(p-1)

                                τ(n)=a+1

定理2:设正整数n有素因子分解 n =(p1^α1)*(p2^α2)*(p3^α3)* ....... *(pk^αk),那么

             σ(n)=【(p1^α1)-1】/(p1-1) * 【(p2^α2)-1】/(p2-1) * .....  *【(pk^αk)-1】/(pk-1)

             τ(n)=(α1+1)*(α2+1)*(α3+1)*......*(αk+1)

求因子个数:

int prime[maxn],nprime;  int vis[maxn];    void getprime(){    nprime = 0;    memset(vis,0,sizeof(vis));    for(int i = 2; i <= 450; i++){        int t = 450/i;        for(int j = 2; j <=t; j++)            vis[i*j] = 1;    }    for(int i = 2; i <= 450; i++){        if(!vis[i])            prime[nprime++] = i;    }}  int factor_count(int n){      int ans = 1,sum;      int k = sqrt(n*1.0);      for(int i = 0; prime[i] < k; i++){          if(n % prime[i] == 0){              sum = 0;              while(n % prime[i] == 0){                  sum++;                  n /= prime[i];              }              ans *= (a+1);          }      }      if(n > 1)          ans *= 2;      return ans;  }  



求因子和:

int prime[maxn],nprime;int vis[maxn];void getprime(){    nprime = 0;    memset(vis,0,sizeof(vis));    for(int i = 2; i <= 450; i++){        int t = 450/i;        for(int j = 2; j <=t; j++)            vis[i*j] = 1;    }    for(int i = 2; i <= 450; i++){        if(!vis[i])            prime[nprime++] = i;    }}int pow_mod(int a,int n,int MOD){    int ans = 1;    while(n){        if(n&1)            ans = (ans*a)%MOD;        n >>= 1;        a = (a*a)%MOD;    }    return ans;}int factor_sum(int n){    int ans = 1,sum;    int k = sqrt(n*1.0);    for(int i = 0; prime[i] < k; i++){        if(n % prime[i] == 0){            sum = 0;            while(n%prime[i] == 0){                sum++;                n /= prime[i];            }            ans *= (pow_mod(prime[i],sum+1,MOD)-1)/(prime[i]-1);        }    }    if(n > 1)        ans *= ans(n*n-1)/(n-1);    return ans;}


0 0
原创粉丝点击