扩展欧几里得算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

序号 i 商 q i −1
余数 r i s i t i 0
240101 4601扩展欧⼏⾥得算法
扩展欧⼏⾥得算法
扩展欧⼏⾥得算法(英语:Extended Euclidean algorithm )是欧⼏⾥得算法(⼜叫辗转相除法)的扩展。

已知整数a 、b ,扩展欧⼏⾥得算法可以在求得a 、b 的最⼤公约数的同时,能找到整数x 、y (其中⼀个很可能是负数),使它们满⾜贝祖等式:
ax + by = gcd(a, b)
如果a 是负数,可以把问题转化成:
|a|(-x) + by = gcd(|a|, x) (|a|为a 的绝对值),然后令x ' = (-x)。

通常谈到最⼤公约数时,我们都会提到⼀个⾮常基本的事实(贝祖等式给定):给定⼆个整数a 、b ,必存在整数x 、y 使得ax + by =gcd(a,b)。

众所周知,已知两个数a 和b ,对它们进⾏辗转相除,可得它们的最⼤公约数。

不过,在欧⼏⾥得算法中,我们仅仅利⽤了每步带余除法所得的余数。

扩展欧⼏⾥得算法还利⽤了带余除法所得的商,在辗转相除的同时也能得到贝祖等式中的x 、y 两个系数。

以扩展欧⼏⾥得算法求得的系数是满⾜裴蜀等式的最简系数。

另外,扩展欧⼏⾥得算法是⼀种⾃验证算法,最后⼀步得到的s i+1和t i+1(s i+1和t i+1的含义如下)乘以gcd(a,b)之后恰好是a 和b,可以⽤来验证计算结果是否正确。

扩展欧⼏⾥得算法可以⽤来计算模反元素(也叫模逆元),求出模反元素是RSA 加密算法中获得所需公钥、私钥的必要步骤。

算法和举例
在标准的欧⼏⾥得算法中,我们记欲求最⼤公约数的两个数为a 和b ,第i 步带余除法得到的商为q i ,余数为r i+1,则欧⼏⾥得算法可以写成如下形式:
r 0 = a
r 1 = b
.......
r i+1 = r i-1 - q i r i 且 0 ≤ r i+1 < |r i |
......
当某步得到的 r i+1 = 0 时,计算结束。

上⼀步得到的r i 即为a ,b 的最⼤公约数。

扩展欧⼏⾥得算法在q i ,r i 的基础上增加了两组序列,记作s i 和t i ,并s 0 = 1, s 1 = 0, t 0 = 0, t 1 = 1,在欧⼏⾥得算法每步计算r i+1 = r i-1 - q i r i 之外额外计算
s i+1 = s i-1 - q i s i 和 t i+1 = t i-1 - q i t i ,亦即:
r 0 = a r 1 = b
s 0 = 1 s 1 = 0
t 0 = 0 t 1 = 1
...... ......
r i+1 = r i-1 - q i r i 且 0 ≤ r i+1 < |r i |
s i+1 = s i-1 - q i s i
t i+1 = t i-1 - q i t i
......
算法结束条件与欧⼏⾥得算法⼀致,也是r i+1 = 0,此时所得的s i 和 t i 即满⾜等式gcd(a, b) = r i = as i + bt i 。

下表以a = 240,b = 46为例演⽰了扩展欧⼏⾥得算法:
所得的最⼤公因数是2,所得贝祖等式为gcd(240, 46) = 2 = -9*240 + 47 * 46。

同时还有⾃验证等式|23| * 2 = 46 和 |-120| * 2 =240。

2240 ÷ 46 = 5240 − 5 × 46 = 101 − 5 × 0 = 10 − 5 × 1 = −5
346 ÷ 10 = 446 − 4 × 10 = 60 − 4 × 1 = −4 1 − 4 × −5 = 21 410 ÷ 6 = 110 − 1 × 6 = 4 1 − 1 × −4 = 5−5 − 1 × 21 = −26 56 ÷ 4 = 1 6 − 1 × 4 = 2−4 − 1 × 5 = −921 − 1 × −26 = 47 64 ÷ 2 = 2 4 − 2 × 2 = 0 5 − 2 × −9 = 23−26 − 2 × 47 = −120扩展欧⼏⾥得算法和模逆元实现 以下是扩展欧⼏⾥德算法的Rust实现:
1 pub fn extend_euclidean(a: isize,b: isize)->(isize,isize,isize){ 2if b == 0{
3return ( 1,0,a);
4 }else {
5 let (mut old_r,mut r) = (a,b);
6 let (mut old_s,mut s) = (1,0);
7 let (mut old_t,mut t) = (0,1);
8while r != 0{
9 let q = old_r/r;
10
11 let temp = old_r;
12 old_r = r;
13 r = temp - q*r;
14
15 let temp = old_s;
16 old_s = s;
17 s = temp - q*s;
18
19 let temp = old_t;
20 old_t = t;
21 t = temp - q*t;
22 }
23 (old_s,old_t,old_r)
24 }
26 }
模逆元Rust实现:
1 pub fn mod_inverse(a: isize,n:isize)->Option<isize>{
2 let (s,_t,gcd) = extend_euclidean(a,n);
3if gcd != 1{
4return None;
5 }
6if s > 0{
7 Some(s)
8 }else {
9 Some(s+n)
10 }
11 }
扩展欧⼏⾥得算法以及模逆元测试代码:
1#[test]
2 fn ext_gcd_test(){
3 let a = 7;
4 let n = 977;
5 let (s,t,gcd) = extend_euclidean(a,n);
6 assert_eq!((-279,2,1),extend_euclidean(7,977)); 7
8 assert_eq!(mod_inverse(47,977),Some(686)); 9
10 }。

相关文档
最新文档