欧拉函数
对于
n(n∈N∗),
φ(n)表示小于等于
n的正整数中与
n互质的个数
例如,
φ(8)=4,因为1,3,5,7与8互质
以下是几个性质
一、
φ(p)=p−1(p∈质数)
这是显然的。
二、
φ(pa)=(p−1)∗pa−1
因为可以被
p整除的数可以表示为
p∗t(t=1,2,3,⋯,pa−1−1),所以与
pa不互质的数一共有
(pa−1−1)个。
那么,
φ(pa)=pa−1−(pa−1−1)=φ(pa)−φ(pa−1)
即
φ(pa)=(p−1)∗pa−1
三、
φ(x)=x∗∏i=1t(1−pi1)(pi∈质数)
现在给定一个数
x,根据唯一分解定理
x=p1k1∗p2k2∗p3k3∗p1k1∗⋯∗ptkt
根据容斥原理,
φ(x)=x−p1x−p2x−⋯−ptx+p1p2x+p1p3x+⋯+pt−1ptx−p1p2p3x−⋯+⋯
即,
φ(x)=x∗(1−p11−p21−⋯−pt1+p1p31+⋯+pt−1pt1−p1p2p31−⋯+⋯)
发挥一下想象或者测一下小数据,就可以得到
φ(x)=x∗i=1∏t(1−pi1)
四、
φ(p)=φ(a)∗φ(b)(其中gcd(a,b)=1)
根据唯一分解定理
a=p1k1∗p2k2∗p3k3∗p1k1∗⋯∗ptkt ⋯⋯①
b=q1k1∗q2k2∗q3k3∗q1k1∗⋯∗qhkh ⋯⋯②
因为
gcd(a,b)=1,所以①式和②式中任意的
p和
q都不相等
根据引理三,
φ(a)=a∗i=1∏t(1−pi1) ⋯⋯③
φ(b)=b∗i=1∏h(1−qi1) ⋯⋯④
③∗④,得:
φ(a)∗φ(b)=a∗b∗i=1∏t(1−pi1)∗i=1∏h(1−qi1)
令
x=a∗b,那么:
φ(p)=φ(a)∗φ(b)
然而,这里是有些问题的,我还不知道
∏i=1t(1−pi1)∗∏i=1h(1−qi1)=∏i=1l(1−gi1) (gi是x的唯一分解)但小数据试了是没有问题的。其实显然,因为
a和
b互质。
五、
φ(i∗p)=φ(i)∗p (i mod p=0)
因为若
i mod p=0,那么
(i+p) mod p=0。同理:若
i mod p̸=0,那么
(i+p) mod p̸=0。
所以
φ(i∗2)=φ(i)∗2
容易得到
φ(i∗3)=φ(i)∗3
⋯⋯
φ(i∗p)=φ(i)∗p
欧拉函数线性筛
根据欧拉函数的性质,我们可以在筛素数的同时将欧拉函数一起线性筛出来
source:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int p[100000],vis[10000000],phi[1000000];
int main(){
int num=0,n;
scanf("%d",&n);
vis[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
p[++num]=i;
phi[i]=i-1;
}
int k;
for(int j=1;j<=num&&i*p[j]<=n;j++)
{
k=i*p[j];
vis[k]=1;
if(i%p[j]==0)
{
phi[k]=phi[i]*p[j];
break;
}
phi[k]=phi[i]*(p[j]-1);
}
}
for(int i=1;i<=n;i++)
{
printf("%d ",phi[i]);
}
printf("\n");
return 0;
}
最后,万分感谢boshi的倾力相助!!!