程序员算法

最大公约数

2020-08-04  本文已影响0人  dachengquan

最大公约数

自然数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;
}
上一篇 下一篇

猜你喜欢

热点阅读