蓝桥杯-同余方程

本文介绍了如何使用Python实现扩展欧几里得算法(exgcd)来解决ax+by=gcd(a,b)的线性同余方程,并进一步探讨如何找到满足ax+by=m的解,特别是当m=1时,即求a在模b下的逆元。函数`Inv`用于求a在模n下的逆元,如果存在则返回结果,否则返回None。
摘要由CSDN通过智能技术生成
"""
https://www.lanqiao.cn/problems/393/learning/?page=1&first_category_id=1&problem_id=393
"""
# 先求ax + by = gcd(a, b)的一组解
# 返回gcd(a, b), x, y
def exgcd(a, b):
  # 递归出口
  if b == 0:
    return a, 1, 0
  g, x2, y2 = exgcd(b, a % b)
  x1, y1 = y2, x2 - (a // b) * y2
  return g, x1, y1

# 再求ax + by = m的一组解(当m=1时就是求a在模b意义下的逆元x)
def Func(a, b, m):
  g, x1, y1 = exgcd(a, b)
  # m必须是gcd(a, b)的倍数才有解
  if m % g != 0:
    return None, None, None
  x0, y0 = x1 * m // g, y1 * m // g
  return g, x0, y0

# 求a在模n意义下的逆元x, 即ax ≡ 1(mod n)
# 也就是求ax + by = m(b=n, m=1)的一组解
def Inv(a, n):
  g, x, y = Func(a, n, 1)
  if x is None:
    return None
  else:
    return x % n

a, b = map(int, input().split())
print(Inv(a, b))

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好无聊啊,烦死

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值