輾轉相除法(歐幾里得演算法)(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
- 輾轉相除法原理
- 輾轉相除法的原理
- 輾轉相除法原理解析
- 歐幾里得演算法與 EX演算法
- 萬能歐幾里得演算法演算法
- 輾轉相除法
- 除法與GCD演算法的相關分析GC演算法
- 擴充套件歐幾里得套件
- 類歐幾里得演算法學習筆記演算法筆記
- 演算法設計與分析-01歐幾里得演算法
- 淺談擴充套件歐幾里得演算法套件演算法
- 【演算法分析與設計】輾轉相除法演算法
- 證明:輾轉相除法與更相減損術
- 第六章 數學問題 -------- 6.5 歐幾里得演算法及其擴充套件演算法套件
- 輾轉相除法 氣泡排序排序
- 透徹理解輾轉相除法
- 擴充套件歐幾里得演算法公式快速推導套件演算法公式
- Python如何用歐幾里得求逆元Python
- C++中的輾轉相除法C++
- 【C語言】聊聊輾轉相除法C語言
- 28、(向量)歐幾里得距離計算
- 輾轉相除法與更相減損術(求最大公約數)
- 求最大公約數(輾轉相除法)
- 數論學習筆記 (4):擴充套件歐幾里得演算法筆記套件演算法
- 求最大公公約數(最大公因數)—— 歐幾里得演算法演算法
- CCF NOI 1028 判斷互質 :利用歐幾里得演算法最大公因數演算法
- 求最大公約數不同演算法的時間比較(輾轉相除法,更相減損術等)演算法
- 洛谷 P6362 平面歐幾里得最小生成樹
- 尤拉函式、整除分塊和擴充套件歐幾里得函式套件
- 歐幾里德的遊戲遊戲
- Spark/Scala實現推薦系統中的相似度演算法(歐幾里得距離、皮爾遜相關係數、餘弦相似度:附實現程式碼)Spark演算法
- 第六章 數學問題 -------- 6.7【擴充套件歐幾里得】一步之遙套件
- GCD 原理詳解GC
- 清除浮動的幾種方式及其原理
- 將帶標籤的點雲輸入並進行歐幾里得聚類處理(自定義點雲)聚類
- GCD原始碼原理分析GC原始碼