欧拉函数入门理解

含义

欧拉函数:phi(n)     1-n这个区间里面和n互质的个数有多少个

公式

先化解出最简质因子乘式

n=p1^a1*p2*a2.....*px^ax

那么就是公式就是

phi(n)=n*((p1-1)/p1)*((p2-1)/p2)....((px-1)/px)=n*(1-1/p1)*(1-1/p2).....(1-1/px)

解析

首先我们为什么是这个公式呢,首先要求互质,那么就说明化成最简公式后,两个数之间没有相同的质因子

那么我们算下1-n中有多少个又p1这个因子,那么个数就是n/p1,算有多少个p2因子的数也是一样的道理

但是我们要还要加上我们删两次的数,也就是包含p1*p2因子的数,所以我们公式也就是

假设只有这两个质因子,那么

phi(n)=n-n/p1-n/p2+n/(p1*p2) = n*(1-1/p1-1/p2+1/(p1*p2)) = n*(1-1/p1)*(1-1/p2)

这就化成了公式,这只是两个数的情况,当然这扩展到多个数是一样的,中间就是用了容斥定理

 

所以我们写代码的时候只要求出n所有的质因子即可

#include<cstdio>
#include<iostream>
#include<cmath>
#define maxn 200005
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ll n;
ll phi(ll x){
    ll sum=x;
    for(int i=2;i<=sqrt(x);i++){
        if(x%i==0){
            sum=sum/i*(i-1);
            while(x%i==0) x/=i;//把i因子都除尽,因为每个质因子还有次方,我们要全部除掉
        }
    }
    if(x>1) sum=sum/x*(x-1);//最后这个质因子有可能超过sqrt,所以没有被除到
    return sum; 
}
int main(){
    while(cin>>n){
        cout<<phi(n)<<"
";
    }
} 

欧拉函数两条性质

1,n>1时,1-n中与n互质的数的和为    n*phi(n)/2;

解释:因为gcd(n,x) = gcd(n,n-x)   所以当gcd(n,x)=1 n和x互质时  那么说明  n和n-x肯定也互质   ,所以都是成对出现的 一对加起来就是n,这样一平均就是每个数的和为n/2

2,phi(a*b) = phi(a)*phi(b)

解释:因为化简成最简式子后是一样的 

原文地址:https://www.cnblogs.com/Lis-/p/11004617.html