数论学习之最大公约数与最小公倍数

数论学习之最大公约数与最小公倍数

最大公约数

  定义:设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

  

 



posted on 2011-07-20 09:44  more think, more gains  阅读(543)  评论(0编辑  收藏  举报

导航