最大公约数(Greatest_Common_Divisor)
一、定義
如果有一個(gè)自然數(shù)a能被自然數(shù)b整除,則稱a為b的倍數(shù),b為a的約數(shù)。幾個(gè)自然數(shù)公有的約數(shù),叫做這幾個(gè)自然數(shù)的公約數(shù)。公約數(shù)中最大的一個(gè)公約數(shù),稱為這幾個(gè)自然數(shù)的最大公約數(shù)。
二、性質(zhì)
重要性質(zhì):
gcd(a,b)=gcd(b,a) (交換律)
gcd(-a,b)=gcd(a,b)
gcd(a,a)=|a|
gcd(a,0)=|a|
gcd(a,1)=1
gcd(a,b)=gcd(b, a mod b)
gcd(a,b)=gcd(b, a-b)
如果有附加的一個(gè)自然數(shù)m,
則: gcd(ma,mb)=m * gcd(a,b) (分配律)
gcd(a+mb ,b)=gcd(a,b)
如果m是a和b的最大公約數(shù),
則: gcd(a/m ,b/m)=gcd(a,b)/m
在乘法函數(shù)中有:
gcd(ab,m)=gcd(a,m) * gcd(b,m)
兩個(gè)整數(shù)的最大公約數(shù)主要有兩種尋找方法:
* 兩數(shù)各分解質(zhì)因數(shù),然后取出同樣有的質(zhì)因數(shù)乘起來(lái)
*輾轉(zhuǎn)相除法(擴(kuò)展版)
和最小公倍數(shù)(lcm)的關(guān)系:
gcd(a, b) * lcm(a, b) = ab
a與b有最大公約數(shù),
兩個(gè)整數(shù)的最大公因子可用于計(jì)算兩數(shù)的最小公倍數(shù),或分?jǐn)?shù)化簡(jiǎn)成最簡(jiǎn)分?jǐn)?shù)。
兩個(gè)整數(shù)的最大公因子和最小公倍數(shù)中存在分配律:
* gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))
* lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))
在坐標(biāo)里,將點(diǎn)(0, 0)和(a, b)連起來(lái),通過(guò)整數(shù)坐標(biāo)的點(diǎn)的數(shù)目(除了(0, 0)一點(diǎn)之外)就是gcd(a, b)。
三、求法
1、輾轉(zhuǎn)相除法(歐幾里德算法)
兩個(gè)數(shù)的最大公約數(shù)是指能同時(shí)整除它們的最大正整數(shù)。
設(shè)兩數(shù)為a、b(a≥b),求a和b最大公約數(shù)??的步驟如下:
(1)用a除以b(a≥b),得 a /b = q...r1(0<=r1) 。
(2)若 r1 =0 ,則(a,b)=b??;
(3)若 r1 !=0 ,則再用b除以??r1,得 b /r1= q...r2 (0<r2).
(4)若 r2=0 ,則 (a,b)=r1 ;若 r2!=0 ,則繼續(xù)用 r1 除以r2??,......,如此下去,直到能整除為止。
其最后一個(gè)余數(shù)為0的除數(shù)即為(a,b)的最大公約數(shù)。
算法描述
用輾轉(zhuǎn)相除法確定兩個(gè)正整數(shù) a 和 b(a≥b) 的最大公因數(shù) gcd(a,b) :
當(dāng) a mod b =0??時(shí),gcd(a,b) = gcd(b,a mod b)??;否則 gcd(a,b) = gcd(b, a mod b) 遞歸或循環(huán)運(yùn)算得出結(jié)果。
代碼:
C++版本一
int gcd(int a,int b) { // 約數(shù)和倍數(shù)不包含0,則遇到0情況則直接排除if(0==a||0==b)return 0;int t=a%b;while(t){a=b;b=t;t=a%b;}return b; }?C++版本二
int Gcd(int m, int n) //輾轉(zhuǎn)相除法,求最大公約數(shù) {return m == 0 ? n : Gcd(n % m, m); }int Lcm(int m, int n) //最小公倍數(shù) {return (m * n / Gcd(m, n)); }C++版本三
ll GCD(ll a,ll b){while(b^=a^=b^=a%=b);return a;}?
2、Stein算法
由J. Stein 1961年提出的Stein算法很好的解決了歐幾里德算法中的這個(gè)缺陷,Stein算法只有整數(shù)的移位和加減法,為了說(shuō)明Stein算法的正確性,首先必須注意到以下結(jié)論:
gcd(a,a)=a,也就是一個(gè)數(shù)和其自身的公約數(shù)仍是其自身。
gcd(ka,kb)=k gcd(a,b),也就是最大公約數(shù)運(yùn)算和倍乘運(yùn)算可以交換。特殊地,當(dāng)k=2時(shí),說(shuō)明兩個(gè)偶數(shù)的最大公約數(shù)必然能被2整除。
當(dāng)k與b互為質(zhì)數(shù),gcd(ka,b)=gcd(a,b),也就是約掉兩個(gè)數(shù)中只有其中一個(gè)含有的因子不影響最大公約數(shù)。特殊地,當(dāng)k=2時(shí),說(shuō)明計(jì)算一個(gè)偶數(shù)和一個(gè)奇數(shù)的最大公約數(shù)時(shí),可以先將偶數(shù)除以2
算法步驟
1、如果An=Bn,那么An(或Bn)*Cn是最大公約數(shù),算法結(jié)束
2、如果An=0,Bn是最大公約數(shù),算法結(jié)束
3、如果Bn=0,An是最大公約數(shù),算法結(jié)束
4、設(shè)置A1=A、B1=B和C1=1
5、如果An和Bn都是偶數(shù),則An+1=An/2,Bn+1=Bn/2,Cn+1=Cn*2(注意,乘2只要把整數(shù)左移一位即可,除2只要把整數(shù)右移一位即可)
6、如果An是偶數(shù),Bn不是偶數(shù),則An+1=An/2,Bn+1=Bn,Cn+1=Cn(很顯然啦,2不是奇數(shù)的約數(shù))
7、如果Bn是偶數(shù),An不是偶數(shù),則Bn+1=Bn/2,An+1=An,Cn+1=Cn(很顯然啦,2不是奇數(shù)的約數(shù))
8、如果An和Bn都不是偶數(shù),則An+1=|An-Bn|/2,Bn+1=min(An,Bn),Cn+1=Cn
9、n加1,轉(zhuǎn)1
代碼:
int gcd(int a ,int b) {if(a < b){//arrange so that a>bint temp = a;a = b;b=temp;}if(0 == b)//the base casereturn a;if(a % 2 == 0 && b % 2 == 0)//a and b are evenreturn 2 * gcd(a / 2, b / 2);if ( a % 2 == 0)// only a is evenreturn gcd(a / 2, b);if ( b % 2 == 0 )// only b is evenreturn gcd(a, b / 2);return gcd((a + b) / 2, (a -b ) / 2);// a and b are odd }?
3、分解質(zhì)因數(shù)
四、例題
http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?cid=3703&pid=9(題解:https://blog.csdn.net/weixin_43272781/article/details/82899925)
五、參考文章
https://blog.csdn.net/niushuai666/article/details/6607707
https://blog.csdn.net/C_acgl/article/details/82528192
https://blog.csdn.net/aime521/article/details/51891907
總結(jié)
以上是生活随笔為你收集整理的最大公约数(Greatest_Common_Divisor)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 唐纳德先生与假骰子
- 下一篇: 最小公倍数(Least_Common_M