擴充套件歐幾里德

2022-09-18 00:06:14 字數 1382 閱讀 7188

擴充套件歐幾里德通常用於求出二元一次方程的解,類似a*x+b*y=c(a,b均不為0)的方程,a,b,c都是整數,x、y的整數解。

1 判斷是否有解

整數二元一次不定方程有解的充分必要是gcd(a,b)|c。如果不能整除則無解。

2 擴充套件歐幾里德求特解

歐幾里德給出了計算a*x+b*y=gcd(a,b)的解法。

之前寫的太複雜自己都快看不懂了,刪了重寫一遍,看了一下知乎裡的證明,鏈結感覺很簡潔,斗膽拿來用一下。

對於不完全為 0 的非負整數 a,b,gcd(a,b)表示 a,b 的最大公約數,必然存在整數對 x,y ,使得

a*x+b*y = gcd(a , b); ①

根據歐幾里德原理

gcd(a , b) = gcd(b , a mod b)

將gcd(b,a mod b)表達為①式的形式,即

a*x+b*y = gcd(a , b)

= gcd(b , a mod b)

= b * x1 + (a mod b) * y1

= b * x1 + (a - a / b * b) * y1 即

a*x+b*y = b * x1 + (a - a / b * b) * y1

化簡上式,得

a*x+b*y = a*y1 - b*a/b*y1 + b*x1 , 即

a* x +b* y

=a* y1 +b* (x1-a/b*y1)

所以x=y1

y=x1 - a/b*y1

於是我們得到了這樣一段**

1

void exgcd(int a, int b, int &d, int &x ,int &y)210

intx1,y1;

11 exgcd( b , a %b , d , x1 , y1 );

12 x =y1;

13 y = x1 - ( a / b ) *y1;

14return

;15 }

再簡化一下可以得到

1

//ax+by=gcd(a,b),d為最後求出的gcd(a,b)

2void ex_gcd(ll a,ll b,ll &x,ll &y,ll &d)

9 ex_gcd(b,a%b,y,x,d);

10 y=y-a/b*x;

11 }

上面**中,通過交換x,y的位置,原本y1的位置變成x,x1的位置變成y相當於執行了x=y1,y=x1,因為y = x1 - ( a / b ) * y1,所以還需要y-=a/b*x。

擴充套件歐幾里德演算法

擴充套件歐幾里德演算法已經搞了好幾天了,今天終於看明白,小做總結。講擴充套件歐幾里得演算法之前,先講歐幾里得演算法和貝祖定理。歐幾里得演算法 歐幾里得演算法就是輾轉相除法,即gcd a,b gcd b,a b 簡單證明一下 r gcd a,b a nr,b mr。a b n n m m r。因為gc...

仿射密碼與擴充套件歐幾里德變換

仿射密碼簡介 仿射密碼和移位密碼一樣,也是一種替換密碼.不同的是,移位密碼中,我們使用的是模n加 而在下面的仿射密碼中,我們使用的上一節中介紹的模n乘.在安全性方面,仿射密碼同移位密碼一樣,都是極其差的,不僅因為他們的原理簡單,更要命的是這兩種替換密碼沒有隱藏明文的字頻資訊,這很容易導致破解者輕易的...

歐幾里德演算法

歐幾里德演算法稱為輾轉相除法,用來求已知m n兩個自然數的公因數。結合程式說明一下輾轉相除的具體情況。首先看遞迴實現 1 int getcd int m,intn 2 6if m if m n 1316 else 1720 主要計算過程分為三個步驟 1 對輸入的兩個自然數m n取餘數r,使得0 r ...