逆元


求逆元的方法
一般ACM要求的模数都是质数,所以是存在逆元的
1、费马小定理

推导:

通过费马小定理

费马小定理: a^(n-1)==1(mod n)

a*a^(n-2)==1(mod n)

a/b==a/b*(b*b^(n-2)) (mod n)

a/b==a*b^(n-2) (mod n)

证明完毕



2、通过扩展欧几里德



推导过程其实也不难

先解释b==0的时候解,b==0时,gcd(a,0)==a,所以方程ax+by==gcd(a,b)的解就是x==1,y==0

然后过程推导

gcd(a1,b1)==gcd(b1,a1%b1)

a1x+b1y==gcd(a1,b1)==gcd(b1,a1%b1)==b1x+(a1%b1)y

我们将b1x+(a1%b1)y化简

b1x+(a1%b1)y==b1x+(a1-(a1/b1)*b1)y

所以我们得到等式

b1x+(a1-(a1/b1)*b1)y==a'x+b'y

我们通过守恒得出

a'==b1;

b'==a1-(a1/b1)*b1;

这就是我们要求的解了

ll extend_gcd(ll a,ll b,ll &x,ll &y)
{
    if(a == 0 && b == 0) return -1;
    if(b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    ll d = extend_gcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

ll mod_reverse(ll a, ll n)
{
    ll x,y;
    ll d = extend_gcd(a, n, x, y);
    if(d == 1) return (x % n + n) % n;
    else return -1;
}



你可能感兴趣的:(逆元)