最大公因數

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP








最大公因數英语:highest common factorhcf)也稱最大公約數英语:greatest common divisorgcd)是數學詞彙,指能够整除多個整數的最大正整数。而多個整数不能都为零。例如8和12的最大公因数为4。


整数序列adisplaystyle aa的最大公因数可以記為(a1,a2,…,an)displaystyle (a_1,a_2,dots ,a_n)displaystyle (a_1,a_2,dots ,a_n)gcd(a1,a2,…,an)displaystyle gcd(a_1,a_2,dots ,a_n)displaystyle gcd(a_1,a_2,dots ,a_n)


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



  • 窮舉法:分別列出兩整數的所有因數,並找出最大的公因數。


  • 質因數分解:分別列出兩數的質因數分解式,並計算共同項的乘積。


  • 短除法:兩數除以其共同質因數,直到兩數互質時,所有除數的乘積即為最大公因數。


  • 輾轉相除法:兩數相除,取餘數重複進行相除,直到餘數為0displaystyle 0displaystyle 0時,前一個除數即為最大公因數。

兩個整數a,bdisplaystyle a,ba, b的最大公因數和最小公倍數(lcm)的關係為:


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

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


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


gcd(a,lcm⁡(b,c))=lcm⁡(gcd(a,b),gcd(a,c))displaystyle gcd(a,operatorname lcm (b,c))=operatorname lcm (gcd(a,b),gcd(a,c))displaystyle gcd(a,operatorname lcm (b,c))=operatorname lcm (gcd(a,b),gcd(a,c))

lcm⁡(a,gcd(b,c))=gcd(lcm⁡(a,b),lcm⁡(a,c))displaystyle operatorname lcm (a,gcd(b,c))=gcd(operatorname lcm (a,b),operatorname lcm (a,c))displaystyle operatorname lcm (a,gcd(b,c))=gcd(operatorname lcm (a,b),operatorname lcm (a,c))

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




目录





  • 1 概述

    • 1.1 例子


    • 1.2 互质数


    • 1.3 几何角度的说明



  • 2 计算

    • 2.1 质因数分解法


    • 2.2 辗转相除法



  • 3 性质


  • 4 程式代碼

    • 4.1 C#


    • 4.2 C++


    • 4.3 C


    • 4.4 Java


    • 4.5 Python



  • 5 政治用法


  • 6 参考文献


  • 7 外部链接


  • 8 参见




概述



例子


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


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


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

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


同樣地,24可以表示為:


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

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


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


1,2,3,6displaystyle 1,2,3,6displaystyle 1,2,3,6

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


gcd(54,24)=6displaystyle gcd(54,24)=6displaystyle 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=2displaystyle frac 2412=2displaystyle frac 2412=2)、另一边有五格(6012=5displaystyle frac 6012=5displaystyle frac 6012=5)。



计算



质因数分解法


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


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


48=2×2×2×2×3displaystyle 48=2times 2times 2times 2times 3displaystyle 48=2times 2times 2times 2times 3

180=2×2×3×3×5displaystyle 180=2times 2times 3times 3times 5displaystyle 180=2times 2times 3times 3times 5

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



Least common multiple.svg[1]
最小公倍数=2×2×(2×2×3)×3×5=720displaystyle =2times 2times (2times 2times 3)times 3times 5=720displaystyle =2times 2times (2times 2times 3)times 3times 5=720

最大公因数=2×2×3=12displaystyle =2times 2times 3=12displaystyle =2times 2times 3=12


辗转相除法


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


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


gcd(a,0)=adisplaystyle gcd(a,0)=adisplaystyle gcd(a,0)=a

gcd(a,b)=gcd(b,amodb)displaystyle gcd(a,b)=gcd(b,a,mathrm mod ,b)displaystyle gcd(a,b)=gcd(b,a,mathrm mod ,b)

其中


amodb=a−b⌊ab⌋displaystyle a,mathrm mod ,b=a-bleftlfloor a over brightrfloor displaystyle a,mathrm mod ,b=a-bleftlfloor a over brightrfloor

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



gcd(a,a)=adisplaystyle gcd(a,a)=adisplaystyle gcd(a,a)=a,


gcd(a,b)=gcd(a−b,b)displaystyle gcd(a,b)=gcd(a-b,b)quad displaystyle gcd(a,b)=gcd(a-b,b)quad 如果 a > b


gcd(a,b)=gcd(a,b−a)displaystyle gcd(a,b)=gcd(a,b-a)quad displaystyle gcd(a,b)=gcd(a,b-a)quad 如果 b > a



File:The Great Common Divisor of 62 and 36 is 2.ogv播放媒体

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



性质


  • 任意ab的公因数都是gcd(a,b)displaystyle gcd(a,b)displaystyle gcd(a,b)的因數。


  • gcddisplaystyle gcd displaystyle gcd 函数满足交换律:gcd(a,b)=gcd(b,a)displaystyle gcd(a,b)=gcd(b,a)displaystyle gcd(a,b)=gcd(b,a)


  • gcddisplaystyle gcd displaystyle gcd 函数满足结合律:gcd(a,gcd(b,c))=gcd(gcd(a,b),c)displaystyle gcd(a,gcd(b,c))=gcd(gcd(a,b),c)displaystyle gcd(a,gcd(b,c))=gcd(gcd(a,b),c)


程式代碼


數字之間的最大公因數之所有因數是該組數字所有的公因數。


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



C#


1 private int GCD(int a, int b) 
2 if(0 != b) while(0 != (a %= b) && 0 != (b %= a));
3 return a + b;
4


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 a % b == 0 ? b : GCD(b, a % b);



Python


GCD = lambda a, b: (GCD(b, a % b) if a % b else b)


政治用法



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



参考文献




  1. ^ Gustavo Delfino, "Understanding the Least Common Multiple and Greatest Common Divisor", Wolfram Demonstrations Project, Published: February 1, 2013.



外部链接


  • 圖解最大公因數求法

  • 包含GCD動態規劃


参见


  • 公倍数

  • 公约数

  • 最小公倍数

Popular posts from this blog

泉州府

大跃进

马相伯