最大公因數

来自testwiki
125.59.109.254留言2025年3月9日 (日) 08:28的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到导航 跳转到搜索

Template:NoteTA 最大公因-{}-數Template:Lang-enTemplate:Lang)也稱最大公約-{}-數Template:Lang-enTemplate:Lang)是數學詞彙,指能够整除多個非零整數的最大正整数。例如8和12的最大公因数为4。

最大公因数的值至少為1,例如gcd(3,7)=1;最大則為該組整數中絕對值最小的絕對值,例如gcd(3,9)=3gcd(3,9)=3

求兩個整數最大公因數主要的方法:

兩個整數a,b的最大公因數和最小公倍數Template:Lang)的關係為:

gcd(a,b)lcm(a,b)=|ab|

兩個整數的最大公因數可用於計算兩數的最小公倍數,或分數化簡成最簡分數

兩個整數的最大公因數和最小公倍數中存在分配律

gcd(a,lcm(b,c))=lcm(gcd(a,b),gcd(a,c))
lcm(a,gcd(b,c))=gcd(lcm(a,b),lcm(a,c))

直角坐標中,兩頂點(0,0),(a,b)的線段會通過gcd(a,b)+1格子點

概述

例子

54和24的最大公因数是多少?

数字54可以表示為几组不同正整數的乘積:

54=1×54=2×27=3×18=6×9

故54的正因數為1,2,3,6,9,18,27,54

同樣地,24可以表示為:

24=1×24=2×12=3×8=4×6

故24的正因數為1,2,3,4,6,8,12,24

这两组数列中的共同元素即为54和24的公因数

1,2,3,6

其中的最大數6即為54和24的最大公因數,記為:

gcd(54,24)=6

互质数

如果两数的最大公因数为1,那么这两个数互質。例如,9和28就是互质数。

几何角度的说明

"瘦长的矩形区域,划分成了正方形的网格,宽两格、高五格。"
24乘60的矩形被十个12乘12的正方形格子完全覆盖,即12为24和60的最大公因数。推而广之,如果cab的最大公因数,那么ab的矩形就可以被若干个边长为c的正方形格子完全覆盖。

假设有一个大小为24乘60的矩形区域,这个区域可以按照不同的大小划分正方形网格:1乘1、2乘2、3乘3、4乘4、6乘6、12乘12。因此,12是24和60的最大公因数。大小为24乘60的矩形区域,可以按照12乘12的大小划分正方形网格,一边有两格(2412=2)、另一边有五格(6012=5)。

计算

质因数分解法

可以通过質因數分解来计算最大公因数。例如计算gcd(18,84),可以先进行质因数分解 18=2×3284=22×3×7,因为其中表达式2×3的「重合」,所以gcd(18,84)=6。实践中,这种方法只在数字比较小时才可行,因为对较大数进行质因数分解通常会耗费大量的时间。

再举一个用文氏图表示的例子,计算48和180的最大公因数。首先对这两个数进行质因数分解:

48=2×2×2×2×3
180=2×2×3×3×5

它们之中的共同元素是两个2和一个3:

File:Least common multiple.svg[1]
最小公倍数=2×2×(2×2×3)×3×5=720
最大公因数=2×2×3=12

辗转相除法

相比质因数分解法,辗转相除法的效率更高。

计算gcd(18,48)时,先将48除以18得到2、余数12,然后再将18除以12得到商1、余数6,再将12除以6得到商2、余数0,即得到最大公因数6。我们只关心每次除法的余数是否为0,为0即表示得到答案。这一算法更正式的描述是这样的:

gcd(a,0)=a
gcd(a,b)=gcd(b,amodb)

其中

amodb=abab

如果参数都大于0,那么该算法可以写成更简单的形式:

gcd(a,a)=a,
gcd(a,b)=gcd(ab,b) 如果 a > b
gcd(a,b)=gcd(a,ba) 如果 b > a
File:The Great Common Divisor of 62 and 36 is 2.ogv
使用辗转相除法计算62和36的最大公因数2的演示动画。

性质

  • 任意ab的公因数都是gcd(a,b)因數
  • gcd函数满足交换律gcd(a,b)=gcd(b,a)
  • gcd函数满足结合律gcd(a,gcd(b,c))=gcd(gcd(a,b),c)

程式代碼

以下使用輾轉相除法實現。

C#

private int GCD(int a, int b) {
	if(0 != b) while(0 != (a %= b) && 0 != (b %= a));
	return a + b;
}

C++

运行时计算实现:

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
}

C

int GCD(int a, int b) {
	if (b) while((a %= b) && (b %= a));
	return a + b;
}

Java

private int GCD(int a, int b) {
    if (b==0) return a; 
	return GCD(b, a % b);
}

JavaScript

const GCD = (a, b) => b ? GCD(b, a % b) : a;

Python

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)

政治用法

Template:Expand section Template:Seealso 最大公約數又指一社會中不同陣營勉強所達之共同利益。

参考文献

Template:Reflist

外部链接

参见