乘法逆元詳解


 

定義

乘法逆元的定義:若存在正整數a,b,p, 滿足ab = 1(mod p), 則稱a 是b 的乘法逆元, 或稱b 是a 的乘法逆元。b ≡ a-1 (mod p),a ≡ b-1 (mod p)

比如說, 在模7 意義下,3 的乘法逆元是5, 也可以說模7 意義下5的乘法逆元是3。模13意義下5的逆元是8……

存在性

看起來和同余方程很相似(其實下面真的可以用exgcd求的!),在同余方程中

ab ≡ 1(mod p)

若a 與p 互質, 則一定存在一個正整數解b, 滿足b < p,若a 與p 不互質, 則一定不存在正整數解b.

所以逆元要求a與p互質

求法

求逆元有三種求法,

1、擴展歐幾里得

可以用擴展歐幾里得求,那么是怎么個求法呢?

擴展歐幾里得是用來求這樣的一組解的:ax+by = gcd(a,b),求x和y,(求出x后自然知道了y,所以算是求一個x)。

逆元呢是求這樣的一個解:ax ≡ 1 (mod b),(為了方便理解,改了一下變量名),求x,貌似並沒有一點點相似處,那么我們變一下,

ax+by = gcd(a,b),變成 ax+by = c;

ax ≡ 1 (mod b),變成 ax-by = 1;如果將y看成負的,ax+by = 1;

完全一樣嘛,所以直接套用擴展歐幾里得求就好了。

代碼

 1 #include<cstdio>
 2 
 3 int exgcd(int a,int b,int &x,int &y)
 4 {
 5     if (b==0)
 6     {
 7         x = 1;
 8         y = 0;
 9         return a;
10     }
11     int r = exgcd(b,a%b,x,y);
12     int tmp = x;
13     x = y;
14     y = tmp-a/b*y;
15     return r;
16 }
17 
18 int main()
19 {
20     //gcd(a,p)==1
21     int a,p,r,x,y;
22     while (scanf("%d%d",&a,&p)!=EOF)
23     {
24         r = exgcd(a,p,x,y);
25         printf("%d",(x%p+p)%p);
26     }
27     return 0;
28 }
擴展歐幾里得求逆元

2、線性求逆元

先糾正一下變量名,再改回來ab ≡ 1(mod p),求b

p%a = p-(p/a)*a;  在c++中/為整除。

(p/a)*a = p-(p%a);  換下位置

(p/a)*a = -(p%a);  在模p意義下p可以約掉,可以沒有這一步

a = -(p%a)/(p/a);  再換一下位置

a-1 = -(p%a)-1*(p/a);

所以a-1可以用(p%a)-1推出,所以就可以用遞推式來推出1到a的所有數的逆元。

代碼

1 int inv[MAXN]; 
2 void INV(int a,int p)//線性求到a的逆元 
3 {
4     inv[1] = 1;
5     for (int i=2; i<=a; ++i)
6         inv[i] = (-(p/i))*inv[p%i]%p; 
7 }
線性求逆元1

下面的代碼只求一個值的逆元,運用的是上面的式子

1 int INV(int a)//線性求a的逆元 
2 {
3     if (a==1) return 1;
4     return ((-(p/a)*INV(p%a))%p);
5 }
線性求逆元2

3、歐拉定理求逆元

歐拉定理:aφ(p) ≡ 1(mod p)

對於任意互質的a,p 恆成立。

歐拉定理用來求逆元用的是歐拉定理的一個推論:
a*aφ(p)-1 ≡ 1(mod p

仔細觀察,a*b ≡ 1(mod p),在這里的b不就是上面的aφ(p)-1嗎?,所以求出aφ(p)-1就好了。

所以我們用快速冪就可以求出乘法逆元了。

這個方法它需要多算一個歐拉函數,代碼這里不再給出。

補充:其實如果p是質數的話,可以用費馬小定理,與歐拉定理是完全一樣的,費馬小定理在p不是質數時,則只能用歐拉定理。

怎么弄呢?費馬小定理 a(p-1) ≡ 1(mod p) p是質數,且a,p互質,

然后將上面的式子變一下,a*a(p-2) ≡ 1(mod p) ,

再變一下,a(p-2) ≡ a-1 (mod p) ,然后求出a(p-2)就可以了。

然后再看一下歐拉定理,如果p是質數,φ(p) = p-1,那么我們求aφ(p)-1,也就是求a(p-2)。和費馬小定理是一樣的。

應用

我們知道(a+b)%p = (a%p+b%p)%p

    (a*b)%p = (a%p)*(b%p)%p

求(a/b)%p時,可能會因為a是一個很大的數,不能直接算出來,也無法像上面一樣分解。

我們可以通過求b關於p的乘法逆元k,k ≡ b-1 (mod p) ,將a乘上k再模p,即(a*k) mod p。其結果與(a/b) mod p等價。

然后這就成了求a*k%p,然后就可以用那兩個公式了。

個人理解

對於個人的理解逆元,逆元是在運算除時,可以變成乘,方便計算,像上面一樣,a/b(mod p)就可以變成a*b-1,這也就是逆元的本質,必須要在的意義下才有效。

運算a/b時,我們除以b就相當於乘以1/b,這是個分數,不利於計算,所以我們就找到了一個整數,b的逆元,比如計算12/3(mod 7),這是個除法,所以我們可以這樣12*(1/3),雖然是乘法了,但是有分數,所以找一個整數使得x,3x≡1(mod 7),x=5,即模7意義下3的逆元是5,然后我們乘以這個逆元,12*5 = 60,60 mod 7 = 4,誒,12/3 = 4,相等啊,這就是上面所說的性質,

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM