最大公约数与最小公倍数

最大公约数与最小公倍数,又分别被称为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次的位运算。

相关文章
相关标签/搜索