转载自@ITAK
http://blog.csdn.net/qingshui23/article/details/50969344
看贾志鹏线性筛的时候想起来的。
我有一个繁琐的证明- -。
证明ϕ(pm)=p×ϕ(m),p为素数,m∈Z.
设
m=p^α⋅m′,α,m′∈N,(p ^α,m′)=1.
那么
ϕ(m)=ϕ(m′)⋅ϕ(p^α).
而
ϕ(p^α)=(p−1)p ^α−1
因此
ϕ(m)=ϕ(m′)⋅((p−1)p^α−1).
又因为
n=p⋅m=m′⋅p^α+1
显然m′和p^α+1互素,所以
ϕ(n)=ϕ(m′)⋅ϕ(p^α+1)=ϕ(m′)⋅p⋅(p−1)⋅p ^α−1=ϕ(m)⋅p
证毕。
(上面pα 指的是 p^α, 即 p的α次幂…不好意思,是输入的问题
现在上面的p^α−1 都是p的α−1 次幂)
参考:
顺便贴下欧拉函数筛法代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 50005;
int n;
int phi[MAXN],prime[MAXN],cnt_p;
int flag_p[MAXN];
void getphi()
{
cnt_p = 0;
memset(flag_p,0,sizeof(flag_p)); //0为素数
flag_p[0] = 1;
flag_p[1] = 1;
phi[0] = 0;
phi[1] = 0;//???
for(int i=2; i<MAXN; ++i)
{//cout<<"xxx"<<endl;
if(!flag_p[i]) { prime[cnt_p++] = i; phi[i] = i-1; }
for(int j=0; j<cnt_p && i*prime[j]<MAXN; ++j)
{
flag_p[i*prime[j]] = 1;
if(!(i%prime[j])) { phi[i*prime[j]] = phi[i]*prime[j]; break;}
else phi[i*prime[j]] = phi[i]*(prime[j]-1); //若p为素数,则pih[p] = p-1;
}
}
return ;
}
int main()
{
getphi();
// for(int i=0; i<100; ++i)
// cout<<i<<" "<<phi[i]<<endl;
}