欧拉函数 欧拉定理 欧拉降幂

本文详细介绍了欧拉函数的定义、性质及其应用。包括欧拉函数的计算方法、通式及特殊情形下的简化公式,并深入探讨了欧拉定理及其在幂次运算中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欧拉函数:

定义:

ϕ(i)\phi(i)ϕ(i)表示第i个欧拉函数的值,代表了从1到i与i互质的数的个数,例如ϕ(8)=4\phi(8)=4ϕ(8)=4,因为1,3,5,7均和8互质

通式:

ϕ(x)=x∗∏i=1n(1−1pi)(pi为x的质因子)\phi (x)=x*\prod_{i=1}^n(1-\dfrac{1}{p_i}) (p_i为x的质因子)ϕ(x)=xi=1n(1pi1)(pix)
eg:ϕ(8)=8∗(1−12)=4eg:\quad \phi(8)=8*(1-\dfrac{1}{2})=4eg:ϕ(8)=8(121)=4

关系式:

  • 如果a是素数且n不是a倍数 , 有ϕ(n∗a)=ϕ(n)∗(a−1)\phi(n*a)=\phi(n)*(a-1)\quadϕ(na)=ϕ(n)(a1)
  • 如果a是素数且n是a倍数 , 有ϕ(n∗a)=ϕ(n)∗a\phi(n*a)=\phi(n)*aϕ(na)=ϕ(n)a
  • 如果n是素数 , 有ϕ(n)=n−1\phi(n)=n-1ϕ(n)=n1
  • 如果n和m互质 , 有ϕ(m∗n)=ϕ(m)∗ϕ(n)\phi(m*n)=\phi(m)*\phi(n)ϕ(mn)=ϕ(m)ϕ(n)
  • 如果n是奇数 , 有ϕ(2∗n)=ϕ(n)\phi(2*n)=\phi(n)ϕ(2n)=ϕ(n)
  • 如果n>2 , 有ϕ(n)\phi(n)ϕ(n)为偶数
  • 如果p是素数 , 有ϕ(pq)=pq−pq−1\phi(p^q)=p^q- p^{q-1}ϕ(pq)=pqpq1

求和式:

  • ∑d∣nϕ(d)=n\sum_{d|n}\phi(d)=ndnϕ(d)=n
  • ∑i=1n[gcd(n,i)=1]=ϕ(n)\sum_{i=1}^n[gcd(n,i)=1]=\phi(n)i=1n[gcd(n,i)=1]=ϕ(n)
  • ∑i=1ni[gcd(n,i)=1]=⌈ϕ(n)∗n2⌉\sum_{i=1}^ni[gcd(n,i)=1]=\lceil \dfrac{\phi(n)*n}{2}\rceili=1ni[gcd(n,i)=1]=2ϕ(n)n,由于n>2n>2n>2时欧拉函数值为偶数,所以只有n=1n=1n=1时为奇数,所以可以写成ϕ(n)∗n2+[n=1]\dfrac{\phi(n)*n}{2}+[n=1]2ϕ(n)n+[n=1]或者ϕ(n)∗n+[n=1]2\dfrac{\phi(n)*n+[n=1]}{2}2ϕ(n)n+[n=1]

按照通式我们就可以O(sqrt(n))求出一个数的欧拉函数值:

int phi(int n){  
     int res=n,a=n;  
     for(int i=2;i*i<=a;i++){  //这里可以素数筛处理再枚举素数,不过这样也是可以的
         if(a%i==0){  
             res=res/i*(i-1); 
             //res=rea-rea/i;
             while(a%i==0) a/=i;  
         }  
     }  
     if(a>1) res=res/a*(a-1);  
     return res;  
} 

可以利用性质,O(n)筛法处理出n个数的值,而大于nnn的无法预处理的部分,可以用性质去掉部分素因子,降到[1,n][1,n][1,n],两部分相乘得。

const int MAXN = 1e6+5;
bool flag[MAXN];
LL phi[MAXN];
LL p[MAXN];
LL cnt ;

void Get_Phi(){
    cnt = 0;
    phi[1] = 1ll;
    for(LL i=2ll; i<MAXN; i++)   {
        if(!flag[i]) {
            p[++cnt] = i;
            phi[i] = i-1ll;//性质2
        }
        for(LL j=1; j<=cnt&&1ll*i*p[j]<MAXN; j++){
            flag[i*p[j]] = 1;
            if(i%p[j] == 0){
                phi[i*p[j]] = p[j] * phi[i];//性质3
                break;
            }
            else phi[i*p[j]] = (p[j]-1ll) * phi[i];//性质1
        }
    }
}
int Get_Phi(int n){
    int now=1;
    for(int i=1;i<=cnt;i++){
        if(n<MAXN)return now*phi[n];
        if(n%p[i]==0)while(1){
            n/=p[i];
            if(n%p[i]==0){
                now*=p[i];
            }
            else{
                now*=p[i]-1;
                break;
            }
        }
        if(n==1)return now;
        if(p[i]>sqrt(n))
            return now*(n-1);
    }
}

欧拉定理:

如果a和m互质的情况下,有同余性质:aφ(m)≡1(mod  m)  (gcd(a,m)=1)a^{φ(m)}\equiv1(mod \;m) \;(gcd(a,m)=1)aφ(m)1(modm)(gcd(a,m)=1)
这个东西有什么用呢?


欧拉降幂:

比如让你求7233%m7^{233}\% m7233%m(求个位数就是%10)后的结果(不使用快速幂,因为有些题需要O(1)处理)

由欧拉定理得 : 7ϕ(m)≡1(mod  m)7^{\phi(m)}\equiv1(mod \;m)7ϕ(m)1(modm)

设:a=233  %  ϕ(m),即233=k∗ϕ(m)+aa=233\;\% \;\phi(m),即233=k*\phi(m)+aa=233%ϕ(m),233=kϕ(m)+a

⇒\Rightarrow同求(7k∗ϕ(m)∗7a)%m(7^{k*\phi(m)}*7^a)\%m(7kϕ(m)7a)%m
=(1∗7a)%m=(1*7^a)\%m=(17a)%m

所以得出欧拉降幂在a与m互质情况下的公式:
aq≡aq%ϕ(m)  (mod  m)a^q\equiv a^{q\%\phi(m)}\;(mod\;m)aqaq%ϕ(m)(modm)

当然还有通用公式(不管是否互质):
q>=ϕ(m)时:aq≡aq%ϕ(m)+ϕ(m)  (mod  m)q>=\phi(m)时:a^q\equiv a^{q\%\phi(m)+\phi(m)}\;(mod\;m)q>=ϕ(m)aqaq%ϕ(m)+ϕ(m)(modm)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值