求逆元的3种方法

//扩展欧几里得求逆元
//a*x=1(mod m)=>a*x+m*y=1
int extgcd(int a,int b,int &x,int &y){
    int d=a;
    if(b!=0){
        d=extgcd(b,a%b,y,x);
        y-=(a/b)*x;
    }
    else {
        x=1;y=0;
    }
    return d;
}
int mod_inv(int a,int m){
    int x,y;
    extgcd(a,m,x,y);
    return (x%m+m)%m;
}
//模数是素数:用费马小定理:若m为素数,则x的逆元是x^(m-2)=>快速幂求解
//模数不是素数:欧拉定理:x的逆元是x^(f(x)-1),f(x)是x的欧拉函数值
int euler_0(int n){//求欧拉函数值
    int res=n;
    for(int i=2;i*i<=n;i++){
        if(n%2==0){
            res=res/i*(i-1);
            for(;n%i==0;n/=i);
        }
    }
    if(n!=1)res=res/n*(n-1);
    return res;
}
int euler[MAX_N];
void euler_1(){//筛出欧拉函数值的表
    for(int i=0;i

 

你可能感兴趣的:(求逆元的3种方法)