数论_最大公约数 & 最小公倍数

最大公约数(gcd)

辗转相除法
算法核心: gcd(a,b) = gcd(b,a mod b)
证明:

公理
如果 \(a\) 能整除 \(k\),且 \(b\) 能整除 \(k\) ,那么 \(ax+by\) (x,y 是未知数) 也能整除 \(k\)

首先 \(a \mod b=a - \lfloor \frac{a}{b} \rfloor × b\)
因此 a 和 b 的公因数 就是 \(ax+by\) ,a ,b的三个数公因数;那必然是b 和 \(a \mod b=a - \lfloor \frac{a}{b} \rfloor × b\) 的公因数。
反之同理,证毕。

时间复杂度: \(O(\log_{2} n)\)
代码:

int gcd(int a,int b)
{
    int  c=a%b;
    while(c!=0)
    {
        a=b;
        b=c;
        c=a%b;
    }
    return b;
}

最小公倍数(lcm)

最小公倍数可以通过最大公约数求:最小公倍数 = 两数之和 / 最大公约数。
image

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

质数和约数

posted @ 2022-07-11 08:42  kingwzun  阅读(50)  评论(0编辑  收藏  举报