輾轉相除法(歐幾里得演算法)(gcd)模板及其原理
下面給出學長教的模板:
typedef long long ll;
ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
其計算原理依賴於以下定理:
定理:兩個整數的最大公約數等於其中較小的那個數(也就是除數)和兩數相除餘數的最大公約數。最大公約數(Greatest Common Divisor)縮寫為GCD。
對於程式碼的解釋:
以除數和餘數反覆做除法運算,當餘數為 0 時,取當前算式除數為最大公約數。這一操作可以利用遞迴實現。
以下是對上面定理的證明,摘自百度百科link:
證法一
a可以表示成a = kb + r(a,b,k,r皆為正整數,且r<b),則r = 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|(a-k*b),k是一個整數。
進而d|a.因此d也是a,b的公約數
因此(a,b)和(b,a mod b)的公約數是一樣的,其最大公約數也必然相等,得證。
證法二
假設c = gcd(a,b),則存在m,n,使a = mc, b = nc;
令r = a mod b,即存在k,使r = a-kb = mc - knc = (m-kn)c;
故gcd(b,a mod b) = gcd(b,r) = gcd(nc,(m-kn)c) = gcd(n,m-kn)c;
則c為b與a mod b的公約數;
假設d = gcd(n,m-kn), 則存在x,y, 使n = xd, m-kn = yd; 故m = yd+kn = yd+kxd = (y+kx)d;
故有a = mc = (y+kx)dc, b = nc = xdc; 可得 gcd(a,b) = gcd((y+kx)dc,xdc) = dc;
由於gcd(a,b) = c, 故d = 1;
即gcd(n,m-kn) = 1, 故可得gcd(b,a mod b) = c;
故得證gcd(a,b) = gcd(b,a mod b).
注意:兩種方法是有區別的。
相關文章
- 輾轉相除法原理
- 輾轉相除法的原理
- 輾轉相除法原理解析
- C++等差數列(數論、歐幾里得輾轉相除gcd)C++GC
- 除法與GCD演算法的相關分析GC演算法
- 【演算法分析與設計】輾轉相除法演算法
- 透徹理解輾轉相除法
- 輾轉相除法 氣泡排序排序
- 漫畫演算法:輾轉相除法是什麼鬼?演算法
- C++中的輾轉相除法C++
- 【C語言】聊聊輾轉相除法C語言
- 求最大公約數不同演算法的時間比較(輾轉相除法,更相減損術等)演算法
- python用輾轉相除法求最大公約數Python
- 輾轉相除法求最大公約數——[js練習]JS
- 歐幾里德演算法(又稱輾轉相除法)求最大公約數,以及最小公倍數演算法
- C語言第七篇:輾轉相除法求最大公約數C語言
- 歐幾里得演算法與擴充套件歐幾里得演算法演算法套件
- 萬能歐幾里得演算法演算法
- 歐幾里得演算法與 EX演算法
- 第六章 數學問題 -------- 6.5 歐幾里得演算法及其擴充套件演算法套件
- GCD 原理詳解GC
- GCD原始碼原理分析GC原始碼
- 演算法學習之路|歐幾里得遊戲演算法遊戲
- Web伺服器的工作原理及其相關協議Web伺服器協議
- 淺談擴充套件歐幾里得演算法套件演算法
- 類歐幾里得演算法學習筆記演算法筆記
- 演算法設計與分析-01歐幾里得演算法
- 最大公約數與歐幾里得演算法演算法
- 蟻群演算法原理及其實現(python)演算法Python
- 網路地址轉換NAT原理及其作用
- Web伺服器的工作原理及其相關協議-VeCloudWeb伺服器協議Cloud
- 【iOS】玩轉 - GCDiOSGC
- 非法探取密碼的原理及其防範 (轉)密碼
- 【演算法資料結構Java實現】歐幾里得演算法演算法資料結構Java
- 擴充套件歐幾里得演算法公式快速推導套件演算法公式
- _11_GCD相關-掛起/恢復GC
- Hash join演算法原理(轉)演算法
- 【模板】容斥原理