逆元

总结自🍑

1. 引入:求 (a/b) %p ---》 “除以一个数再取模等同于乘以这个数的逆元再取模” // 这里b很大,暴力╮(╯-╰)╭

2. 求法:设 inv[b]是b的逆元,那么(a/b)%p = (a*inv[b])%p // 叫法是 一个数b在模p的条件下的逆元是多少

       一个数的逆元可能有若干个(>=0) ,但只需要求得一个数的最小正整数逆元即可。

       b关于p的逆元存在,当且仅当b和p互质(公约数只有1)。

1     已知x * a ≡ 1 (mod p)   将p连入式子=> x*a = 1 -b*p => x*a+b*p=1
2     那么我们就得到了一组新方程: x*a+b*p=1
3     若x 和 p不互质, 则 x和p 存在公约数 d=gcd(x,p)>1 , 
4     提取出d, 得到: d(x/d*a+p/d*b) = 1 
5     移项得到: (x/d * a+ p/d *b) = 1/d
6     易知x , p 能整除 d, 所以括号内定为整数, 
7     又因为d > 1 ,等式右边必为真分数, 等式无解
8                 证毕

3. 费马小定理:a^≡ (mod p -->  a^p - a ≡ 0 (mod p)  --> a( a ^ (p-1) - 1) ≡ 0 (mod p) -->  a ^ (p-1) - 1 ≡ 0 (mod p) --> a ^ (p-1) ≡ 1 (mod p//其实好像直接除过去就行

4. 求法

①蒙哥马利快速幂模: 只有p为质数时才可以用

首先由定义 inv[a] * a ≡ 1 (mod p);再根据费小推论得,inv[a] * a ≡ a ^ (p-1) (mod p);移项, inv[a] = a^(p-2) 

即最终得到 inv[a] ≡ a ^ (p-2) (mod p)

 1 inline ll quickpow(ll x, int p)
 2 {
 3     ll ans=1;
 4     while(p)
 5     {
 6         if(p&1) ans=(ans*x)%mod;
 7         x=(x*x)%mod;
 8         p>>=1;
 9     }
10     return ans;
11 }
12 inline inv(ll a)
13 {
14     inv_a=quickpow(a,mod-2);
15     return inv_a;
16 }

② 扩展欧几里得算法:

主要就是 ax+by=gcd(a,b) 因为a,b互质,所以gcd(a,b)=1。其他参照之前写的这篇🍓

5. tips:倒数:a * (1/a) = 1; 逆元: a * x = 1(mod p)  

posted @ 2019-07-20 21:45  XXrl  阅读(212)  评论(0编辑  收藏  举报