西电信安密码学基础实验二
实现中国剩余定理
使用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