【模版】欧拉函数

本文介绍了欧拉函数的定义,包括pk型和mn型的性质,并提供了欧拉函数的求解方法,如利用素数幂分解求解。此外,还提到了欧拉定理和费马小定理作为欧拉函数的特殊性质。

定义

φ(N)表示N的欧拉函数。
φ(N)表示小于N且与N互质的数的个数(包含1)。

性质

(1) pk型欧拉函数:
若N是质数p(即N=pk,k=1), φ(n)= φ(p)=p-p(k-1)=p-1。
若N是质数p的k次幂(即N=pk),φ(n)=pk-p(k-1)=(p-1)p(k-1)
(2) mn型欧拉函数
设n为正整数,以φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值。若m,n互质,φ(mn)=(m-1)(n-1)=φ(m)φ(n)。
(3) 特殊性质:
若n为奇数时,φ(2n)=φ(n)。
对于任何两个互质 的正整数a,n(n>2)有:aφ(n)=1 mod n (恒等于)此公式即 欧拉定理
当n=p 且 a与素数p互质(即:gcd(a,p)=1)则上式有: a(p-1)=1 mod n (恒等于)此公式即 费马小定理

求法

对于一个正整数N的素数幂分解N=p1q1 * p2q2 … * pn qn.

φ(N)=N*(1-1/p1) * (1-1/2) …*(1-1/pn).

因为容斥原理,所以1~n中除去与n拥有相同质因子的数剩下的与n互质。
化简过程省略。

计算上面的式子,我们只需要分解质因数。

int eular(int n){
    int ans=n;
    for(int i=2;i*i<=n;i++){
        if(!n%i){//质因数,因为后面去掉了含有前面出现过的质因数的数
            ans=ans/i*(i-1);//计算
            while(!n%i)//去掉该质因数
            n/=i;
        }
    }
    if(n>1) ans=ans/n*(n-1);//如果有剩余
    return ans;
}

也可一次性求解1~n所有

void euler(int n)  {  
    for(int i=2;i<=n;i++){  
        if(!E[i])  //确保是质因数
        for(int j=i;j<=n;j+=i){  //处理其倍数
            if(!E[j])E[j]=j;  
            E[j]=E[j]/i*(i-1);  
        }  
    }  
}

还可与欧拉筛一起计算

void get_phi(int n){  
    int cnt=0;  
    memset(isprime,1,sizeof(isprime));
    for(i=2;i<=n;i++){  
        if(isprime[i]==1){  
            prime[++cnt]=i;  
            phi[i]=i-1;  
        }  
        for(j=1;j<=cnt&&i*prime[j]<=n;j++){  
            isprime[i*prime[j]]=0;  
            if(i%prime[j]==0){  
                phi[i*prime[j]]=phi[i]*prime[j];  
                break;  
            }  
            else phi[i*prime[j]]=phi[i]*(prime[j]-1);  
        }  
    }  
}  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值