1. 程式人生 > >總結——數論:歐幾裏得算法&擴展歐幾裏得證明

總結——數論:歐幾裏得算法&擴展歐幾裏得證明

除法 pla splay 進一步 遞歸 計算 只需要 討論 -128

一 歐幾裏得輾轉相除法算法

  設a=qb+r,其中a,b,q,r都是整數,則gcd(a,b)=gcd(b,r),又因 r = a mod b,所以 gcd(a,b)=gcd(b,a mod b)

  證明:①證明充分性。

    設 d 為 a,b 的公約數,記作 d|a , d|b ,即a和b都可以被d整除

    又因 r=a-kb , 兩邊同時除以d,r/d=a/d-kb/d=m,由等式右邊可知m為整數, d|r , 即 d 是 (b,a mod b)的公約數,

    ②證明必要性

    設 d 為 b, a mod b 的公約數,則 d|b , d|r

    又因 a=r+kb ,所以 d 為 a 的因子,即 d|a ,因此 d 是 a,b 的公約數。

    綜上,(a,b) 和 (b,a mod b) 的公約數一樣,其最大公約數必然相等。

二 擴展歐幾裏得算法

  如果 gcd(a,b)=d , 那麽一定存在整數 x,y 滿足 ax+by=d.

  個人並未在網上搜到關於如上定理的嚴格證明,大多的關註點是求 x,y 的值。註意因為這是一個不定方程,所以解不只有一組。如果大家有相關證明可以留言討論。x,y 值的求解:

    設存在 ax+by=gcd(a,b)

    根據歐幾裏得定理 gcd(a,b)=gcd( b,a mod b) ,

    可得 ax+by = gcd(a,b) = gcd(b,a mod b) = bx+(a mod b)y′ = bx+(a?b?[a/b])y′ = ay‘ +b(x‘ - [a/b]y‘)

,

    由恒等定理可知,x=y‘             y=x‘ - [a/b] y‘

  可以看到,x,y 的值由 x‘,y‘ 得出。而 x‘,y‘ 又如何得到?

  重新來看看我們得到的兩個等式。x 和 y 是 gcd(a,b)=ax+by 的解,而 x’ 和 y’ 是在對 gcd(a,b) 按歐幾裏德算法進行一步後的結果對應的貝祖等式 gcd(b,a mod b)=bx+(a mod b)y的解。也就是說,gcd(a,b) 對應的貝祖等式的解 x,y 可以由 gcd(b,a mod b) 對應等式的解x’,y’計算得出。

  由於歐幾裏德算法最後一步為 gcd(d,0)=d,

此時對應等式存在解 x=1,y=0, 因此只要如上述代碼,從 gcd(d,0) 往前處理,在進行歐幾裏德算法的遞歸的時候根據相鄰兩次調用間 x,y 和 x’,y’ 的關系計算即可求出 ax+by=gcd(a,b) 的解。

  更進一步,對於任意不定式ax+by=c,只需要在等式ax+by=gcd(a,b)=d兩邊乘上c/d即可得到解為x=x?c/d,y=y?c/d

總結——數論:歐幾裏得算法&擴展歐幾裏得證明