歐幾里得算法(代碼及證實過程)

歐幾里得算法(代碼及證實過程)

1、基礎知識

歐幾里得算法的原理是 GCD遞歸定理算法

GCD遞歸定理:.net

對任意 非負整數 a 和 任意 整數 bgcd(a,b) = gcd(b, a mod b)code

爲了證實這個定理,咱們首先須要知道一下幾個有關 gcd基本知識相關等式跟推論blog

1.1 基本知識:

  1. 公約數遞歸

    定義:若是 d|a(d 整除 a)且 d|b,那麼 d 是 a 與 b 的 公約數ip

    性質:若是 d|ad|b,那麼 d|(ax + by); x,y ∈ Z(任意整數)get

  2. 最大公約數博客

    定義:兩個非零整數 a 和 b 的公約數裏最大的就是 最大公約數it

1.2 相關等式跟推論:

  1. 等式 1:若是 a|b 且 b|a 那麼 a = ±b
  2. 等式 2:若是 d|a 且 d|b 那麼 d|(ax + by); x,y ∈ Z
  3. 等式 3: a mod n = a - n⌊a/n⌋(向下整除); a∈Z,n∈N*(正整數)
  4. 推論 1:對任意整數 a , b,若是 d|a 且 d|bd|gcd(a, b)

2、證實過程

若是咱們想要得到結論gcd(a,b) = gcd(b, a mod b)class

那麼咱們只須要證實gcd(a,b)|gcd(b, a mod b) 且 gcd(b,a mod b)|gcd(a,b)就能夠利用等式 1來證實他倆相等了。

2.1 證實 gcd(a,b)|gcd(b,a mod b)

d = gcd(a, b)

d|a 且 d|b

∵ 由 等式 3 可知:(a mod b) = a - qb q = ⌊a/b⌋

a mod b 是 a 與 b 的線性組合

∴ 由 等式 2 可知 :d|(a mod b)

d|b 且 d|(a mod b)

∴ 由 推論 1 可知 d|gcd(b, a mod b)

等價結論: gcd(a, b)|gcd(b, a mod b)

2.2 證實 gcd(b,a mod b)|gcd(a,b)

c = gcd(b, a mod b)

c|b 且 c|(a mod b)

a = qb + r

r = a mod b

q = ⌊a/b⌋

∴ a 是 b 和 (a mod b) 的線性組合

∴ 由 等式 2 可知:c|a

c|a 且 c|b

∴ 由 推論 1 可知:c|gcd(a, b)

等價結論: gcd(b, a mod b)|gcd(a, b)s

2.3 證實 gcd(a,b) = gcd(b, a mod b)

由 上述兩個結論 可知:

gcd(a, b)|gcd(b, a mod b)

gcd(b, a mod b)|gcd(a, b)

∴ 由 等式 1 可知:

gcd(a, b) = gcd(b, a mod b)

到這裏 GCD遞歸定理 就證實結束了

3、代碼

在這裏我放上幾個經常使用的獲取 兩個數字GCD的代碼:

  1. 遞歸:

    // 通常形式
    int gcd(int a, int b) {
        if(b == 0)
            return a;
        return gcd(b, a % b);
    }
    // 簡化形式
    int gcd(int a, int b) {
        return (b==0) ? a : gcd(b, a % b);
    }
  2. 非遞歸:

    int gcd(int a, int b) {
        int tmp;
        while(b != 0) {
            tmp = b;
            b = a % b;
            a = tmp;
        }
        return a;
    }
  3. 位運算:

    // 通常形式
    int gcd(int a, int b) {
        while(b) {
            a %= b;
            // 下面三行是交換 a 跟 b 的值
            b ^= a;
            a ^= b;
            b ^= a;
        }
        return a;
    }
    // 簡化版
    int gcd(int a,int b) {
        while(b^=a^=b^=a%=b);
        return a;
    }

4、參考資料

《算法導論 (第三版)》 -- 第31章 數論算法

GCD算法_Niteip's blog-CSDN博客_gcd 算法

相關文章
相關標籤/搜索