中国剩余定理 Python实现

#gcd,求最大公约数函数,递归算法,有了扩展欧几里得算法之后,此函数可以不用
def _g_c_d(a,b):
  if 0==b:
    return a
  return gcd(b,a%b)

#扩展欧几里得算法,返回值列表中,x是a的逆元(mod b),q是gcd(a,b),若x是0,则表示没有逆元
#y是计算过程中的迭代的参数,可以不用管
#此算法实质上是广义欧几里得除法的逆运算,用递归可以体现出这个逆运算的过程
def Ex_Euclid(a,b):
  if 0==b:
    x=1;y=0;q=a
    return x,y,q
  xyq=Ex_Euclid(b,a%b)
  x=xyq[0];y=xyq[1];q=xyq[2]
  temp=x;x=y;y=temp-a//b*y
  return x,y,q

#获取a的逆元(mod b)的函数,目的是为了封装获取逆元的功能
def Get_Inverse(a,b):
  return Ex_Euclid(a,b)[0]

#获取a和b的最大公约数函数,目的是为了封装获取最大公约数的功能
def gcd(a,b):
  return Ex_Euclid(a,b)[2]

#判断所有的mi是否两两互质
def Is_Coprime(m_list):
  for i in range(len(m_list)):
    for j in range(i+1,len(m_list)):
      if 1!=gcd(m_list[i],m_list[j]):
        return 0  #返回0表示不是两两互质的
  return 1  #返回1表示是两两互质的

#获取所有的Mi
def Get_Mi(m_list,M):
  Mi_list=[]
  for mi in m_list:
    Mi_list.append(M//mi)
  return Mi_list

#获取所有的Mi的逆元
def Ge
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值