欧拉函数
在数论,对正整数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;
}