欧几里得与拓展欧几里得算法学习笔记
作者:互联网
欧几里得与拓展欧几里得
欧几里得算法
欧几里得算法是一种快速求出最大公约数的算法。
内容
对于任意的两个整数 \(a,b\),其最大公约数 \(\gcd(a,b) = \gcd(b,a \bmod b)\)。
证明
- 对于 \(b>a\) 的情况 ,显然成立。
- 因此只考虑 \(b<a\) 的情况。设 \(a=q \times b +p,\left( q=\left\lfloor\dfrac{a}{b}\right\rfloor,p=a-b \times\left\lfloor\dfrac{a}{b}\right\rfloor=a\bmod b \right)\)
- 对于 \(g_1=\gcd(a,b)\),显然存在 \(g_1\mid a,g_1\mid b\),由此易得 \(g_1\mid p\),其中\(\ g_1\mid a\) 表示 $a \bmod g_1 =0\ $。
- 又因为 \(p=a\bmod b\),所以对于 \(a,b\) 的最大公约数 \(g_1\),同样满足 \(g_1\mid a\bmod b,g_1\mid b\),即 \(b,a\bmod b\) 的最大公约数至少为 \(g_1\),即 \(\gcd(b,a \bmod b) > g1=\gcd(a,b)\)。
- 反过来,对于 \(b,a\bmod b\) 的最大公约数 \(g_2=\gcd(b,a\bmod b)\),同样满足 \(g_2 \mid a,g2 \mid b\),即 \(\gcd(a,b)>g2=\gcd(b,a \bmod b)\)。
- 因此 \(\gcd(a,b)=\gcd(b,a \bmod b)\) 证明成立。
代码实现
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int main(){
int a,b;cin>>a>>b;
cout<<gcd(a,b)<<endl;return 0;
}
拓展欧几里得算法
咕咕咕……
标签:gcd,int,bmod,mid,笔记,算法,最大公约数,欧几里得 来源: https://www.cnblogs.com/AIskeleton/p/16248753.html