最大公因數(英語:highest common factor,hcf)也稱最大公約數(英語:greatest common divisor,gcd)是數學詞彙,指能夠整除多個非零整數的最大正整數。例如8和12的最大公因數為4。
整數序列
的最大公因數可以記為
或
。
最大公因數的值至少為1,例如
;最大則為該組整數中絕對值最小的絕對值,例如
和
。
求兩個整數最大公因數主要的方法:
兩個整數
的最大公因數和最小公倍數(lcm)的關係為:
![{\displaystyle \gcd(a,b)\operatorname {lcm} (a,b)=|ab|}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ecc462228ff34b4f75ae28f4c42ca2c0e70d0ea7)
兩個整數的最大公因數可用於計算兩數的最小公倍數,或分數化簡成最簡分數。
兩個整數的最大公因數和最小公倍數中存在分配律:
![{\displaystyle \gcd(a,\operatorname {lcm} (b,c))=\operatorname {lcm} (\gcd(a,b),\gcd(a,c))}](https://wikimedia.org/api/rest_v1/media/math/render/svg/27cd22e7c6b308ab024b69fd0105be3d5ddd3bba)
![{\displaystyle \operatorname {lcm} (a,\gcd(b,c))=\gcd(\operatorname {lcm} (a,b),\operatorname {lcm} (a,c))}](https://wikimedia.org/api/rest_v1/media/math/render/svg/fb75682e70bc631268d12c42df478f4502d27641)
在直角坐標中,兩頂點為
的線段會通過
個格子點。
54和24的最大公因數是多少?
數字54可以表示為幾組不同正整數的乘積:
![{\displaystyle 54=1\times 54=2\times 27=3\times 18=6\times 9}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7050362bad3551aa7604857442eebde64bedf546)
故54的正因數為
。
同樣地,24可以表示為:
![{\displaystyle 24=1\times 24=2\times 12=3\times 8=4\times 6}](https://wikimedia.org/api/rest_v1/media/math/render/svg/edfb682995c997a758ab395c92d501db3790b8d3)
故24的正因數為
。
這兩組數列中的共同元素即為54和24的公因數:
![{\displaystyle 1,2,3,6}](https://wikimedia.org/api/rest_v1/media/math/render/svg/efa2ab3065cedf95711ea05a2fcae979cf365ba0)
其中的最大數6即為54和24的最大公因數,記為:
![{\displaystyle \gcd(54,24)=6}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b414ce7bb77272dd9775a601a1131539059adb8a)
如果兩數的最大公因數為1,那麼這兩個數互質。例如,9和28就是互質數。
24乘60的矩形被十個12乘12的正方形格子完全覆蓋,即12為24和60的最大公因數。推而廣之,如果c是a和b的最大公因數,那麼a乘b的矩形就可以被若干個邊長為c的正方形格子完全覆蓋。
假設有一個大小為24乘60的矩形區域,這個區域可以按照不同的大小劃分正方形網格:1乘1、2乘2、3乘3、4乘4、6乘6、12乘12。因此,12是24和60的最大公因數。大小為24乘60的矩形區域,可以按照12乘12的大小劃分正方形網格,一邊有兩格(
)、另一邊有五格(
)。
可以通過質因數分解來計算最大公因數。例如計算
,可以先進行質因數分解
和
,因為其中表達式
的「重合」,所以
。實踐中,這種方法只在數字比較小時才可行,因為對較大數進行質因數分解通常會耗費大量的時間。
再舉一個用文氏圖表示的例子,計算48和180的最大公因數。首先對這兩個數進行質因數分解:
![{\displaystyle 48=2\times 2\times 2\times 2\times 3}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ddbe49051aa06d767cd8706176483764c59d2b3c)
![{\displaystyle 180=2\times 2\times 3\times 3\times 5}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1fd136b3e4228ca19233bd8fcffdc9ccb3277517)
它們之中的共同元素是兩個2和一個3:
[1]
- 最小公倍數
![{\displaystyle =2\times 2\times (2\times 2\times 3)\times 3\times 5=720}](https://wikimedia.org/api/rest_v1/media/math/render/svg/baecd4db346ff27999c1b02ea792852b10b64c26)
- 最大公因數
![{\displaystyle =2\times 2\times 3=12}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5668b3f86d78b84bfff47343aed44a9ae04daee3)
相比質因數分解法,輾轉相除法的效率更高。
計算
時,先將48除以18得到商2、餘數12,然後再將18除以12得到商1、餘數6,再將12除以6得到商2、餘數0,即得到最大公因數6。我們只關心每次除法的餘數是否為0,為0即表示得到答案。這一算法更正式的描述是這樣的:
![{\displaystyle \gcd(a,0)=a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8f2e7dbf90c33d22cd4e0c8e1f1d088677b847d6)
![{\displaystyle \gcd(a,b)=\gcd(b,a\,\mathrm {mod} \,b)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/50dcf31162a0922f36a606e0b0a95b2744039b0a)
其中
![{\displaystyle a\,\mathrm {mod} \,b=a-b\left\lfloor {a \over b}\right\rfloor }](https://wikimedia.org/api/rest_v1/media/math/render/svg/538295524dc9f7fd979545c308690d11534d6320)
如果參數都大於0,那麼該算法可以寫成更簡單的形式:
,
如果 a > b
如果 b > a
使用輾轉相除法計算62和36的最大公因數2的演示動畫。
- 任意a和b的公因數都是
的因數。
函數滿足交換律:
。
函數滿足結合律:![{\displaystyle \gcd(a,\gcd(b,c))=\gcd(\gcd(a,b),c)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/baa1dee1cbd17053fa3ed7b519f7c0e66c985212)
以下使用輾轉相除法實現。
private int GCD(int a, int b) {
if(0 != b) while(0 != (a %= b) && 0 != (b %= a));
return a + b;
}
運行時計算實現:
template<typename T>
T GCD(T a, T b) {
if(b) while((a %= b) && (b %= a));
return a + b;
}
編譯時計算實現:
#include <iostream>
#include <type_traits>
template<typename T, std::enable_if_t<std::is_integral<T>::value, T> a, std::enable_if_t<std::is_integral<T>::value, T> b>
struct HCF{
public:
static const T value=HCF<T, (a>b? b: a), (a>b? a%b: b%a)>::value;
};
template<typename T, std::enable_if_t<std::is_integral<T>::value, T> a>
struct HCF<T, a, 0>{
public:
static const T value=a;
};
int main(){
std::wcout<<HCF<int, 12, 64>::value<<std::endl;//Output: 4
}
int GCD(int a, int b) {
if (b) while((a %= b) && (b %= a));
return a + b;
}
private int GCD(int a, int b) {
if (b==0) return a;
return GCD(b, a % b);
}
const GCD = (a, b) => b ? GCD(b, a % b) : a;
GCD = lambda a, b: (a if b == 0 else GCD(b, a % b))
# or
def GCD(a, b):
if b == 0:
return a
return GCD(b, a % b)
最大公約數又指一社會中不同陣營勉強所達之共同利益。