본문으로 건너뛰기

장 25 쇼어 알고리즘

이제 쇼어 알고리즘을 다룰 차례입니다: M=pqO((logM)2) 시간에 인수분해하는 방법입니다.

이것이 아마도 미국 국가안보국(NSA) 같은 기관들이 양자 컴퓨팅에 수백만 달러를 쏟아붓고 있는 이유일 것입니다.

25.1 고전적인 (역) 푸리에 변환

쇼어 알고리즘의 “핵심 수’는 이른바 양자 푸리에 변환입니다. 푸리에 변환은 데이터에서 주기성을 추출하는 데 사용되며, 그 양자적 대응물은 고전적인 것보다 훨씬 빠른 것으로 밝혀졌습니다.

먼저 정의를 던져 드리겠습니다. N을 양의 정수라 하고, ωN=exp(2πiN)이라 합시다.

정의 25.1.1.

복소수의 튜플이 주어졌을 때

(x0,x1,,xN1)

이산 역 푸리에 변환은 다음과 같이 정의되는 수열 (y0,y1,,yN1)입니다

yk=1Nj=0N1ωNjkxj.

이는 다음 행렬을 적용하는 것과 동치입니다

1N[11111ωNωN2ωNN11ωN2ωN4ωN2(N1)1ωNN1ωN2(N1)ωN(N1)2][x0x1xN1]=[y0y1yN1].

이 연산이 중요한 이유는 xi가 주기적인지 검출할 수 있게 해 주기 때문입니다. 더 일반적으로, 주기 r로 나타나는 1들의 수열이 주어지면, 진폭은 Ngcd(N,r)로 나누어떨어지는 입력값에서 최고점을 이룹니다. 수학적으로는 다음이 성립합니다

xk=j=0N1yjωNjk.
예제 25.1.2 (이산 역 푸리에 변환의 예).

N=6, ω=ω6=exp(2πi6)이고 (x0,x1,x2,x3,x4,x5)=(0,1,0,1,0,1)이라 합시다 (따라서 xi2를 법으로 주기적입니다). 그러면

y0 =16(ω0+ω0+ω0)=1/2
y1 =16(ω1+ω3+ω5)=0
y2 =16(ω2+ω6+ω10)=0
y3 =16(ω3+ω9+ω15)=1/2
y4 =16(ω4+ω12+ω20)=0
y5 =16(ω5+ω15+ω25)=0.

따라서 역변환에서 “진폭”은 모두 3의 배수에 집중되며, 이는 원래 수열의 주기성이 N3=2임을 드러냅니다.

비고 25.1.3.

이 연산이 “역” 푸리에 변환이라 불리는 것은 제가 이해하기로는 대부분 역사적 우연입니다. 혼란스럽게도, 이에 대응하는 양자 연산은 (역이 아닌) 푸리에 변환입니다.

정의를 그대로 적용하면, 변환을 계산하는 데 O(N2) 시간이 걸립니다. 고속 푸리에 변환이라는 고전적 알고리즘(그 세부 사항은 다루지 않겠지만, 사실상 계산을 “재사용”합니다)을 사용하면 이를 O(NlogN) 시간으로 줄일 수 있음이 밝혀져 있습니다. 그러나 쇼어 알고리즘에는 이것으로도 충분하지 않으며, O((logN)2) 정도가 필요합니다. 바로 여기서 양자 푸리에 변환이 등장합니다.

25.2 양자 푸리에 변환

푸리에 변환을 계산하려면 N×N 행렬을 N-벡터와 곱해야 하므로, 이는 O(N2)번의 곱셈이 필요함에 유의하십시오. 그러나 이제 양자 컴퓨터를 사용하면 N=2n일 때 n개의 큐비트로 이루어진 시스템에서 O((logN)2)개의 양자 게이트만으로 이를 수행할 수 있음을 보이려 합니다.

먼저, 표기법을 좀 더 소개합니다:

표기의 남용 25.2.1.

이하에서 |x는 이진법으로 x=xnxn1x1일 때 |xn|xn1|x1을 가리킵니다. 예를 들어 n=3이면 |6은 실제로 |1|1|0을 의미합니다. 마찬가지로, 0.x1x2xn을 이진법으로 표기합니다.

이제 n-큐비트 공간이 정규직교 기저 |0, |1, …, |N1을 가짐에 주목하십시오

정의 25.2.2.

n-큐비트 상태를 생각해 봅시다

|ψ=k=0N1xk|k.

양자 푸리에 변환은 다음과 같이 정의됩니다

UQFT(|ψ)=1Nj=0N1(k=0N1ωNjkxk)|j.

다시 말해, 기저 |0, …, |N1을 사용하면 UQFT는 다음 행렬로 주어집니다

UQFT=1N[11111ωNωN2ωNN11ωN2ωN4ωN2(N1)1ωNN1ωN2(N1)ωN(N1)2]

이는 앞서와 정확히 동일한 정의이지만, UQFT가 유니터리가 되도록 N 인자가 추가되었습니다. 그러나 요령은, 양자적 설정에서는 이 행렬을 다시 쓸 수 있다는 점입니다:

명제 25.2.3 (텐서 표현).

|x=|xnxn1x1이라 합시다. 그러면

UQFT(|xnxn1x1)=1N (|0+exp(2πi0.x1)|1)
(|0+exp(2πi0.x2x1)|1)
(|0+exp(2πi0.xnx1)|1)
증명.

직접(그리고 상당히 성가신) 계산입니다. 요컨대, 모든 것을 전개하면 됩니다. ∎

따라서 혼합 상태를 사용함으로써, 양자 푸리에 변환은 고전적으로는 불가능한 이 “텐서곱에 의한 곱셈” 기법을 사용할 수 있습니다.

이제 더 이상 미루지 말고, 회로를 살펴봅시다. 회전 행렬을 다음과 같이 정의합니다

Rk=[100exp(2πi/2k)].

그러면 n=3일 때 회로는 제어형 Rk들을 사용하여 다음과 같이 주어집니다:

연습문제 25.2.4.

이 회로에서 |x3x2x1의 상이 다음과 같음을 보이십시오

(|0+exp(2πi0.x1)|1)(|0+exp(2πi0.x2x1)|1)(|0+exp(2πi0.x3x2x1)|1)

주장한 대로입니다.

일반적인 n에 대해서는, 이를 귀납적으로 다음과 같이 쓸 수 있습니다

질문 25.2.5.

n=3일 때 표시된 두 회로가 동치임을 스스로 확인해 보십시오.

따라서 양자 푸리에 변환은 O(n2)개의 게이트로 달성 가능하며, 이는 고전적인 고속 푸리에 변환이 달성하는 O(NlogN)번의 연산(여기서 N=2n)보다 엄청나게 낫습니다.

25.3 쇼어 알고리즘

양자 푸리에 변환은 쇼어 알고리즘의 핵심 요소입니다. 이제 이를 갖추었으니, 소인수분해 문제를 풀 수 있습니다.

p,q>3을 홀수 소수라 하고, pq라고 가정합시다. 주요 아이디어는 정수 M=pq를 소인수분해하는 문제를, x(modM)의 위수를 찾는 문제로 바꾸는 것입니다. 후자는 양자 푸리에 변환으로 풀 수 있는 “주기성” 문제입니다. 구체적으로, x(modM)이 다음을 만족하면 좋다고 합시다

  1. (i)

    gcd(x,M)=1,

  2. (ii)

    x(modM)의 위수 r이 짝수이고, 그리고

  3. (iii)

    0(xr/21)(xr/2+1)(modM)을 인수분해하면, 두 인수 중 어느 것도 0(modM)이 아닙니다. 따라서 그중 하나는 p로 나누어떨어지고, 다른 하나는 q로 나누어떨어집니다.

연습문제 25.3.1 (경시 정수론 연습용).

M=pq일 때 (/M)×의 잉여류 중 적어도 절반이 좋은 것임을 보이십시오.

그러므로 임의의 x(/M)×의 위수를 찾을 수 있다면, 좋은 x를 뽑을 때까지 계속 뽑기만 하면 됩니다(이는 절반 이상의 확률로 일어납니다). 일단 그렇게 되면, 유클리드 호제법을 사용하여 gcd(xr/21,M)을 계산함으로써 M의 소인수 중 하나를 뽑아낼 수 있으며, 이로써 문제는 해결됩니다.

이제 이를 어떻게 할까요? 아이디어는 그리 어렵지 않습니다. 먼저 r을 법으로 주기적인 수열을 생성합니다.

예제 25.3.2 (77을 소인수분해하기: 주기 상태 생성하기).

M=77을 소인수분해하려 하며, 무작위로 x=2를 선택하고, 그 위수 r을 찾고자 한다고 합시다. n=13이고 N=213이라 하고, 다음 상태를 초기화하는 것으로 시작합니다

|ψ=1Nk=0N1|k.

이제 (x에 의존하는) 회로 Ux를 만들어 |k|0|k|xkmodM으로 보내도록 합니다. 이를 |ψ|0에 적용하면 다음이 얻어집니다

U(|ψ|0)=1Nk=0N1|k|xkmodM.

이제 두 번째 큐비트를 측정하여 |51 상태를 얻었다고 합시다(2751(mod77)임에 유의하십시오). 그러면 붕괴된 현재 상태는, 스케일링을 제외하면 다음과 같음을 알 수 있습니다

(|7+|7+r+|7+2r+)|51.

사실 병목 지점은 회로 Ux입니다. xk(modM)은 반복 제곱법을 사용하여 계산할 수 있지만, 그럼에도 전체 연산 중 가장 다루기 힘든 부분입니다.

일반적으로, 이 연산은 다음과 같습니다:

  • 충분히 큰 N=2n을 선택합니다(예를 들어, NM2).

  • |ψ=k=02n1|k를 생성합니다.

  • |xkmodM을 계산하는 회로 Ux를 만듭니다.

  • 이를 적용하여 상태 1Nk=02n1|k|xkmodM를 얻습니다.

  • 두 번째 큐비트를 측정하여 첫 번째 큐비트가 r을 법으로 주기적인 무언가로 붕괴하도록 합니다. |ϕ가 왼쪽 큐비트를 나타낸다고 합시다.

이제 왼쪽 큐비트 |ϕ에 양자 푸리에 변환을 적용한다고 합시다: 왼쪽 비트가 r을 법으로 주기적이므로, 우리는 이 변환이 r이 무엇인지 알려줄 것이라고 기대합니다. 안타깝게도 이는 그리 잘 맞아떨어지지 않는데, N은 2의 거듭제곱이지만 r은 그렇지 않을 것으로 예상되기 때문입니다.

그럼에도 불구하고, 다음과 같은 상태를 고려합시다

|ϕ=|k0+|k0+r+

예를 들어 앞서 x=2에서 51을 측정했을 때 k0=7이었습니다. 양자 푸리에 변환을 적용하면, 변환된 이미지에서 |j의 계수가 다음과 같음을 알 수 있습니다

ωNk0j(ωN0+ωNjr+ωN2jr+ωN3jr+)

이것이 단위근들의 합이므로, ωNjr=1이 아닌 한 소멸 간섭이 일어남을 알 수 있습니다(N이 크기 때문입니다). 다시 말해, 근사적으로 다음이 성립합니다

UQFT(|ϕ)0j<Njr/N|j

늘 그렇듯이 스케일링을 제외하면 그렇습니다. 결론적으로 다음이 성립합니다

UQFT|ϕ를 측정하면, jrN이 어떤 s에 가까운 |j를 얻습니다.

그리하여 충분한 운이 따른다면 연분수를 이용하여 r의 값을 추출할 수 있습니다.

예제 25.3.3 (M=77의 인수분해 마무리).

앞서와 마찬가지로 우리는 두 번째 큐비트에 대해 관측을 하였고, 이에 따라 첫 번째 큐비트는 상태 |ϕ=|7+|7+r+로 붕괴합니다. 이제 측정을 하여 j=4642를 얻는데, 이는 어떤 정수 s에 대해 다음이 성립함을 의미합니다

4642r213s.

이제 4642213의 연분수를 분석합니다; 처음 몇 개의 근사분수는 다음과 같음을 알 수 있습니다

0,1,12,47,1323,1730,11522033,

따라서 1730이 좋은 근삿값이며, 이로부터 s=17r=30을 후보로 추론합니다. 그리고 실제로 r=30이 원하는 위수임을 확인할 수 있습니다.

이는 항상 성립하지는 않습니다111일반적인 잡음 문제는 말할 것도 없지만, 그것은 엔지니어들이 걱정할 몫입니다. (예를 들어, 운이 나빠 j=0, 즉 s=0을 측정할 수도 있는데, 이는 우리에게 아무런 정보도 알려주지 않을 것입니다).

그러나

gcd(s,r)=1.

일 때마다 우리가 성공함을 보일 수 있습니다. 이는 최소 1logr의 확률로 일어나며, r<M이므로 이는 충분히 많은 시행이 주어지면 결국 올바른 위수 r을 추출하게 됨을 의미합니다. 이것이 쇼어 알고리즘입니다.