数论 —— 最大公约数与最小公倍数
【概念】
1.公約數(shù):有 k 個非零整數(shù)?,若?,s.t.?,則稱 d 為??的公約數(shù)。
2.最大公約數(shù):公約數(shù)中最大的一個數(shù)稱為最大公約數(shù),記為:
注:
? ① 最大公約數(shù)一定是存在的,其最小值為 1。
? ② 當(dāng) GCD=1 時,則稱這些數(shù)是互質(zhì)的。
? ③ 公約數(shù)一定是最大公約數(shù)的約數(shù)。
3.公倍數(shù):有 k 個非零整數(shù)?,若?,s.t.?,則稱 d 為??的公倍數(shù)。
4.最小公倍數(shù):公倍數(shù)中最小的一個數(shù)稱為最小公倍數(shù),記為:
注:公倍數(shù)一定是最小公倍數(shù)的倍數(shù)。
【歐幾里德算法】
歐幾里德算法又稱為輾轉(zhuǎn)相除法,用于求兩個數(shù)的最大公約數(shù),其原理為:,即:
1.實現(xiàn)
int GCD(int x,int y){if(y==0)return x;elsereturn GCD(y,x%y); }2.二進制算法
1)原理
為提高效率,可將歐幾里德算法進行優(yōu)化,通過不斷去除因子 2 來降低常數(shù)。
- 當(dāng) 時,
- 當(dāng) x、y 均為偶數(shù)時,
- 當(dāng) x 為偶數(shù),y 為奇數(shù)時,
- 當(dāng) x 為奇數(shù),x 為偶數(shù)時,
2)實現(xiàn)
int GCD(int x,int y){if(x==0)return y;if(y==0)return x;int i,j;for(i=0;!(x&1);i++)//約去2x>>=1;for(j=0;!(y&1);j++)//約去2y>>=1;if(i>j)i=j;while(true){if(x<y){//若x<y,交換兩數(shù),保證大數(shù)在前x^=y;y^=x;x^=y;}if((x-=y)==0)//輾轉(zhuǎn)減return y<<i;while(!(x&1))//約去2x>>=1;} }【擴展歐幾里德算法】
擴展歐幾里德算法是在已知 x、y?時,求解一組 a、b,使得
1.過程分析
設(shè)
① 當(dāng) 時,,此時?
② 當(dāng) x>y>0 時
? ? ?設(shè) ,
? ? ?由于?
? ? ?故?
? ? ?即?
? ? ?因此?
? ? ?易得??
這樣就得到了求解 、?的方法:、 的值基于 、
由于 GCD?不斷的遞歸求解,因此一定會在某時?,結(jié)束遞歸,從而得出 a、b 的值。
注:?x-[x/y]*y 即為 mod 運算,[x/y] 代表取小于 x/y 的最大整數(shù)。
2.實現(xiàn)
int Extended_GCD(int x,int y,int &a,int &b){if(y==0){a=1;b=0;return x;}int gcd=Extended_GCD(b,a%b,y,x);b-=a*(x/y);return gcd; } int main(){//形如 ax+by=GCD(x,y)int x,y,a,b;cin>>x>>y;int gcd=Extended_GCD(x,y,a,b);cout<<"GCD="<<gcd<<endl;cout<<"a="<<a<<",b="<<b<<endl;return 0; }【最小公倍數(shù)】
定理:a、b 兩個數(shù)的最小公倍數(shù)乘以它們的最大公約數(shù)等于 a 和 b 本身的乘積。
即:
在求 LCM 時,如果將 LCM 寫成 a*b/GCD(a,b),a*b 可能會溢出,正確的方法應(yīng)該是先除后乘,即:a/GCD(a,b)*b
int GCD(int x,int y){return !y?x:GCD(y,x%y); } int LCM(int x,int y){return x/GCD(x,y)*y; }【例題】
同題:青蛙的約會(洛谷-P1516):點擊這里
總結(jié)
以上是生活随笔為你收集整理的数论 —— 最大公约数与最小公倍数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Command NetWork(POJ-
- 下一篇: Exploration(POJ-3618