欧拉函数

来源:互联网 发布:淘宝生意参谋标准版 编辑:程序博客网 时间:2024/03/29 17:12

欧拉函数
在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。例如φ(8)=4,因为1,3,5,7均和8互质。
简介
  φ函数的值
  φ(1)=1(唯一和1互质的数就是1本身)。
  若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。p的倍数的个数p^k/p=p^(k-1)
  欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。
特殊性质:当n为奇数时,φ(2n)=φ(n), 证明于上述类似。
欧拉函数的编程实现
  利用欧拉函数和它本身不同质因数的关系,用筛法计算出某个范围内所有数的欧拉函数值。
欧拉函数和它本身不同质因数的关系:欧拉函数ψ(N)=N{∏p|N}(1-1/p)。(p是数N的质因数)
如:
  ψ(10)=10×(1-1/2)×(1-1/5)=4;
  ψ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;
  ψ(49)=49×(1-1/7)=42。

下面这个程序是计算≤x的所有数的欧拉函数(phi)

这里写代码片#include<cstdio>#include<iostream>#include<cstring>#include<cmath>using namespace std;const int N=1000010;bool p[N];int sshu[N];int x,phi[N];void EE()  //埃氏筛法 {    memset(p,1,sizeof(p));    int i,j;    for (i=2;i*i<=N;i++)       for (j=2;i*j<=N;j++)           p[i*j]=0;    for (i=2;i<=N;i++)        if (p[i])            sshu[0]++,sshu[sshu[0]]=i;    return;}void doit(){    int i,j;    for (i=1;i<=x;i++) phi[i]=i;    for (i=1;sshu[i]<=x&&sshu[i];i++)  //最大数是x    {        for (j=sshu[i];j<=x;j+=sshu[i])            phi[j]=phi[j]/sshu[i]*(sshu[i]-1);              //拥有sshu[i]这个质因子的数都要*(1-1/sshu[i])     }    //此处注意先/再*,否则范围较大时会溢出    for (i=1;i<=x;i++)        printf("phi(%d) : %d\n",i,phi[i]);    return;}int main(){    scanf("%d",&x);    EE();    doit();    return 0;}
0 0
原创粉丝点击