DeepOps的算法小筆記-歐幾里德算法

引用網址 https://www.cnblogs.com/jason2003/p/9797750.html

這個說的挺易懂,如下是原文,留個筆記

我們把證明分爲兩步驟:
    1、證明gcd(a,b)是b,a%b的一個公約數
    2、證明這個公約數是最大的。
    
1、我們設gcd(a,b)=d,再令a=k1*d,b=k2*d.
     我們再設,a=k*b+c(也就是a除以b商k餘c),那麼c就是餘數,也就是a%b.
     講上面那個式子移項,得到c=a-k*b,然後再把a=k1*d,b=k2*d,這兩個式子裏的a、b帶入式子,得到:
     c=k1*d-k*k2*d,在提取公因數d,得到c=(k1-k*k2)*d.這樣就說明,c,也就是a%b有d這個約數,因爲開始我們設b也有d這個約數,所以gcd(a,b)是b,a%b的一個公約數。
     
2、現在知道了它是一個公約數,那麼怎麼證它是最大的?(其實感性分析,a%b都變小了,公約數不可能更大呀!)
  但是~~術~~  數學是一門嚴謹的學科,我們要嚴謹證明。我們知道,c(a%b)=(k1-k*k2)*d,b=k2*d,我們只需要證明k1-k*k2、k2互質就好了。
      這裏可以用到反證法:我們假設k1-k*k2=q*t,k2=p*t,並且t>1(也就是那兩個不互質)。
       我們將前面那個式子移項,得到k1=q*t+k*k2,再把這個k1代到最開始的a=k1*d,得到a=(q*t+k*k2)*d,再利用乘法分配律,得到:
   a=q*t*d+k*k2*d,我們這時發現,k2*d不就是最開始的b嗎?,將其帶入,得到:a=q*t*d+b*d.
     這時,我們再把k2=p*t代入開始的b=k2*d,得到b=p*t*d,再把這個式子代到a=q*t*d+b*d.得到了:a=q*t*d+p*t*d.提取公因數:a=(q+p)*t*d
   現在,再和b=p*t*d比較,發現他們的最大公因數變成了t*d和開始矛盾,所以假設不成立,反證成功!

過程圖可參考,還有動圖非常直觀

https://www.sohu.com/a/314655845_250298

歐幾里德算法計算過程:
a%b = c
b%c = d
c%d = e

g%h =0

h 即爲最大公約數

a和b的餘數 a %b
即 a%b = a - k * b
如果a%b (即c)可以被b整除,那麼,它肯定也可以被 a-c (即a-a%b )整除 ,如果不能整除則繼續

依次類推:
如果b%c (即 d)可以被c整除,那麼,它肯定也可以被 b-d (即b-b%c )整除 ,如果不能整除則繼續。

餘數爲0時即爲剛好整除。(至少mod1的時候可以是0)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章