数论学习六之——欧拉定理(欧拉降幂)

我们现在就来学习数论四大定理中的最后一个定理,欧拉定理。
首先我们先介绍一下什么是欧拉函数,欧拉函数 φ ( n ) \varphi(n) 求的是不超过n且与n互素的正整数的个数,例如: φ ( 4 ) = 2 \varphi(4) = 2 φ ( 6 ) = 3 \varphi(6) = 3
具体的欧拉公式如下:
φ ( x ) = x ( 1 1 p 1 ) ( 1 1 p 2 ) ( 1 1 p 3 ) . . . ( 1 1 p i ) φ (x) = x(1 - \frac{1}{p_1})(1 - \frac{1}{p_2})(1 - \frac{1}{p_3})...(1 - \frac{1}{p_i}) 这里的 p i p_i 指的是 x x 的所有质因子(特别注意:每个因子在套用欧拉公式的个数为一个)。
举个例子: 12 = 2 2 3 12 = 2 * 2 * 3 ,那么转化为其欧拉公式则为:
y ( 12 ) = 12 ( 1 1 2 ) ( 1 1 3 ) y(12) = 12*(1 - \frac{1}{2})*(1 - \frac{1}{3})
之后我们再来介绍下欧拉定理及其推论:
欧拉定理:如果n和a是互素的正整数,则 a φ ( n ) 1 ( m o d      n ) a^{\varphi(n)}\equiv1(\mod\ n)
推论:如果n和a是互素的正整数,则 a φ ( n ) + 1 a ( m o d      n ) a^{\varphi(n)+1}\equiv a(\mod\ n)
准确的说欧拉定理在信息学最大的应用就是欧拉降幂
然后我们就可以开始讲欧拉降幂啦!下式就是欧拉降幂的公式:
A B m o d C A B m o d φ ( C ) + φ ( C ) m o d C A^B mod C ≡ A^{Bmodφ (C) + φ (C)}mod C 其中 φ ( C ) φ(C) 就是欧拉公式
那么,我们怎么用代码实现呢
答案是:欧拉公式 + + 快速幂,下面我们给出其模板代码:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

ll ouler(ll n)			//欧拉公式
{
    ll ans = n;
    ll a = n;
    for(int i=2;i*i<=n;i++)
    {
        if(a % i == 0)
        {
            ans = ans/i*(i - 1);
            while(a%i == 0)
                a /= i;
        }
    }
    if(a > i)
        ans = ans/a*(a - 1);
    return ans;
}

ll fast(ll a, ll b, ll mod)			//快速幂
{
    ll res = 1;
    while(b)
    {
        if(b & 1)
            res = (res * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    return res;
}

这里只是给出了简易的的欧拉降幂模板,具体是实践可以参考2019年icpc
南京网络赛的B题,如果你能知晓欧拉降幂,那么这题做起来将会非常简单。

猜你喜欢

转载自blog.csdn.net/qq_43704563/article/details/100427024