Post

Tonelli Shanks Algorithm

Tonelli Shanks Algorithm

목적

$r^2 \equiv a \pmod p$를 만족하는 $r$ 찾기

case : $p = 4k+3$

\(r^2 = (a^{\frac{p+1}{4}})^2 = a^{\frac{p+1}{2}} = a^{\frac{p-1+2}{2}} = a^{\frac{p-1}{2}} \cdot a^1\)

$a$가 Quadratic Residue 라면

\[a^{\frac{p-1}{2}} \equiv 1 \pmod p\] \[r^2 \equiv 1 \cdot a \equiv a \pmod p\]

지수에 $(p+1)/4$만 넣어서 계산하면 바로 제곱근이 나온다

case : $p = 4k+1$

이건 (p+1)/4 가 정수가 아니다.
p-1에 있는 2의 거듭제곱을 하나씩 소모하며 강제로 지수를 정수로 만들기

Image

update parameters

  • $m = i$
  • $c = b^2 \pmod p$
  • $t = t \cdot c \pmod p$
  • $r = r \cdot b \pmod p$
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
def TonelliShanks(n,p):
    assert p%4==1

    # QR확인
    if pow(n,(p-1)//2,p) != 1:
        return None

    # p-1 = Q*2^s
    s = 0
    q = p-1
    while q%2==0:
        s += 1
        q //= 2
    
    # QNR인 z찾기
    # 단순히 2부터 시작해서 Legendre symbol이 -1인 값 찾기
    z = 2
    while pow(z,(p-1)//2,p) != p-1:
        z += 1

    # init
    m = s
    c = pow(z,q,p)
    t = pow(n,q,p)
    r = pow(n,(q+1)//2,p)

    # t를 1로 만들기 위해서 r을 보정해나감
    while True:
        if t==0: return 0
        if t==1: return r

        # t^(2^i) == 1이 되는 최소의 i 찾기
        tmp_t = t
        i = 0
        for i in range(1,m):
            tmp_t = pow(tmp_t,2,p)
            if tmp_t == 1:
                break
        
        # 보정값 b 계산 및 변수 업데이트
        b = pow(c,2**(m-i-1),p)
        m = i
        c = pow(b,2,p)
        t = (t*c)%p
        r = (r*b)%p

if __name__=="__main__":
    a =  
    p = 

    #print(p%4) # 1

    root = TonelliShanks(a,p)
    res = min(root, p-root)
    print(res)

덧붙임

  • Mathematical Assumption: $p$는 소수여야 함. (합성수일 경우 Rabin Cryptosystem의 복호화 영역으로 넘어감)
  • Complexity: $O(\log^4 p)$ 혹은 최적화 시 $O(S^2 \log p)$.
  • Advanced Study:Tonelli-Shanks보다 더 범용적인 Cipolla’s Algorithm.
    • $p \equiv 1 \pmod 4$일 때 $-1$이 항상 Quadratic Residue인 이유 (제 1 보충법칙).
This post is licensed under CC BY 4.0 by the author.