문서:쇼어 알고리즘

문서의 이전 버전(r3)을 보고 있습니다.

역사 raw
대문 랜덤 문서 최근 토론

1. 개요2. 쇼어 알고리즘의 고전적 구현3. 쇼어 알고리즘의 양자 회로 구현

1. 개요

쇼어 알고리즘(Shor's algorithm)은 다항 시간안에 소인수 분해를 할 수 있는 양자 알고리즘이다. 피터 쇼어(Peter Shor)가 1994년의 논문[1]에서 제안한 알고리즘이다.

쇼어 알고리즘이 중요한 이유는 RSA 암호화와 관련이 있다. RSA 암호화는 큰 소수의 합성수를 소인수로 분해하는 문제는 고전 컴퓨터로 다항 시간에 풀 수 없는 문제로 알려져 있다. 따라서 RSA 암호화 체계는 소인수 분해의 어려움에 기반하여 설계되어 있다고 할 수 있다. 그래서 쇼어의 양자 알고리즘으로 정수의 소인수 분해 문제를 다항 시간 안에 풀 수 있게 되면, RSA 암호화를 사용하는 모든 서비스가 큰 보안 위협에 처하게 된다.

2. 쇼어 알고리즘의 고전적 구현

쇼어 알고리즘은 합동 관계의 주기성을 이용하여 소인수 분해를 한다. 자세한 원리는 이 영상 참조 따라서 쇼어 알고리즘 자체는 고전 컴퓨터로도 구현할 수 있다. 다만, 고전 컴퓨터로 구현한 쇼어 알고리즘은 여전히 지수적인 시간 복잡도를 가지기 때문에, 다항 시간에 소인수 분해를 하려면 양자 컴퓨터를 이용해야 한다.

SHOR'S-FACTORING-ALGORITHM:
Input: 두 개의 소수 p, q의 곱으로 만들어진 합성수 N=p*q
Output: N의 소인수 p, q
Procedure:
1. 1보다 크고 N보다 작은 정수 a를 임의적으로(randomly) 선택한다.
2. 만일 N과 a의 최대공약수 gcd가 1이 아니면, 운이 좋게 소인수 p를 발견한 것이다. 따라서 p=gcd, q=N//gcd를 리턴하고 종료한다.
3. 함수 f(x)=a^x (mod N)의 주기 r을 찾는다.여기서 찾은 주기 r이 짝수가 아니라면, 1번 단계부터 다시 시작한다.
4. 주기 r로부터 두 개의 최대공약수 gcd1=gcd(N, a^(r//2)) + 1), gcd2=gcd(N, a^(r//2)) - 1)를 찾는다.
5. 여기서 찾은 두 개의 수 gcd1, gcd2 중 하나라도 1이라면, 1번 단계부터 다시 시작한다. 아니면, 마침내 소인수들을 찾았으므로 gcd1, gcd2를 리턴하고 종료한다.

상기한 알고리즘을 파이썬으로 구현하면 다음과 같다.
import random 
import math 

def mod_pow(a, x, N):
    y = 1
    while (x > 0):
        if ((x & 1) == 1):
            y = (y * a) % N
        x = x >> 1
        a = (a * a) % N
    return y

def findPeriodByModPow(N, a):
    for x in range(1, N):
        if (mod_pow(a, x, N) == 1):
            return x
    return -1

def factorizeByShor(N):
    while(True):
        a = random.randint(2, N - 1)
        gcd = math.gcd(N, a)
        if (gcd != 1):
            return gcd, N // gcd
        r = findPeriodByModPow(N, a)
        if (r % 2 != 0):
            continue
        gcd1 = math.gcd(N, a**(r//2) + 1)
        gcd2 = math.gcd(N, a**(r//2) - 1)
        if (gcd1 == 1 or gcd2 == 1):
            continue
        return gcd1, gcd2
상기한 쇼어 알고리즘에 대한 상세한 설명과 구현에 대한 해설은 이 영상이 영상을 참고할 수 있다. [2] [3]

3. 쇼어 알고리즘의 양자 회로 구현

쇼어 알고리즘의 주기 찾기 부분을 양자 회로 부분을 구현하기 위해서는 양자푸리에변환(QFT: Quantum Fourier Transform)과 역양자푸리에변환(I-QFT: Inverse-QFT)을 양자 회로로 구현해야 한다.

여기에 대한 자세한 설명은 이 문서를 참고할 수 있다. [4]

[1] Shor, P. W. (1994). Algorithms for quantum computation: discrete logarithms and factoring. In Proceedings 35th annual symposium on foundations of computer science (pp. 124-134). IEEE.[2] 소인수 분해를 위한 쇼어의 양자 알고리즘[3] 쇼어의 소인수 분해 알고리즘 구현[4] Shor's Algorithm in Qiskit Textbook