1. 程式人生 > >【初等數論】逆元

【初等數論】逆元

逆元定義先擺上來

對於正整數a和m,如果a*x≡1(mod m),那麼把這個同餘方程中x的最小正整數解叫做a模m的逆元。

 

求解方法:

1.擴充套件歐幾里得

利用歐幾里得求x

先將方程轉化為

ax-my=1

此時求解x和y

最後利用返回的gcd(a,m)==1

如果成立,則x為逆元存在,否則不存在

 

注意最後的x要取一下模(x+m)%m

 

void extgcd(long long a,long long b,long long& x,long long& y){
    if(!b){ x=1; y=0;return
a;} else{ int t=extgcd(b,a%b,y,x); y-=x*(a/b);return t;} } long long inverse(long long a,long long b) { long long x,y; return extgcd(a,b,x,y)==1?(x+b)%b:-1; }

 

2.費馬小定理

p為素數

a(p-1)=1(mod p) 

即a*a(p-2)=1(mod p)

也就是說,a(p-2)為a的逆元

 

這裡要用到快速冪模運算求a(p-2)

一般來說在模意義下,進行快速冪模運算

當模p不是素數的時候需要用到尤拉定理

a^phi(p)≡1               (mod p) a*a^(phi(p)-1)≡1      (mod p) a^(-1)≡a^(phi(p)-1)  (mod p) ->a^(phi(p)-1) (回頭再補上尤拉的公式》?