欧拉函数

欧拉函数
在数论,对正整数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
",i,phi[i]);
    return;
}

int main()
{
    scanf("%d",&x);
    EE();
    doit();
    return 0;
}
原文地址:https://www.cnblogs.com/wutongtong3117/p/7673629.html