几个数学算法的简单代码实现(python3)

模幂运算
#模幂运算
def power(a,n,p) ->int:
    ans = 1
    while n:
        if n & 1:
            ans = ans * a % p
        a = a * a % p
        n >>= 1
    return ans
欧几里得定理
#欧几里得定理
def gcd(a,b) -> int:
    if a > b:
        a,b = b,a
    while b:
        temp = a % b
        a = b
        b = temp
    return a
扩展欧几里得定理
#扩展欧几里得(递归)
def exgcd(a,b) ->tuple:
    if b == 0:
        return 1,0,a
    x1,y1,q = exgcd(b,a % b)
    x,y = y1, (x1 - (a//b) * y1)
    return x,y,q
求乘法逆元
#计算 a mod p 的乘法逆元
def inv(a, p)->int:
    x,y,_ = exgcd(p,a)
    return y % p
中国剩余定理
#中国剩余定理
def CRT(b,m):
    #乘积
    M = 1
    for i in range(len(m)):
        M *= m[i]
    #求M/mi
    Mm = []
    for i in range(len(m)):
        Mm.append(M // m[i])
    #求Mm[i] mod mi 的乘法逆元
    Mm_ = []
    for i in range(len(m)):
        Mm_.append(inv(Mm[i],m[i]))
    #求Mi*M'i*bi的累加
    y = 0
    for i in range(len(m)):
        y += (Mm[i] * Mm_[i] * b[i])
    y = y % M
    return y
扩展中国剩余定理

看到这里的小伙伴是不是有些想法了,那exCRT就交给各位小伙伴们来实现啦

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值