欧拉函数
在数论,对正整数n,欧拉函数是小于n的数中与n互质的数的数目。
通式:
欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。
注意:每种质因数只一个。比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4
补充:欧拉函数公式
( 1 ) p^k 的欧拉函数
对于给定的一个素数 p , φ(p) = p -1。则对于正整数 n = p^k ,
φ(n) = p^k - p^(k -1)
证明:
小于 pk 的正整数个数为 p^k - 1个,其中
和 pk 不互质的正整数有{p * 1,p * 2,...,p * (p^k - 1-1)} 共计 p^(k - 1) - 1 个
所以 φ(n) = p^k - 1 - (p^(k - 1) - 1) = p^k - p^(k - 1) 。
( 2 ) p * q 的欧拉函数
假设 p, q是两个互质的正整数,则 p * q 的欧拉函数为
φ(p * q) = φ(p) * φ(q) , gcd(p, q) = 1 。
证明:
令 n = p * q , gcd(p,q) = 1
根据中国余数定理,有 Zn 和 Zp × Zq 之间存在一一映射,(我的想法是: a ∈ Zp , b ∈ Zq ? b * p + a * q ∈ Zn 。) 所以 n 的完全余数集合的元素个数等于集合 Zp × Zq 的元素个数。 而后者的元素个数为 φ(p) * φ(q) ,所以有 φ(p * q) = φ(p) * φ(q) 。
( 3 ) 任意正整数的欧拉函数
任意一个整数 n 都可以表示为其素因子的乘积为:
I n = ∏ piki (I 为 n 的素因子的个数) i=1
根据前面两个结论,很容易得出它的欧拉函数为:
I I Φ(n) = ∏ piki -1(pi -1) = n ∏ (1 - 1 / pi) i=1 i=1对于任意 n > 2,2 | Φ(n) ,因为必存在 pi -1 是偶数。
<一>直接求解欧拉函数
int euler(int n){ //返回euler(n)
int res=n;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出
while(n%i==0) n/=i;
}
}
if(n>1) res=res/n*(n-1);
return res;
}
#define Max 1000001
int euler[Max];
void Init(){
euler[1]=1;
for(int i=2;i<Max;i++) euler[i]=i;
for(int i=2;i<Max;i++)
if(euler[i]==i)
for(int j=i;j<Max;j+=i)
euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出
}