當前位置:律師網大全 - 專利申請 - 求模平方根的算法(答案完整後我會加更多分數)

求模平方根的算法(答案完整後我會加更多分數)

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

#!/usr/bin/python

#編碼=gbk

導入數學

Def quick _ algorithm (a,b,c): # y = a b% c,a的b次方除以c。

a = a % c

ans = 1

#我們不需要考慮B

而b!= 0: #費馬定理

如果b & amp1:

ans = (ans * a) % c

b & gt& gt=1

a = (a * a) % c

返回答案

Def IsHaveMoSqrt(x,P):#是否有模平方根y*y=x mod p,給定x,P,判斷是否有y。

ret = quick_algorithm(x,(P-1)//2,P)

如果ret==1:

返回True

否則:

返回False

Def GetMoSqrt(x,P):#求模y*y=x mod p的平方根,其中x已知,P求y。

if(IsHaveMoSqrt(x,P)==1):

t=0

s = p-1 # p-1 =(2t)* s//s是奇數。

而s%2==0:

s=s//2

t=t+1

if(t==1):

ret = quick_algorithm(x,(s+1)//2,P)

返回(ret,P-ret)

elif(t & gt;=2):

x _ =快速算法(x,P-2,P)

n=1

while(IsHaveMoSqrt(n,P)==1):

n=n+1

b =快速算法(n,s,P)

打印(b)

ret = quick_algorithm(x,(s+1)//2,P)#t-1

t_=0

while(t-1 & gt;0):

if(quick_algorithm(x_*ret*ret,2**(t-2),P)==1):

ret =返回

否則:

ret = ret *(b * *(2 * * t _)% P

t=t-1

t_=t_+1

返回(ret,P-ret)

否則:

返回(-2,-2)

否則:

返回(-1,-1)

defsecp 256k 1 getybyx(x):# y ^ 2 = x ^ 3+7(mod p)根據x求y。

a =(x * x * x+7)% 0x fffffffffffffffffffffffffffffffffffffffffffffff 2f

ret = GetMoSqrt(a,0x fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 2f)

返回ret

if __name__ == "__main__ ":

如果為真:

x = 0x 79 be 667 ef 9 dcb ba 55 a 06295 ce 870 b 07029 bfc db 2 DCE 28d 959 f 2815B 1798 #私鑰是1,對應的公鑰x。

ret = secp 256k 1 getybyx(x)# secp 256k 1,根據x求y。

print("x=%x" % (x))

print("y=%x" % (ret[0]))

print("y=%x" % (ret[1]))

打印("")

X=1#x最小值

ret = secp 256k 1 getybyx(x)# secp 256k 1,根據x求y。

print("x=%x" % (x))

print("y=%x" % (ret[0]))

print("y=%x" % (ret[1]))

打印("")

x = 0x fffffffffffffffffffffffffffffffffffffffffffffffffffffff c2f-3 # x最大值。

ret = secp 256k 1 getybyx(x)# secp 256k 1,根據x求y。

print("x=%x" % (x))

print("y=%x" % (ret[0]))

print("y=%x" % (ret[1]))

打印("")

輸入()

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

  • 上一篇:《計算機應用能力》4個模塊考試在哪裏報名?具備條件是什麽?報名時間及成績查詢時間?
  • 下一篇:全國面條十大排行榜
  • copyright 2024律師網大全