扩展的欧几里得算法求乘法逆元python
时间: 2023-09-30 22:06:23 浏览: 104
以下是扩展的欧几里得算法求乘法逆元的Python代码:
```python
def extended_gcd(a, b):
if b == 0:
return a, 1, 0
gcd, x1, y1 = extended_gcd(b, a % b)
x = y1
y = x1 - (a // b) * y1
return gcd, x, y
def multiplicative_inverse(a, m):
gcd, x, y = extended_gcd(a, m)
if gcd != 1:
raise ValueError("Multiplicative inverse does not exist")
return x % m
```
其中,`extended_gcd`函数用于求解最大公约数和贝祖等式中的`x`和`y`,`multiplicative_inverse`函数则是根据贝祖等式求解乘法逆元。如果`a`和`m`不互质,则在求解乘法逆元时会抛出`ValueError`异常。
相关问题
扩展欧几里得算法求乘法逆元
扩展欧几里得算法可以用来求解两个数的最大公约数以及一组贝祖等式,进而求解乘法逆元。具体步骤如下:
1. 使用欧几里得算法求解原始数 a 和模数 b 的最大公约数 gcd(a, b)。
2. 用扩展欧几里得算法求解一组贝祖等式 ax + by = gcd(a, b) 中的 x 和 y。
3. 如果 gcd(a, b) 不等于 1,则原始数 a 在模数 b 意义下没有乘法逆元。
4. 如果 gcd(a, b) 等于 1,则原始数 a 在模数 b 意义下存在乘法逆元。此时 x 即为 a 在模数 b 意义下的乘法逆元。
下面是一个 Python 代码示例,可以用来求解一个数的乘法逆元:
```python
def extended_euclidean_algorithm(a, b):
if b == 0:
return a, 1, 0
else:
gcd, x, y = extended_euclidean_algorithm(b, a % b)
return gcd, y, x - (a // b) * y
def multiplicative_inverse(a, b):
gcd, x, y = extended_euclidean_algorithm(a, b)
if gcd != 1:
return None
else:
return x % b
```
其中,`extended_euclidean_algorithm` 函数使用递归方式实现扩展欧几里得算法,返回最大公约数 gcd,以及一组贝祖等式 ax + by = gcd(a, b) 中的 x 和 y。`multiplicative_inverse` 函数则调用 `extended_euclidean_algorithm` 函数求解乘法逆元。如果不存在乘法逆元,则返回 `None`。
怎样利用扩展的欧几里得算法求乘法逆元
扩展的欧几里得算法可以求解形如 ax + by = gcd(a, b) 的一次不定方程的整数解,其中 a,b 是任意两个整数,gcd(a,b) 表示 a 和 b 的最大公约数。
对于求解乘法逆元,我们需要解的方程形式为 ax + by = 1,其中 a 是需要求逆的数,b 是取模的数(通常为一个质数),x 就是 a 的逆元。因此,我们只需将式子中的 1 替换成 1 % b,即可得到 ax + by = 1 % b 的形式。
具体求解的步骤如下:
1. 对于给定的 a 和 b,使用欧几里得算法求得它们的最大公约数 gcd(a, b),并记录每一步的余数和系数。
2. 从最后一步开始,倒序向上推导,求得 x 的值。设最后一步的余数为 r,系数为 k,则有 r = k * a + (b % a),因此有 r - k * a = b % a。注意这里要使用 b % a 而不是 r % a,因为 b 作为模数,是固定不变的。
3. 将上一步中求得的 x 带入前面的等式中,逐步向上推导,求得 y 的值。
4. 最终得到 x 就是 a 在模数 b 下的逆元。
下面是一个示例代码:
```python
def ext_gcd(a, b):
if b == 0:
return a, 1, 0
else:
gcd, x, y = ext_gcd(b, a % b)
return gcd, y, x - (a // b) * y
def mod_inv(a, b):
gcd, x, y = ext_gcd(a, b)
if gcd != 1:
raise ValueError("a is not invertible mod b")
else:
return x % b
```
其中,ext_gcd 函数实现了扩展的欧几里得算法,mod_inv 函数则直接调用 ext_gcd 求解 a 在模数 b 下的逆元。注意,如果 a 在模数 b 下没有逆元,则会抛出 ValueError 异常。
阅读全文