参考链接
浅谈欧拉函数什么是欧拉函数
欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。特殊的,φ(1)=1。
如何计算欧数值拉函
欧拉函数的通式:φ(n)=n*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)……(1-1/pn),其中p1, p2……pn为n的所有质因数,n是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。
代码实现:
int euler(int n)
{
int ans=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
ans-=ans/i;
while(n%i==0){
n/=i;
}
}
}
if(n>1)ans-=ans/n;
return ans;
}
晦涩难懂一:代码中的 ans-=ans/i; 这一步就是对应欧拉函数的通式~还是应该比较容易看懂的吧?
晦涩难懂二:while(n%i==0) n/=i; 这一个语句是为了保证完全消除我们刚才得到的那个i因子。确保我们下一个得到的i是n的素因子。
晦涩难懂三:if(n>1)ans-=ans/n; 这个语句是为了保证我们已经除完了n的所有的素因子,有可能还会出现一个我们未除的因子,如果结尾出现n>1 ,说明我们还剩一个素因子木有除。
欧拉函数值打表:
void euler()
{
for(int i=2;i<maxn;i++){
if(!E[i])
for(int j=i;j<maxn;j+=i){
if(!E[j])E[j]=j;
E[j]=E[j]/i*(i-1);
}
}
}
积性函数
先介绍一下什么是积性函数,后面将会用到。若当m与n互质时,f(m∗n)=f(m)∗f(n),那么f是积性函数。若对任意正整数,都有f(m*n)=f(m)*f(n)成立,则f是完全积性函数。
欧拉函数的几个性质
- 对于质数p,φ§=p−1
- 若p为质数,n=pk,则φ(n)=pk-p^(k-1)
- 欧拉函数是积性函数,但不是完全积性函数。若m,n互质,则φ(m∗n)=φ(m)∗φ(n) 。特殊的,当m=2,n为奇数时,φ(2*n)=φ(n)。
- 当n>2时,φ(n)是偶数。
- 小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)。