您的位置:首页 > 其它

算法导论 第三十一章:数论

2015-07-21 20:19 459 查看
1.求两个数的最大公约数

方法一:欧几里得算法(辗转相除)

递归形式,如伪代码:



非递归形式:

1)计算 r=a mod b(0≤r<b);若 r = 0,算法结束;b 即为最大公约数。
2) 互换:置 a←b,b←r,并返回第1步。

方法二:扩展的欧几里得算法

d=gcd(a,b)=ax+by

伪代码如下:



可以根据扩展欧几里得算法求逆元。

===============================================================================================================================

欧几里得算法完整代码(python):

from numpy import *
import sys
import string

def gcd(num1,num2):
    if num1 < num2:
        temp = num1
        num1 = num2
        num2 = temp

    x = num1
    y = num2
    while y != 0:
        temp = x % y
        x = y
        y = temp
    return x

    
##----------Main-----------------##
a = string.atoi(sys.argv[1])
b = string.atoi(sys.argv[2])
r = gcd(a,b)
print 'GCD=',r
运行结果:



扩展欧几里得算法完整代码(C++):

/*
* Function :The extended form of Euclid's Algorithm
*
* */

#include<iostream>
using namespace std;

int d,a,b,x,y;
int Extended_Euclid(int a,int b )
{
int t;
if(b==0)
{
x=1;
y=0;
return a;
}
d=Extended_Euclid(b,a%b);
t=x;
x=y;
y=t-(a/b)*y;
return d;
}

int main()
{
int aa=0,bb=0;
cout<<"Input two numbers:"<<endl;
cin>>aa>>bb;
d=Extended_Euclid(aa,bb);
cout<<"The GCD:"<<d<<endl;
cout<<"The coefficients:x="<<x<<",y="<<y<<endl;
return 0;
}
运行结果:



求逆元的完整代码:

from numpy import *
import sys
import string

def extend_Eulid(a,b):
if b==0:
return (a,1,0)
else:
(dd,xx,yy)=extend_Eulid(b,a%b)
d = dd
x = yy
y = xx - a/b*yy
return (d,x,y)

##--------Main---------------#
a = string.atoi(sys.argv[1])
b = string.atoi(sys.argv[2])
(xx,InvElement,zz) = extend_Eulid(a,b)
print 'InvElement1=',InvElement
InvElement2 = b - abs(InvElement)
print 'InvElement2=',InvElement2

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息