Python实现简易中国剩余定理(信安密码实验)

西电信安密码学基础实验二

实现中国剩余定理

使用Python实现
题目要求实现三个大整数下的同余方程求解X的值,若无法求得则输出不能直接使用中国剩余定理求解
源代码:

import math
def exgcd(a, b):
    if b == 0:
        return 1, 0, a
    else:
        x, y, q = exgcd(b, a % b)
        x, y = y, (x - (a // b) * y)
        return x, y, q

filename = (input("请输入文件路径:"))
with open(filename, 'r') as f:
    lines =f.readlines()
number = list(map(int, lines))
if math.gcd(number[3], number[4]) == 1 and \
        math.gcd(number[3], number[5]) == 1 and \
        math.gcd(number[4], number[5]) == 1:
        M = number[3]*number[4]*number[5]
        M1 = number[4]*number[5]
        M2 = number[3]*number[5]
        M3 = number[3]*number[4]
        x1 = (M1 * exgcd(M1, number[3])[0] * number[0]) % M
        x2 = (M2 * exgcd(M2, number[4])[0] * number[1]) % M
        x3 = (M3 * exgcd(M3, number[5])[0] * number[2]) % M
        x = (x1+x2+x3) % M
        print(x)
else:
    print("不能直接利用中国剩余定理\n")

输入样例:

5963533518323759992554607177430867358486851282034825468613195536233474229748227497105997065615017822867937430259877578637549250133081396303549824197515580096551093277283532310046598789715143661789924175678686515394584704002698912400360544349584105053
7452147498938949476823918277259388511208314795517506630131639522869476931664319331999287065159813243159220658294359000834379144325299074839188183145751865959915395944123238452146817998590504704409144177253981983496408422851304571062742872070053597781
9791553188843350711911320803153869584042064903057744938846414791049993340267839296583573667229339667423378978993973059594193467223787912526408229270166113282331353592137037653549309808543886438135335025330344634355726311631692287157836010187549697033
736026894520013145053959893041907103801786277875074808043094679021048591904886572241063599195186281186045410287408340438501951106621035951386659621670588327954137474402459141720940937736412438057497469266151389553294232028234435749687861420081325499806705696003250405278239467097419352576463355243047
822133543134400325816236583808204657546644575118717165226138158817090803490095076646561687767071855511032867989547540228102384603044671232082169916159817973775601566972952016094980712601001651606854901098178067592170128901984368176059683470221479398450343749445851362633660071533865039629449293643181
666862214073229347457363746613972922639274081936663778780666180616990715201034304434823629318786074033107938413965200245547739283841506412360219950769580551911651386910043030289964724519173587731635947680115173597573559458235634593301646388624380695138506650044135228891892580966398311773634400428043

输出结果为:

54286485024828907354857288089411369865034798462588000558033765835452340302699828764109049198781063914593499627237505940007512785519720408457678374405096001225287692488071307375231734537841645264756505862194417470051950531780129585141440411353512519138808501450506699656130515188506166939319522359514049940653937248534966980768494213835598526392136962661882436417669265907424779356524892639345005568791319529360375069880910979199010559372463516459785072109488743264191398038629009954886330973666040246189140965124535308941040227416991909519778789014064128541586554906220405615290292481303965564744236694592157536889399052980756296286674968903855409045308143102611163019809571142018059129298028879234615358079820914684050591384278968377024684446820492344838500137705967056963932008984232485004061234234130347945333491896311246063868764665908369312889053995280922084157488759177250559310275929015078988

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值