현재 위치 - 법률 상담 무료 플랫폼 - 특허 조회 - 제곱근을 구하는 알고리즘 (답이 완성되면 더 많은 점수를 더하겠습니다.)
제곱근을 구하는 알고리즘 (답이 완성되면 더 많은 점수를 더하겠습니다.)
※ 251;※※※※※※※※※※※※※※※※※※※※※𔉷𔉷𔉷

#! /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;※※※※※※※※※※※※※※※※※※※※※𔉷𔉷𔉷