扩展欧几里得算法求逆元python
时间: 2023-09-30 22:09:06 浏览: 144
下面是一个用Python实现的扩展欧几里得算法求逆元的示例代码:
```python
def exgcd(a, b):
if b == 0:
return a, 1, 0
else:
gcd, x, y = exgcd(b, a % b)
return gcd, y, x - (a // b) * y
def mod_inv(a, m):
gcd, x, y = exgcd(a, m)
if gcd != 1:
return None # 逆元不存在
else:
return (x % m + m) % m # 返回正整数范围内的逆元
```
其中,`exgcd(a, b)`函数为扩展欧几里得算法的实现,返回值为`(gcd, x, y)`,其中`gcd`为`a`和`b`的最大公约数,`x`和`y`满足`ax + by = gcd`的一组解。`mod_inv(a, m)`函数为求`a`在模`m`意义下的逆元,当逆元不存在时返回`None`。
示例:
```python
print(mod_inv(3, 11)) # 输出 4,因为 3 * 4 ≡ 1 (mod 11)
print(mod_inv(4, 8)) # 输出 None,因为 4 在模 8 意义下没有逆元
```
相关问题
扩展欧几里得算法求逆元
扩展欧几里得算法是一种求解ax + by = gcd(a, b)的方法,其中a, b为整数,x, y为整数解。如果a, b互质,那么gcd(a, b) = 1,此时方程ax + by = 1,因此x就是a的逆元。
具体求逆元的步骤如下:
1. 对于给定的a和模数m,使用扩展欧几里得算法求解ax + my = 1的一组整数解x, y。
2. 如果x < 0,则x = x + m是a在模m下的逆元。
3. 如果x >= 0,则x就是a在模m下的逆元。
下面是一个简单的Python代码实现:
```python
def ext_gcd(a, b):
if b == 0:
return a, 1, 0
else:
d, x, y = ext_gcd(b, a % b)
return d, y, x - (a // b) * y
def mod_inv(a, m):
d, x, y = ext_gcd(a, m)
if d == 1:
return (x + m) % m
else:
return None
```
其中,ext_gcd函数用于求解扩展欧几里得算法,mod_inv函数用于求解逆元。如果a在模m下无逆元,则返回None。
扩展欧几里得算法求逆元py
扩展欧几里得算法是一种求解线性方程ax+by=gcd(a,b)的算法,其中a、b是整数,x和y是整数解,gcd(a,b)表示a和b的最大公约数。
扩展欧几里得算法可以被用来求解模反元素,模反元素也被称为逆元。逆元是模数n下的一个数x,满足(ax mod n) ≡ 1。
我们可以使用扩展欧几里得算法来求解逆元。具体步骤如下:
1. 初始化a=n,b=m,其中n是模数,m是要求逆元的数。
2. 初始化x=1,y=0。
3. 当b不等于0时,重复以下步骤:
a. 计算商数q = a // b和余数r = a % b。
b. 更新a = b,b = r。
c. 更新x = x_prev - q * x,y = y_prev - q * y。
4. 返回x作为逆元。
下面是一个使用Python实现的例子:
```
def extended_gcd(a, b):
if b == 0:
return (1, 0)
(x_prev, y_prev) = extended_gcd(b, a % b)
(x, y) = (y_prev, x_prev - (a // b) * y_prev)
return (x, y)
def invert_modulo(m, n):
(x, _) = extended_gcd(n, m)
return x % n
n = 17
m = 5
inverse = invert_modulo(m, n)
print(inverse) # 输出7
```
在上面的例子中,我们想要求模数n=17下数字5的逆元。根据计算,我们得到逆元7。
阅读全文