X-man

导航

数论(1)-----欧几里得算法

一.  欧几里得算法------求最大公约数

1.公式:
      gcd(a,b)=gcd(b,a mod b)    (a为非负整数,b为正整数)

2.证明:
      思路:
           两个整数a和b,如果a|b&&b|a(即a,b能互相整除),那么a=b.

      基础知识准备:
           A. (a mod b)=a-qb , q=(int)a/b;
           B. d|a&&d|b => d|(xa+yb) x,y为任意整数
           C. d|a&&d|b => d|gcd(a,b)

      过程:(1)证:gcd(a,b)|gcd(b,a mod b)

                  设d=gcd(a,b)=>d|a&&d|b, 
                  由A和B知道,d|a&&d|b=>d|(xa+yb)=>d|(a mod b)
                  由C知道,d|b&&d|(a mod b)=>d|gcd(b,a mod b)=>gcd(a,b)|gcd(b,a mod b);

            (2) 证:gcd(b,a mod b)|gcd(a,b)
                   
                  设d=gcd(b,a mod b)=>d|b&&d|(a mod b),
                  由A和B知道, d|b&&d|(a mod b)=>d|(xb+y(a mod b)=>d|a(由A,a=qb+(a mod b))
                  由C知道,d|a&&d|b=>d|gcd(a,b)=>gcd(b,a mod b)|gcd(a,b)

             由(1)和(2),可以知道我们得证了。

3、程序模版

//递归版本
数论(1)-----欧几里得算法
int gcd(int a,int b)
{
  
return b?gcd(b,a%b):a;
}

数论(1)-----欧几里得算法
数论(1)-----欧几里得算法
//循环版本
数论(1)-----欧几里得算法
int gcd1(int a,int b)
{
  
for(int c=a%b;c;a=b,b=c,c=a%b);
  
return b;
}

 

posted on 2013-05-30 22:21  雨钝风轻  阅读(209)  评论(0编辑  收藏  举报