求 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 ; }
求7關於26的逆元,即 7 -1 函數
設 7-1 爲 X,即7 * X = 1 mod 26 ,求 X 便可spa
26 / 7 = 3 餘 5.net
7 / 5 = 1 餘 2blog
5 / 2 = 2 餘 1get
則:io
1 = 5 - 2 * 2class
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
參考:連接
原理:
首先對餘數進行展轉相除:
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