1.公式
gcd(a,b) = gcd(b,a mod b)
2.粗略证明
a为较大的数,b为较小的数
a mod b = a - ⌊ a / b ⌋ * b = a - c * b
设gcd(a,b)=d ,所以a%d=0,b%d=0
那么 (a+b)%d=0,(ax+by)%d=0,即(a的若干倍+b的若干倍)%d=0。
所以 (a-c*b)%d=0,即(a mob b) % d=0
那么a ,b,a mod b的最大公约数一样,都为d。所以可以将求a和b的最大公约数转化为求b和a mob b的最大公约数,简化了计算。
3.代码
#include <iostream> using namespace std; int g(int a, int b) { if (b == 0) return a; return g(b, a % b); } int main() { int a = 98, b = 64; cout << g(a, b);//输出2 }
4.证明
欧几里德算法又称辗转相除法:用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
证明:a可以表示成a = kb + r,则r = a mod b
1)假设d是a,b的一个公约数,则有:d|a, d|b,而r = a - kb,因此d|r,
因此d是(b,a mod b)的公约数
2)假设d 是(b,a mod b)的公约数,则d | b , d|r ,但是a = kb +r
因此d也是(a,b)的公约数,因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
若b|a, 我们说b是a的一个因子; gcd(a,b)表示a,b的最大公因子。