1. 程式人生 > 其它 >學習筆記:逆元

學習筆記:逆元

如果 ax≡1 (mod p),那麼,x就是a的逆元,相互的,a也是x的逆元。那麼你逆元有什麼用呢?
首先我們需要知道,取餘運算對除法是不適用的,a/b % p ≠ (a%p / b%p) %p,如果我們要計算若干個數相乘起來除以某個數時,並不能像乘法那樣邊乘邊取餘,
所以我們可以將a/b%p轉化為 a
b-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有可能是負數,轉化為正數 }