参考链接 浅谈欧拉函数

什么是欧拉函数

欧拉函数是小于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本身)。

2019012223244671.png

代码实现:

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是完全积性函数。

欧拉函数的几个性质

  1. 对于质数p,φ§=p−1
  2. 若p为质数,n=pk,则φ(n)=pk-p^(k-1)
  3. 欧拉函数是积性函数,但不是完全积性函数。若m,n互质,则φ(m∗n)=φ(m)∗φ(n) 。特殊的,当m=2,n为奇数时,φ(2*n)=φ(n)。
  4. 当n>2时,φ(n)是偶数。
  5. 小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)。
    20190122233751903.png