中国剩余定理CRT

正整数m1,m2,...,mk两两互素,对b1,b2,...,bk的同余式组为

[begin{cases} x equiv b_1; mod ;m_1\ x equiv b_2; mod ;m_2\ quadquadvdots\ x equiv b_k; mod ;m_k\ end{cases} ]

在mod M

[M = prod_{i = 1}^{k}m_i ]

的情况下有唯一解

[x = (sum_{i=1}^k b_iM_iM'_i);mod;M ]

其中

[M_i = frac{M}{m_i} ]

[M'_i = M_i^{-1};mod;m_i ]

python代码实现:

import gmpy2

def crt(b,m):
    #判断是否互素
    for i in range(len(m)):
        for j in range(i+1,len(m)):
            if gmpy2.gcd(m[i],m[j]) != 1:
                print("m中含有不是互余的数")
                return -1
    #乘积
    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]的乘法逆元
    Mm_ = []
    for i in range(len(m)):
        _,a,_ = gmpy2.gcdext(Mm[i],m[i])
        Mm_.append(int(a % m[i]))
    #求MiM'ibi的累加
    y = 0
    for i in range(len(m)):
        print(Mm[i] * Mm_[i] * b[i])
        y += (Mm[i] * Mm_[i] * b[i])
    y = y % M
    return y
内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/lingxuer/p/15018137.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!