数论-逆元&费马小定理

"""
逆元
"""
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

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 + ny = 1
def Inv(a, n):
  g, x, y = Func(a, n, 1)
  if x is None:
    return None
  else:
    return x % n
  

"""
费马小定理: 任意素数n, gcd(a, n)=1, 有a**(n-1) ≡ 1(mod n)
上述定理给出一个素数模意义下求逆元的好方法:
只要n是素数, 求a在模n意义下的逆元:
              a * a**(n-2) ≡ 1(mod n)
a**(n-2)就是a的逆元, 只需要再对a**(n-2) mod n即可
"""

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

好无聊啊,烦死

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

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

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

打赏作者

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

抵扣说明:

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

余额充值