學習筆記:逆元
阿新 • • 發佈:2021-02-13
如果 ax≡1 (mod p),那麼,x就是a的逆元,相互的,a也是x的逆元。那麼你逆元有什麼用呢?
首先我們需要知道,取餘運算對除法是不適用的,a/b % p ≠ (a%p / b%p) %p,如果我們要計算若干個數相乘起來除以某個數時,並不能像乘法那樣邊乘邊取餘,
所以我們可以將a/b%p轉化為 ab-1%p (b-1是指b在模p下的逆元,不是b的-1次方),這樣就可以邊乘邊取餘
逆元的求法:
方法一:尤拉函式
int power(int a,int b,int p)
{
int res=1%p;
while(b) { if(b&1) res=res*a%p; a=a*a%p; b>>= 1; }
return res;
}
int inverse(int a,int p)
{
int phi=a,aa=a;
for(int i=2;i<=aa/i;i++)
if(aa%i==0)
{
phi=phi/i*(i-1);
while(aa%i==0) aa/=i;
}
if(aa>1) phi=phi/aa*(aa-1);
return power(a,phi-1,p);
}
方法二:擴充套件歐幾里得
int exgcd(int a,int b,int &x,int &y)
{
if(b==0) { x=1; y= 0; return a; }
int g=exgcd(b,a%b,y,x);
y-=a/b*x;
return g;
}
int inverse(int a,int p)
{
int x,y;
int g=exgcd(a,p,x,y);
return g==1?(x%p+p)%p : -1; //x有可能是負數,轉化為正數
}