又名:辗转相除法

1. 目的:

求两个数的最大公约数。

2. 定理

:::info 设欧几里得算法 - 图1是任意三个不全为0的整数,且欧几里得算法 - 图2,其中欧几里得算法 - 图3是整数,则欧几里得算法 - 图4. ::: 图解最大公约数.pdf

3. 证明:

已知两个数 ab ,假设他们的最大公约数是 d
d | a, d | b

证1. gcd(a, b) --> gcd(b, a % b)
即证 d | a, d | b ---> d | a % b
因为 a % b = a - a // b * bc = - a // b c一定是个整数
根据除法的性质 d | a, d | b ---> d | xa + yb 可得 d | a + cb
所以 d | a % b

证2. gcd(a, a % b) ---> gcd(a, b)
即证 d | a % b, d | b ----> d | a
因为 d | a % b <==> d | a + cb
又有 d | b ,可得 d | a + cb - cb
d | a
得证!!!

4. 模板

  1. public int gcd(int x, int y) {
  2. return y > 0 ? gcd(y, x%y) : x;
  3. }
  1. //优化,使用绝对最小剩余
  2. public int gcd(int a, int b) {
  3. if (b == 0) return a;
  4. int mod = a % b;
  5. if (mod > b / 2) mod = b - mod;
  6. return gcd(b, mod);
  7. }