For faster navigation, this Iframe is preloading the Wikiwand page for 最大公因数.

最大公因数

最大公因数(英语:highest common factorhcf)也称最大公约数(英语:greatest common divisorgcd)是数学词汇,指能够整除多个非零整数的最大正整数。例如8和12的最大公因数为4。

整数序列的最大公因数可以记为

最大公因数的值至少为1,例如;最大则为该组整数中绝对值最小的绝对值,例如

求两个整数最大公约数主要的方法:

  • 列举法:分别列出两整数的所有约数,并找出最大的公约数。
  • 素因数分解:分别列出两数的素因数分解式,并计算共同项的乘积
  • 短除法:两数除以其共同素因数,直到两数互素时,所有除数的乘积即为最大公约数。

两个整数的最大公约数和最小公倍数lcm)的关系为:

两个整数的最大公约数可用于计算两数的最小公倍数,或分数化简成最简分数

两个整数的最大公约数和最小公倍数中存在分配律

直角坐标中,两顶点的线段会通过个格子点。

概述

例子

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

数字54可以表示为几组不同正整数的乘积:

故54的正约数为

同样地,24可以表示为:

故24的正约数为

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

其中的最大数6即为54和24的最大公约数,记为:

互素数

如果两数的最大公因数为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的大小划分正方形网格,一边有两格()、另一边有五格()。

计算

素因数分解法

可以通过素因数分解来计算最大公因数。例如计算,可以先进行素因数分解 ,因为其中表达式的“重合”,所以。实践中,这种方法只在数字比较小时才可行,因为对较大数进行素因数分解通常会耗费大量的时间。

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

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

[1]
最小公倍数
最大公因数

辗转相除法

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

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

其中

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

,
如果 a > b
如果 b > a
使用辗转相除法计算62和36的最大公因数2的演示动画。

性质

  • 任意ab的公因数都是约数
  • 函数满足交换律
  • 函数满足结合律

程式代码

以下使用辗转相除法实现。

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)

政治用法

此章节需要扩充。 (2020年8月30日)

最大公约数又指一社会中不同阵营勉强所达之共同利益。

参考文献

外部链接

参见

{{bottomLinkPreText}} {{bottomLinkText}}
最大公因数
Listen to this article

This browser is not supported by Wikiwand :(
Wikiwand requires a browser with modern capabilities in order to provide you with the best reading experience.
Please download and use one of the following browsers:

This article was just edited, click to reload
This article has been deleted on Wikipedia (Why?)

Back to homepage

Please click Add in the dialog above
Please click Allow in the top-left corner,
then click Install Now in the dialog
Please click Open in the download dialog,
then click Install
Please click the "Downloads" icon in the Safari toolbar, open the first download in the list,
then click Install
{{::$root.activation.text}}

Install Wikiwand

Install on Chrome Install on Firefox
Don't forget to rate us

Tell your friends about Wikiwand!

Gmail Facebook Twitter Link

Enjoying Wikiwand?

Tell your friends and spread the love:
Share on Gmail Share on Facebook Share on Twitter Share on Buffer

Our magic isn't perfect

You can help our automatic cover photo selection by reporting an unsuitable photo.

This photo is visually disturbing This photo is not a good choice

Thank you for helping!


Your input will affect cover photo selection, along with input from other users.

X

Get ready for Wikiwand 2.0 🎉! the new version arrives on September 1st! Don't want to wait?