求逆元


求 7 關於 26 的逆元!

擴展的歐幾里得算法

#include <stdio.h>
#include <stdlib.h>

//歐幾里得函數
void exgcd(int a, int b, int &x, int &y, int &d) {
        if (!b) {
                d = a, x = 1, y = 0;
        } else {
                exgcd(b, a % b, y, x, d);
                y -= x * (a / b);
        }
}
int inv(int t, int p) {                  //返回t對p的逆元
        int d, x, y;
        exgcd(t, p, x, y, d);
        return (x % p + p) % p;        //x可能為負,也可能過大
}

int main() {
        int m = 7, n = 26;
        printf("%d", inv(m, n));
        return 0 ;
}

或者

#include <stdio.h>
#include <stdlib.h>

int exgcd(int a,int b,int &x,int &y)//擴展歐幾里得算法 
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    int ret=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return ret;
}
int getInv(int a,int mod)//求a在mod下的逆元,不存在逆元返回-1 
{
    int x,y;
    int d=exgcd(a,mod,x,y);
    return d==1?(x%mod+mod)%mod:-1;
}
int main() {
        int m = 7, n = 26;
        printf("%d", getInv(m, n));
        return 0 ;
} 

手算  

方法1(輾轉相除法)

求7關於26的逆元,即 7 -1 

設 7-1 為 X,即7 * X = 1 mod 26 ,求 X 即可

26 / 7 = 3  余 5

7 / 5 = 1 余 2

5 / 2 = 2 余 1


則:

1 = 5 - 2 * 2

1 = 5 - 2 * (7 - 5 * 1) = 3 * 5 - 2 * 7

1 = 3 * (26 - 3 * 7) - 2 * 7=  3 * 26 - 11 * 7

故 7-1  = -11,由於 -11 不在Zq*中,故  7-1  = 26 - 11 = 15

方法2

參考:鏈接

原理:

首先對余數進行輾轉相除:
N = A * a0 + r0
A = r0 * a1 + r1
r0 = r1 * a2 + r2
r1 = r2 * a3 + r3

rn-2 = rn-1 * an + rn
rn-1 = rn * an+1 + 0

對上面的商數逆向排列(不含余數為0的商數):

其中:

b-1 = 1
b0 = an
bi = an-1 * bi-1 + bi-2
商個數為偶數,則bn即為所求的逆元B;
商個數為奇數,則N-bn即為所求的逆元B

求7關於26的逆元:

輾轉相除法:

26 = 3 * 7 + 5

7 = 1 * 5  + 2

5 = 2 * 2 + 1


因為商的個數為奇數,故 7-1 = 26 - 11 = 15

方法3(Bezout恆等式)

原理:用矩陣行初等變換的方法求Bezout,進而求逆元

參考:鏈接

求多項式的乘法逆元

原理:矩陣行初等變換的方法求Bezout,進而求逆元

Bezout恆等式

設a , b ∈ Z ,則a , b的最大公約數可以表示為:
g c d ( a , b ) = d = s a + t b

把d = s a + t b稱作Bezout恆等式

更多Bezout恆等式請參考:鏈接

矩陣的行初等變換求解Bezout恆等式

這里以一個具體的實例來說明,求g c d ( 5 , 177 ):

1、先把欲求的兩個數寫成如下的矩陣形式,即是以5和17為第一列,后面拼一個單位矩陣。

2、將上述矩陣行初等變換至5和17這兩個位置任意一個為0即可,另一個位置的值就是a和b的最大公約數。

3、得到Bezout恆等式,上述兩個*位置表示這個問題中,不需要關注那兩個位置的值
1 = 177 ∗ − 2 + 71 ∗ 5

4、如果最大公約數為1,則可以方便的看出其中一個元素的逆元。上式兩端同時模177
71 ∗ 5 ≡ 1 m o d 177

5、這樣就得到71和5在Z 177 中 的 逆 元,即5相對於177的逆元是71

求解G F ( 2 8)上的多項式乘法逆元

求通過不可約多項式x 8 + x 4 + x 3 + x + 1構造G F ( 2 8 )上( 09 ) H​在上的乘法逆元。

1.( 09 )H​轉換為多項式

( 09 ) H = 00001001 = x 3 + 1

2.求x 3 + 1在x 8 + x 4 + x 3 + x + 1上的逆元,構造矩陣

 

3.行初等變換至標准形式(注意合並多項式的時候系數是模2加法)

4.具體的變換步驟,這里就不詳細展開,但給出變換的順序

  • r 1 − x 5 r 2
  • r 1 − x 2 r 2
  • r 1 − x r 2
  • r 1 − r 2
  • r 2 − x r 1
  • r 1 − x 2 r 2

 

5.最后得到:

即:1 = x.m(x) + (x6 + x3 + x2 + x + 1).( x3 + 1)

6.顯然x 3 + 1的逆元為x 6 + x 3 + x 2 + x + 1 ,轉換為2進制表示01001111,16進制表示( 4 F ) H


免責聲明!

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



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