如果a,b兩數是整數,那麼一定存在整數x,y 使得
ax+by=bcd(a,b)
int
bcd(
int a,
int b)
這個演算法很好理解,如果實在看不懂,用筆紙帶入兩個數相信你能懂
代入數字加深理解:
求(50,35)
50=1*35+15 =>15=50-1*35
35=15*2+5 =>5=35-15*2
15=3*5+0
可得出5=3*35-2*50
下面推到擴充套件歐幾里得演算法
首先我們可知
bcd(a,b)=bcd(b,a%b)
即可的如下式子
xa+yb=bcd(a,b)=bcd(b,a%b)=x1b+y1(a%b)
又因為在計算機中
a%b=a-(a/b)*b
帶入上式中
xa+yb=x1b+y1(a-(a/b)*b)
化簡後得到
xa+yb=y1a+(x1-y1(a/b))b
我們可以得出
上一層深度的x=下一層深度的y1
上一層深度的y=下一層深度的(x1-y1(a/b))
而在最後一層 b=0時就返回x=1 , y=0
此時再根據
x=y1,y=(x1-y1(a/b))
求出上一層的x=0,y=1
再往上一層x=1,y=a/b*1
再在網上x=a/b*1,y=(1-a/b*1*a/b)
…一直到頂層遞迴結束
寫出演算法
int
ex_bcd
(int a,
int b,
int&x,
int&y)
int r =
ex_bcd
(b,a%b,x,y)
;int temp = y;
//把x和y 都換成上一層的
y=x-
y(a/b)
; x=temp;
return r;
}
首先必須是互質的兩數才能求逆元
通常說a是b模c的逆元也就是a*b=1 mod c
也就是a與b的乘積與c取模為1
例子求7 模 11 的逆元:
也就是求?與7的乘積mod 11為1
可知8x7=5x11+1
則逆元為8
求出的x的值就是逆元
擴充套件歐幾里得演算法
includeusing namespace std typedef struct nodenode node t node extend euclid int a,int b else extend euclid b,a b int tmp t.x t.x t.y t.y tmp a b t.y ...
擴充套件歐幾里得演算法筆記
在學習擴歐之前,我們首先要了解下面這兩個部分的知識。給定數 a,b 求 gcd a,b 也就是說,對於數 a,b gcd a,b gcd b,a b 對於歐幾里得演算法,也比較好用遞迴實現。c 如下 int gcd int a,int b 若 a,b 是整數,且 gcd a,b d 那麼對於任意的整...
歐幾里得演算法
歐幾里得演算法中,計算 x,y 的最大公約數的方法是輾轉相除,例如 26,15 26 15 1 11 15 11 1 4 11 4 2 3 4 3 1 1 3 1 3 0 可知,26,15 1 如果 x,y r,那麼有 ax by r,可以看出,上面的步驟實際上是可以直接得出 a,b 的 26 15...