擴充套件歐幾里得演算法分析詳細

2021-10-03 15:05:23 字數 1389 閱讀 6714

如果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...