数论学习之最大公约数与最小公倍数
最大公约数
定义:设a,b是两个整数,如果d|a,且d|b,则称d是a和b的公因子,或公约数,除0之外,任和整数只有有限个因子,其中最大的叫做最大公约数。
记做: gcd( a, b)
最小公倍数
定义:设a, b 是两个整数,如果a|d,b|d,则称d是a,b的公倍数,a,b的公倍数有无穷个,最小的那个称做最小公倍数。
记做 :lcm (a,b);
显然对于任意的正整数a:
gcd(0,a) = a; gcd(1,a)=1; lcm(1,a) = a;
最小公倍数与最大公约的数两条性质:
1.a|m , b|m, lcm(a,b) l m;
2.m|a,m|b, m | gcd(a,b);
----------
求法:
1.因子分解
如求32 与24的最大公约数与最小公倍数
32 = 2 ^5
24 =2 ^3 * 3
gcd(a,b) = 2 ^ 3 = 8;
lcm(a,b) = 2^5 * 3 = 96
2.辗转相除法
它是基于以下定理构造的
设a = qb + r; 其中a,b, q,r都是整数,则gcd(a, b) = gcd ( b,r);
证明:
只需要证明a,b和b,r具有相同的公因子。
设d|a,d|b, r = a - qb,则d| r (由整除性质推出 )
如果 a|b,a|d,则对任意正整数x, y,有a | xb + yd;
所以
gcd (a , b) = gcd( b, r1) = gcd....= rk
这就是辗转相除法,又叫欧几里德算法。(Euclid)
3.更相减损术
如22 与11的最大公约数
d =22 - 11 = 11
11 - 11 = 0;
其最大公约数为11
4. 扩展欧几里德算法
对于不为0的非负整数a, b,gcd(a,b),必然存在整数对x,y;
使gcd(a,b) = x a + y b;
5.gcd C语言的实现,递归,和非递归
1 #include <stdio.h>
2
3 void swap (int &x, int &y)
4 {
5
6 int temp;
7 temp = x;
8 x = y;
9 y = temp;
10 }
11
12 int _gcd( int x, int y)
13 {
14 if ( x < y )
15 swap( x, y);
16 int r;
17 while ( r != 0 ) {
18 r = x % y;
19 x = y;
20 y = r;
21 }
22 return x;
23 }
24
25
26 int gcd( int n,int m )
27 {
28 return m ? gcd( m,n % m ) :n;
29 }
30
31 int main( )
32 {
33 int N, M;
34 while (scanf("%d%d", &N, &M) != EOF ) {
35 printf("%d\n",N /_gcd(N, M) * M);
36 }
37 return 0;
38 }
39