欧拉函数

内容:计算一个数内的与这个数互质元素的个数

每个数都能被分解成若干质数的乘积

设p1^a1×p2^a2×…×pk^ak为正整数n的素数乘积式,
那么这个正整数的互质元素个数为:
=n×(1-1/p1) ×(1-1/p2)×…×(1-1/pk)
也为:
 1 int eular(int n)
 2 {int k,res;
 3  k=2; res=n;
 4  while (k*k<=n){
 5     if (n%k==0){
 6           res=res/k*(k-1);
 7           while (n%k==0) n/=k;
 8     } 
 9       k++;
10  }
11  if (n>1) res=res/n*(n-1);//40的例子中 5会到这里来
12  return res;
13 } 
14         

求1-n之间所有正整数的欧拉函数

 1 void eular(int n){
 2 for(int i=2;i<=n;i++){
 3    if (!IsPrime[i]){prime[++cnt]=i;  phi[i]=i-1;}
 4    for(int j=1;j<=cnt;j++){
 5        if (prime[j]*i>n) break;
 6        Isprime[prime[j]*i]=1;
 7        if (i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];  break;}
 8        else  phi[i*prime[j]]=phi[i]*(prime[j]-1);
 9    }
10 }
11 } 

例题:

1.
给出一个数字m (1 <= m <= 1000000), 数字K (1 <= K <= 100000000).求与M互质的第K个数字。
找到规律了吗?
假设一个数是12
比12小的且与12互质的是 1      5      7      11
更大的是这么多:     13   17    19     23
              25   29    31     35
这样的话,只用找出比n小的欧拉分别为多少,个数有多少,然后加自己加自己加自己......
为什么?
因为一个数a与n互质,那a+n与n也互质啊。
 
2.
给定一个整数N,你需要求出∑Gcd(i, N)(1<=i <=N)。//最大公约数之和
比如n=6时:
因为6的因数是1,2,3,6,所以n和小于n的数,两者的公约数只有可能在1,2,3,6里取。所以就算出每个公约数对应的个数就好了
如果对于数字i,如果Gcd( i ,6)=1,则转化求与6互质的数字有多少个,易知有2个,为1和5;
如果对于数字i,如果Gcd( i ,6)=2,则转化求与3互质的数字有多少个,易知有2个,为1和2;
       为什么?我们设i=2*a,6=2*3,那Gcd(a,3)=1,即转换成与三互质的数的个数。
如果对于数字i,如果Gcd( i ,6)=3,则转化求与2互质的数字有多少个,易知有1个,为1;
如果对于数字i,如果Gcd( i ,6)=6,则转化求与1互质的数字有多少个,易知有1个,为1。
Ans=2*1+2*2+3*1+6*1
      =2+4+3+6
      =15
 
欧拉函数的性质:
  积性函数:对于所有互质的整数a和b有f(a*b)=f(a)*f(b)的数论函数。
1:如果n为某一素数p,则fy(p)=p-1
2:欧拉函数是积性函数,即当(m,n)=1,fy(m*n)=fy(m)*fy(n)
3:如果p|n,且p^2|n,则fy(n)= fy(n/p)*p,
  因为n和n/p包含相同的质因子,只是P的指数不一样,因而按欧拉函数的计算公式写出,两者相除,商为P。
  易知如果n为某一素数p的幂次p^a,fy(p^a)=(p-1)×p^(a-1)
4:如果p|n,且p^2|n不成立时,则p与n/p互质,于是j(n)= fy(n/p)*(p-1)
5:与N互质的数字和为n*fy(n)/2,因为gcd(n,x)=gcd(n,n-x)
6:n是奇数时,fy(2n)=fy(n)
 
无愧于心,不困于情。
原文地址:https://www.cnblogs.com/SUMMER20020929/p/9752372.html