最大公约数

作者: dachengquan | 来源:发表于2020-08-04 18:16 被阅读0次

    最大公约数

    自然数d同时是a,b的约数,称d是a和b的公约数,d是a和b的公约数中最大的一个,d就是最大公约数,记作gcd(a,b)
    自然数m同时是a,b的倍数,称m是公倍数。m是所有公倍数中最小的数,那么m就是最小公倍数记作lcm(a,b)
    定理:\forall a,b \in \mathbb{N}都有gcd(a,b)*lcm(a,b) = a*b
    证明:d = gcd(a,b),lcm(a,b) = lcm(a/d,b/d)*d = a*b/d = a*b / gcd(a,b)
    更相减损术:
    \forall a,b \in \mathbb{N},a\geq bgcd(a,b)=gcd(a-b,b)=gcd(a,a-b)
    \forall a,b \in \mathbb{N},gcd(2a,2b) = 2gcd(a,b)
    证明:d是a,b的任意约数,那么d|a,d|b所以d|(a-b)所以这三个集合的公约数集合相等。
    欧几里得算法:
    \forall a,b \in \mathbb{N},b\neq 0,gcd(a,b) = gcd(b,a\mod b)
    证明:若a<b,gcd(a,b) = gcd(b,a)
    若a>=b,令a = qb+r其中0\leq r < b显然r是a \mod b。对于a,b任意公约数d。d|a,d|(q*b)所以d|(a-qb)因此d也是r的约数。
    更相减损法面对特殊数据会非常慢。
    更相减损法

    int gcd(int a,int b){
        if(a==0||b==0)return max(a,b);
        while(a!=b){
            if(a>b)a-=b;
            else b-=a;
        }
        return a;
    }
    

    欧几里得算法

    int gcd(int a,int b){
      return b?gcd(b,a%b):a;
    }
    

    相关文章

      网友评论

        本文标题:最大公约数

        本文链接:https://www.haomeiwen.com/subject/yaojrktx.html