#! /usr/bin/파이썬
# 인코딩 =gbk
수학을 도입하다
Def quick _ algorithm (a, b, c): # y = a b% c, a 의 b 제곱을 c 로 나눕니다.
A = a% c
Ans = 1
# 우리는 b 에 대해 생각할 필요가 없습니다.
그리고 b! = 0: # 페르마 정리
B& 1:
Ans = (ans * a)% C.
B>& 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> 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)
Defs ECP 256k1getybyx (x): # y 2 = x 3+7 (mod p) x 에 따라 y 를 구합니다.
A = (x * x+7)% 0x ffffffffffffffffffffffffffffffffffffffffffffffffffffff 2f
Ret = GetMoSqrt(a, 0x ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 2f)
Ret 로 돌아가기
If __name__ == "__main__ ":
True 인 경우:
X = 0x79be667ef9 dcbba55 a06295 ce870b07029 bfc DB2 DCE 28d959f28 1 5b1798 # 개인 키는/kloc-;
Ret = secp 256k1getybyx (x) # secp 256k1,x 에 따라 y 를 찾습니다.
인쇄 ("x =% x"% (x))
Print("y=%x"% (ret[0]))
Print("y=%x"% (ret[ 1]))
인쇄 ("")
X= 1#x 최소값
Ret = secp 256k1getybyx (x) # secp 256k1,x 에 따라 y 를 찾습니다.
인쇄 ("x =% x"% (x))
Print("y=%x"% (ret[0]))
Print("y=%x"% (ret[ 1]))
인쇄 ("")
X = 0x ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2f-3 # x 최대.
Ret = secp 256k1getybyx (x) # secp 256k1,x 에 따라 y 를 찾습니다.
인쇄 ("x =% x"% (x))
Print("y=%x"% (ret[0]))
Print("y=%x"% (ret[ 1]))
인쇄 ("")
() 를 입력합니다
※ 251;※※※※※※※※※※※※※※※※※※※※※