算法导论 第三十一章:数论
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):
扩展欧几里得算法完整代码(C++):
求逆元的完整代码:
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
运行结果:
方法一:欧几里得算法(辗转相除)
递归形式,如伪代码:
非递归形式:
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
运行结果:
相关文章推荐
- java算法导论之FloydWarshall算法实现代码
- Java中使用辗转相除法求最大公约数
- Python实现求最大公约数及判断素数的方法
- 1.m分解阶乘之和
- 2.几种递推数
- 3.欧拉函数
- 4.快速幂模m算法
- 5.扩展欧几里得&&中国剩余定理
- 6.数论_web
- Red-Black Tree 的Java实现
- 逆序对
- 算法导论之堆
- 编程之美2015初赛A
- LCS 最长公共子序列
- 使用Java完成《算法导论》习题2.2-2
- 使用Java完成《算法导论》习题2.3-2
- 使用Java完成《算法导论》习题2.3-4
- 使用Java完成《算法导论》习题2.3-5
- 使用Java完成《算法导论》习题2.3-6
- 使用Java完成《算法导论》习题2.3-7