记录利用Python来描述中国剩余定理

在这里插入代码片
```def exgcd(a,b,arr):#利用拓展欧几里得定理求乘法逆元
    if b == 0:
        arr[0] = 1
        arr[1] = 0 
        return a
    r = exgcd(b,a%b,arr)
    tmp = arr[0]
    arr[0] = arr[1]
    arr[1] = tmp - int(a/b)*arr[1]
    return r   


def Get_Mi(m_list,M): #求出 M / mi
    M_list=[]
    for mi in m_list:
        M_list.append(M//mi)
    return M_list

def Get_ei_list(M_list,m_list):#获取乘法逆元
    ei_list=[]
    for i in range(len(M_list)):
        ei_list.append(Get_ei(M_list[i],m_list[i]))
    return ei_list
   
def Get_ei(a,b):
    # 计算ei
    
   
    arr = [0,1,]
    r = exgcd(a,b,arr)
    if r == 1:
        return int ((arr[0] % b + b )%b)
    else :
        return -1
    

def crt(a_list,m_list):
    # 计算中国剩余定理,返回计算结果
    
    M = 1
    sum1 = 0
    for i in range(len(m_list)):
        M = M * m_list[i]
    M_list=(Get_Mi(m_list,M))
    ei_list=(Get_ei_list(M_list,m_list))
    for i in range (len(m_list)):
        sum1= sum1+ M_list[i] * ei_list[i] * a_list[i]
    return sum1 % M
    # **************end*************#
    
if __name__=='__main__':
    a_list= list(map(int,input().split(",")))
    m_list= list(map(int,input().split(",")))
    print(crt(a_list,m_list))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值