欧几里得算法算法版本Swift 语言版本import Foundationfunc gcd(a: Int, b: Int) -> Int { var x = a, y = b while y != 0 { (x, y) = (y, x % y) } return x}let x = 75, y = 100let result = gcd(a: x, b: y)print("\(x) 和 \(y) 的最大公约数是 \(result)")Go语言版本package mainimport "fmt"func main() { var x, y int = 18, 12 result := gcd(x,y) fmt.Printf("x, y 的最大公约数是 : %d",result)}func gcd(x,y int) int{ for y != 0 { x, y = y, x%y } return x}Pascal语言版var a,b,c:integer;begin readln(a,b); c:=a mod b; while c<>0 do begin a:=b;b:=c;c:=a mod b; end; write(b);end.C语言版/*欧几里得算法:辗转求余原理: gcd(a,b)=gcd(b,a mod b)当b为0时,两数的最大公约数即为agetchar()会接受前一个scanf的回车符*/#include
定理:a存在模p的乘法逆元的充要条件是gcd(a,p) = 1证明:首先证明充分性如果gcd(a,p) = 1,根据欧拉定理,aφ(p) ≡ 1 mod p,因此显然aφ(p)-1 mod p是a的模p乘法逆元
再证明必要性假设存在a模p的乘法逆元为bab ≡ 1 mod p则ab = kp +1 ,所以1 = ab - kp因为gcd(a,p) = d所以d | 1所以d只能为1Stein算法欧几里得算法是计算两个数最大公约数的传统算法,他无论从理论还是从效率上都是很好的
但是他有一个致命的缺陷,这个缺陷只有在大素数时才会显现出来
硬件平台,一般整数最多也就是64位,对于这样的整数,计算两个数之间的模是很简单的
对于字长为32位的平台,计算两个不超过32位的整数的模,只需要一个指令周期,而计算64位以下的整数模,也不过几个周期而已
但是对于更大的素数,这样的计算过程就不得不由用户来设计,为了计算两个超过 64位的整数的模,用户也许不得不采用类似于多位数除法手算过程中的试商法,这个过程不但复杂,而且消耗了很多CPU时间
对于现代密码算法,要求计算 128位以上的素数的情况比比皆是,设计这样的程序迫切希望能够抛弃除法和取模
Stein算法由J. Stein于1961年提出,这个方法也是计算两个数的最大公约数
和欧几里得算法不同的是,Stein算法只有整数的移位和加减法,这对于程序设计者是一个福音
为了说明Stein算法的正确性,首先必须注意到以下结论:gcd(a,a) = a,也就是一个数和他自身的公约数是其自身gcd(ka,kb) = k gcd(a,b),也就是最大公约数运算和倍乘运算可以交换,特殊的,当k=2时,说明两个偶数的最大公约数必然能被2整除C++/java 实现// c++/java stein 算法int gcd(int a,int b){if(ab{int temp = a;a = b;b=temp;}if(0==b) //the base casereturn a;if(a%2==0 && b%2 ==0) //a and b are evenreturn 2*gcd(a/2,b/2);if (a%2 == 0) // only a is evenreturn gcd(a/2,b);if (b%2==0)// only b is evenreturn gcd(a,b/2);return gcd((a-b)/2,b);// a and b are odd}算法扩展扩展欧几里得算法不但能计算(a,b)的最大公约数,而且能计算a模b及b模a的乘法逆元,用C语言描述如下:#include
计算乘法逆元则显得很难明白
我想了半个小时才想出证明他的方法
首先重复拙作整除中的一个论断:如果gcd(a,b)=d,则存在m,n,使得d = ma + nb,称呼这种关系为a、b组合整数d,m,n称为组合系数
当d=1时,有 ma + nb = 1 ,此时可以看出m是a模b的乘法逆元,n是b模a的乘法逆元
为了证明上面的结论,我们把上述计算中xi、yi看成ti的迭代初始值,考察一组数(t1,t2,t3),用归纳法证明:当通过扩展欧几里得算法计算后,每一行都满足a×t1 + b×t2 = t3第一行:1 × a + 0 × b = a成立第二行:0 × a + 1 × b = b成立假设前k行都成立,考察第k+1行对于k-1行和k行有t1(k-1) t2(k-1) t3(k-1)t1(k) t2(k) t3(k)分别满足:t1(k-1) × a + t2(k-1) × b = t3(k-1)t1(k) × a + t2(k) × b = t3(k)根据扩展欧几里得算法,假设t3(k-1) = j t3(k) + r则:t3(k+1) = rt2(k+1) = t2(k-1) - j × t2(k)t1(k+1) = t1(k-1) - j × t1(k)则t1(k+1) × a + t2(k+1) × b=t1(k-1) × a - j × t1(k) × a +t2(k-1) × b - j × t2(k) × b= t3(k-1) - j t3(k) = r= t3(k+1)得证因此,当最终t3迭代计算到1时,有t1× a + t2 × b = 1,显然,t1是a模b的乘法逆元,t2是b模a的乘法逆元
以上内容由大学时代综合整理自互联网,实际情况请以官方资料为准。