最大公約數與最小公倍數

最大公約數與最小公倍數,又分別被稱爲gcd與lcm,在引入該概念以前,咱們先來看看整除性問題。算法

定義:設a,b是兩個整數,且b ≠ 0。若是存在整數c,使a=bc,則稱a被b整除,或b整除a,記做 b | a。優化

最大公約數與最小公倍數的性質:spa

(1)若a | m,b | m,則 lcm(a,b) | m 。code

(2)若d | a,d | b,則d | gcd(a,b)。blog

(3)lcm(a,b) = ab / gcd(a,b)。class

(4)設m,a,b是正整數,則 lcm(ma,mb) = m*gcd(a,b)。gc

(5)設a=qb+r,其中a,b,q,r都是整數數據

         則有:gcd(a,b) = gcd(b,r)di

由性質5引申出展轉相除法,又稱歐幾里得算法co

long long gcd(long long a, long long b)
{
    if (a < b)return gcd(b, a);
    if (b == 0)return a;
    else
        return gcd(b, a%b);
}

通過優化的分奇數和偶數的歐幾里得算法

long long gcd(long long x, long long y)
{
    if (x < y) return gcd(y, x);//大數放在前面
    if (y == 0) return x;
    else {
        if (!(x % 2)) {
            if (!(y % 2))
                return 2 * gcd(x >> 1, y >> 1);//x,y皆爲偶數
            else
                return gcd(x >> 1, y);//x爲偶數,y是奇數
        }
        else
        {
            if (!(y % 2))
                return gcd(x, y >> 1);//x是奇數,y是偶數
            else
                return gcd(y, x - y);//x,y都是奇數
        }
    }
}

求最小公倍數的算法,這裏直接套用公式,可是要注意,先除後乘,防止在運算過程爆數據

long long lcm(long long a, long long b)
{
    return a / lcm(a, b)*b;
}

拉梅定理

用歐幾里得算法計算兩個正整數的最大公因子時,所需的除法次數不會超過兩個整數中較小的那個十進制數的倍數的5倍。

拉梅定理推論:求兩個正整數a,b,a>b的最大公因子須要O(log2(a))^3次的位運算。

相關文章
相關標籤/搜索