最大公約數
和最小公倍數
---------------------------------------------------------- ---------------------------------------
一、定義
1)最大公約數:最大公因數,也稱最大公約數、最大公因子,指兩個或多個整數共有約數中最大的一個。a,b的最大公約數記為(a,b)。
2)最小公倍數:兩個或多個整數公有的倍數叫做它們的公倍數。兩個或多個整數的公倍數裡最小的那一個叫做它們的最小公倍數。整數a,b的最小公倍數記為[a,b],
同樣的,a,b,c的最小公倍數記為[a,b,c],多個整數的最小公倍數也有同樣的記号。
二、定理
1)(a,b)[a,b]=ab(a,b均為整數)。即兩個數的最大公約數與最小公倍數的乘積等于這兩個數的相乘。
簡單證明:
設兩個數為x和y,其最大公約數為a,則
最小公倍數為(x/a)*(y/a)*a=xy/a,
最大公約數和最小公倍數的乘積為xy/a*a=xy
得證
2)如果兩個數是倍數關系,則它們的最小公倍數就是較大的數。
3)相鄰的兩個自然數的最小公倍數是它們的乘積。
簡單證明:(反證法)
隻需要證明:相鄰兩個自然數是互質即可。
假設兩個連續的自然數n和n+1不是互質數,設它們有公因數q(q≠1),那麼必存在非0自然數p1和p2,
使得n=p1×q;n+1=p2×q,兩式相減得n+1-n= p2×q- p1×q,即:(p2-p1)q=1,由于q≠1,是以p2-p1=1/q為分數,這與p2、p1為整數沖突。
附加:
i) 兩個連續的偶數隻有公因數1和2。
(假設兩個連續的偶數為2n與2n+2,由于2n÷2=n, (2n+2) ÷2=n+1, n 與n+1是連續的自然數一定是互質的,
是以2n與2n+2公因數隻有1和 2。)
ii)兩個連續的奇數公因數隻有1,是互質數。
(假設兩個連續的奇數為2n+1與2n+3有公因數q(q≠1),則存在非0自然數p1和p2,
使得2n+1=p1×q;2n+3=p2×q,兩式相減得2n+3-(2n+1)= p2×q- p1×q,
即:(p2-p1)q=2,由于p2、p1、q均為非0自然數,若p2-p1=1,
那麼q=2,則與2n+1與2n+3是奇數沖突,若p2-p1=2,那麼q=1與假設沖突。)
iii)推論:
1、如果連續的三個自然有兩個奇數一個偶數,則這三個數一定是兩兩互質的。它們的最小公倍數就是它們的乘積。
2、 如果連續的三個自然數有兩個偶數一個奇數。則這個奇數和這兩個偶數由于是相鄰的自然數一定是互質的,
而這兩個連續的偶數由于隻有公因數1和2,是以,把這兩個偶數除以它們的公因數2,所得的商一定是互質數,
是以,它們的公因數就等于這三個數的乘積再除以2。
4)如果兩個數互質,它們的最大公約數是1。
三、求解方法
- 求解最小公倍數的方法:
1). 直接求解法
如果較大的數是較小的數的倍數,那麼較大的數就是這兩個數的最小公倍數。
例如:求14和42的最小公倍數。
因為42是14的倍數,是以14和42的最小公倍數是42。
2). 兩數相乘法
如果兩個數是互質數,那麼這兩個數相乘的積就是它們的最小公倍數。
例如:求5和7的最小公倍數。
因為5和7是互質數,是以它們的最小公倍數是
。
3). 列舉倍數法
先分别寫出兩個數的倍數若幹個(從最小的倍數寫起),依次列舉出來,然後找出它們公有倍數中最小的一個,就是它們的最小公倍數。
例如:求6和8的最小公倍數。
6的倍數有:6、12、18、24、30、36、42、48……
8的倍數有:8、16、24、32、40、48……
6和8公有的倍數有:24、48……
是以,6和8的最小公倍數是24。
4). 分解質因數法
先分别把兩個數分解質因數,然後把它們公有的質因數和各自獨有的質因數連乘起來,所得的積就是這兩個數的最小公倍數。
例如:求24和36的最小公倍數。
是以,24和36的最小公倍數是。
5). 短除法
短除法實質上是分解質因數法的一種簡便形式。
求兩個數的最小公倍數,先用它們的公約數連續去除(公約數可為質數,也可為合數),
一直除到商是互質數為止,然後把所有的除數和商相乘,
所得的積就是這兩個數的最小公倍數。
例如:求12和18的最小公倍數
是以,12和18的最小公倍數是。
6). 大數翻倍法
把較大的數依次擴大2倍、3倍、4倍……一直到所得的數是較小的數的倍數為止,這個數就是這兩個數的最小公倍數。
例如:求12和15的最小公倍數。
把15依次擴大倍數得:
,因為60正好是12的倍數,
是以,12和15的最小公倍數是60。
7). 約分後交叉相乘法
先把兩個數寫成分數的形式,然後通過約分将其化成最簡分數,把分子、分母交叉相乘,所得的積就是這兩個數的最小公倍數。
例如:求15和40的最小公倍數。
将15和40寫成分數的形式,通過約分将其化成最簡分數,即
,是以,15和40的最小公倍數是 或。
8). 比例求解法
先把兩個數寫成比的形式,然後應用比的基本性質把這個比化成最簡的整數比,并将這兩個比寫成比例的形式。
在這個比例中,兩個内項的積 或兩個外項的積就是這兩個數的最小公倍數。
例如:求15和25的最小公倍數。
将15和25寫成比的形式,并把這個比化成最簡的整數比:
。是以,15和25的最小公倍數是 或。
9). 兩個數的乘積除以兩個數的最大公約數法
根據兩個數的最大公約數與最小公倍數的乘積為這兩個數的乘積可知,要求兩個數的最小公倍數,
就要先分别求出這兩個數的乘積和它們的最 大公約數,然後用這兩個數的乘積除以它們的最大公約數,所得的商就是這兩個數的最小公倍數。
例如:求8和30的最小公倍數。
因為
,8和30的最大公約數是2。
是以,8和30的最小公倍數是
。
總之,求兩個數的最小公倍數的方法很多,在解答時可以根據具體情況,靈活地選用比較簡便的方法,正确求出兩個數的最小公倍數。
四、利用上面的【定義-定理-方法】結合運用java程式設計語言實作。
注:由于兩個數的最小公倍數等于兩個數的乘積除以最大公約數。是以,這裡隻要求出最大公約數即可。
/**
* 問題:求兩個數的最大公約數
* 解決方法:歐幾裡得的輾轉相除法
* @author xiaoxiaolan
*
*/
public class Gcd {
public static void main(String[] args) {
int m = 686996996, n = 53435566;
System.out.println("求解" + m + "和" + n + "的最大公約數。");
System.out.println("歐幾裡得的輾轉相除算法實作:");
System.out.println(divisor(m, n));
System.out.println("Stein算法實作:");
System.out.println(gcd(m, n));
}
/**
* 這個是使用java中的遞歸方法實作輾轉相除法
* 傳統算法與證明: 定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不為0)
* 證明:a可以表示成a = kb+ r,則r = a mod b 假設d是a,b的一個公約數,則有 d|a,d|b,而r = a - kb,是以d|r 是以d也是(b,a mod b)
* 的公約數 是以(a,b)和(b,a mod b)的公約數是一樣的,其最大公約數也必然相等,得證
* @param m
* @param n
* @return
*/
private static int divisor(int m, int n) {
if (m % n == 0) {
return n;
} else {
return divisor(n, m % n);
}
}
/**
* 和歐幾裡德算法不同的是,Stein算法隻有整數的移位和加減法,這對于程式設計者是一個福音。
* 為了說明Stein算法的正确性,首先必須注意到以下結論: gcd(a,a) = a,也就是一個數和他自身的公約數是其自身 gcd(ka,kb) =
* k gcd(a,b),也就是最大公約數運算和倍乘運算可以交換,特殊的,當k=2時,說明兩個偶數的最大公約數必然能被2整除
* @param a
* @param b
* @return
*/
private static int gcd(int a, int b) {
if (a < b) // arrange so that a>b
{
int temp = a;
a = b;
b = temp;
}
if (0 == b) // the base case
return a;
if (a % 2 == 0 && b % 2 == 0) // a and b are even
return 2 * gcd(a / 2, b / 2);
if (a % 2 == 0) // only a is even
return gcd(a / 2, b);
if (b % 2 == 0)// only b is even
return gcd(a, b / 2);
return gcd((a - b) / 2, b);// a and b are odd
}
}
五、小結:(設計算法來解決可計算問題的基本步驟)
- 收集目前問題的基本結論與可用定理,并對它們進行篩選,優化,組合預測。
- 選擇合理的資料結構來存儲資料材料。
- 規劃算法步驟。
- 編碼
- 驗證