欧拉定理以及欧拉降幂

版权声明:原创文章如需转载请注明出处 https://blog.csdn.net/holly_Z_P_F/article/details/86696699

大数幂运算   指数太大的时候  我们需要进行降幂操作

首先呢 认识欧拉定理之前 先了解一下欧拉函数      链接     欧拉函数

欧拉定理

我们将欧拉函数写作  \varphi (n)  

欧拉定理就是  a n为正整数 且 a  n  互质   那么 a^{\varphi (n)}\equiv 1 (mod  n)

那么根据欧拉定理的式子  我们可以转化为  a^{\varphi (n)}%n%n \equiv 1  

那么既然 a^{\varphi (n)}%n在mod n的情况下  恒等于 1  

那么就得到了我们用来降幂的公式     a^{b}=a^{b \% \varphi (n)}(mod n)

扩展欧拉定理

扩展呢就是把互质推广到所有情况嘛
如果欧拉定理中的 a n不互质了  则有如下公式

a^{b}\equiv \left\{\begin{matrix} a^{b}(\mod n) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ b< \varphi (n)\\ \\a^{b\%\varphi (n)+\varphi (n)}(\mod n ) \ \ \ \ \ b\geq \varphi (n) \end{matrix}\right.

降幂

如果a n互质  我们就根据欧拉定理降幂

                 a^{b}=a^{b \% \varphi (n)}(mod n)

如果不互质   我们就根据扩展欧拉定理降幂

                  我们在求 a^{b} % n  的时候 可以通过判断\varphi (n)  来转成上面的两个式子之一

就完成降幂了

练习题目的话

牛客寒假算法基础集训营4 E题

代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
const int mod=1e9+7;
char a[maxn],b[maxn];
ll pow_mod(ll x,ll n){
    ll ans=1;
    x=x%mod;
    while(n!=0){
        if(n&1)
            ans=ans*x%mod;
        n>>=1;
        x=x*x%mod;
    }
    return ans;
}
int main(){
    //先通过欧拉函数 计算出mod 的欧拉函数是 1000000006 也就是mod-1
    scanf("%s%s",a,b);
    int l=strlen(a);
    ll n=0;
    for(int i=0;i<l;i++){
        n=(n*10+a[i]-'0')%(mod-1);//所以这里使用 mod-1 降幂
    }
    printf("%lld\n",pow_mod(2,n));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/holly_Z_P_F/article/details/86696699