到国庆假期都是复习阶段。。所以把一些东西整理重温一下。
gcd(a,p)=1,ax≡1(%p),则x为a的逆元。注意前提:gcd(a,p)=1;
方法一:拓展欧几里得
gcd(a,p)=1,ax≡1(%p),转化为ax+py≡1,拓展欧几里得可解决ax+by=gcd(a,b)
1 void exgcd(int a,int b,int &x,int &y)
2 {
3 if(b==0) {
4 x=1,y=0;
5 return a;
6 }
7 int g=exgcd(b,a%b,x,y);
8 int t=x;x=y;y=t-(a/b)*y;
9 return g;
10 }
方法二:费马小定理
a^(p-1)≡1(%p),则a^(p-2)就是逆元。快速幂。
求逆元的O(n)算法
inv[i]=((mod-mod/i))*inv[mod%i]%mod;
转自https://blog.csdn.net/acdreamers/article/details/8220787,侵删
它的推导过程如下,设,那么
对上式两边同时除,进一步得到
再把和替换掉,最终得到
初始化,这样就可以通过递推法求出模奇素数的所有逆元了。