본문으로 건너뛰기

장 25 쇼어 알고리즘

자, 이제 쇼어 알고리즘을 살펴봅시다. M=pq를 O((logM)2) 시간에 인수분해하는 방법입니다.

미국 국가안보국(NSA) 같은 기관들이 양자 컴퓨팅에 수백만 달러를 쏟아부어 온 것은 아마도 바로 이것 때문일 것입니다.

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

쇼어 알고리즘의 “결정적인 한 수”는 이른바 양자 푸리에 변환입니다. 푸리에 변환은 데이터에서 주기성을 추출하는 데 쓰이며, 양자 버전이 고전적인 버전보다 훨씬 빠르다는 사실이 밝혀졌습니다.

먼저 정의부터 제시하겠습니다. N을 양의 정수라 하고, ωN=exp(2πiN)라 합시다.

정의 25.1.1.

복소수 튜플

(x0,x1,…,xN−1)

이 주어지면, 그 이산 역 푸리에 변환은 다음과 같이 정의되는 수열 (y0,y1,…,yN−1)입니다.

yk=1N∑j=0N−1ωNjkxj.

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

1N[111…11ωNωN2…ωNN−11ωN2ωN4…ωN2(N−1)⋮⋮⋮⋱⋮1ωNN−1ωN2(N−1)…ωN(N−1)2][x0x1⋮xN−1]=[y0y1⋮yN−1].

이 연산이 중요한 이유는 xi가 주기적인지 알아낼 수 있게 해 주기 때문입니다. 더 일반적으로, 1이 주기 r로 나타나는 수열이 주어지면 진폭은 Ngcd(N,r)로 나누어떨어지는 입력에서 최대가 됩니다. 수학적으로는 다음이 성립합니다.

xk=∑j=0N−1yjωN−jk.
예제 25.1.2 (이산 역 푸리에 변환의 예).

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

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⟩는 |xn⟩⊗|xn−1⟩⊗⋯⊗|x1⟩을 가리키며, 여기서 x=xnxn−1…x1은 이진법 표기입니다. 예를 들어 n=3이면 |6⟩은 실제로 |1⟩⊗|1⟩⊗|0⟩을 의미합니다. 마찬가지로 0.x1x2…xn도 이진법 표기로 봅니다.

이제 n-큐비트 공간이 정규직교 기저 |0⟩, |1⟩, …, |N−1⟩을 가진다는 것을 관찰하십시오.

정의 25.2.2.

다음과 같은 n-큐비트 상태를 생각합시다.

|ψ⟩=∑k=0N−1xk|k⟩.

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

UQFT(|ψ⟩)=1N∑j=0N−1(∑k=0N−1ωNjkxk)|j⟩.

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

UQFT=1N[111…11ωNωN2…ωNN−11ωN2ωN4…ωN2(N−1)⋮⋮⋮⋱⋮1ωNN−1ωN2(N−1)…ωN(N−1)2]

이는 UQFT가 유니터리가 되도록 N 인자를 추가했다는 점을 제외하면 앞의 정의와 정확히 같습니다. 그러나 요령은 양자 설정에서는 이 행렬을 다음과 같이 다시 쓸 수 있다는 점입니다.

명제 25.2.3 (텐서 표현).

|x⟩=|xnxn−1…x1⟩이라 합시다. 그러면 다음이 성립합니다.

UQFT(|xnxn−1…x1⟩)=1N (|0⟩+exp(2πi⋅0.x1)|1⟩)
⊗(|0⟩+exp(2πi⋅0.x2x1)|1⟩)
⊗…
⊗(|0⟩+exp(2πi⋅0.xn…x1)|1⟩)
증명.

직접 계산하면 되지만, 꽤 번거롭습니다. 요컨대 모든 것을 전개하십시오. ∎

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

이제 더 지체하지 않고 회로를 보이겠습니다. 회전 행렬을 다음과 같이 정의합니다.

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

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

연습문제 25.2.4.

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

(|0⟩+exp(2πi⋅0.x1)|1⟩)⊗(|0⟩+exp(2πi⋅0.x2x1)|1⟩)⊗(|0⟩+exp(2πi⋅0.x3x2x1)|1⟩)

주장한 바와 같습니다.

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

질문 25.2.5.

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

따라서 양자 푸리에 변환은 O(n2)개의 게이트로 구현할 수 있으며, 이는 고전적인 고속 푸리에 변환이 필요로 하는 O(NlogN)번의 연산(여기서 N=2n)보다 월등히 좋습니다.

25.3 쇼어 알고리즘

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

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

  1. (i)

    gcd(x,M)=1,

  2. (ii)

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

  3. (iii)

    0≡(xr/2−1)(xr/2+1)(modM)으로 인수분해하였을 때, 두 인수 모두 0(modM)이 아닙니다. 따라서 둘 중 하나는 p로 나누어떨어지고, 다른 하나는 q로 나누어떨어집니다.

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

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

따라서 임의의 x∈(ℤ/Mℤ)×의 위수를 구할 수 있다면, 좋은 x를 고를 때까지 계속 x를 고르기만 하면 됩니다(이는 절반 이상의 확률로 일어납니다). 그렇게 되면 유클리드 알고리즘을 사용하여 gcd(xr/2−1,M)를 계산해 M의 소인수 중 하나를 추출하고, 이로써 문제가 해결됩니다.

그렇다면 이것을 어떻게 할까요? 아이디어는 그리 어렵지 않습니다. 먼저 법 r에 대해 주기적인 수열을 생성합니다.

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

M=77을 소인수분해하려 하는데, 무작위로 x=2를 골랐고 그 위수 r을 구하고자 한다고 합시다. n=13, N=213이라 두고, 먼저 상태를 다음과 같이 초기화합니다.

|ψ⟩=1N∑k=0N−1|k⟩.

이제 |k⟩|0⟩을 |k⟩|xkmodM⟩으로 보내는 (x에 의존하는) 회로 Ux를 만듭니다. 이를 |ψ⟩⊗|0⟩에 적용하면 다음을 얻습니다.

U(|ψ⟩|0⟩)=1N∑k=0N−1|k⟩⊗|xkmodM⟩.

이제 두 번째 큐비트를 측정하여 |51⟩ 상태를 얻었다고 가정합니다(27≡51(mod77)임에 유의하십시오). 그러면 붕괴된 상태는 이제 상수배를 무시하면 다음과 같습니다.

(|7⟩+|7+r⟩+|7+2r⟩+…)⊗|51⟩.

실제 병목은 회로 Ux입니다. 반복 제곱법을 사용하여 xk(modM)를 계산할 수 있지만, 여전히 이것이 전체 연산에서 번거로운 부분입니다.

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

  • •

    충분히 큰 N=2n을 고릅니다(예를 들어 N≥M2).

  • •

    |ψ⟩=∑k=02n−1|k⟩를 생성합니다.

  • •

    |xkmodM⟩을 계산하는 회로 Ux를 구성합니다.

  • •

    이를 적용하여 상태 1N∑k=02n−1|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(|ϕ⟩)≈∑0≤j<Njr/N∈ℤ|j⟩

여기서 늘 그렇듯 스케일링 차이는 무시합니다. 요점은 다음과 같습니다

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

따라서 운이 충분히 따른다면 연분수를 사용하여 r의 값을 추출할 수 있습니다.

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

앞에서와 같이 두 번째 큐비트를 관측했으므로, 첫 번째 큐비트는 상태 |ϕ⟩=|7⟩+|7+r⟩+…로 붕괴합니다. 이제 측정을 하여 j=4642를 얻었는데, 이는 어떤 정수 s에 대해 다음이 성립함을 뜻합니다

4642r213≈s.

이제 4642213의 연분수를 분석합니다. 처음 몇 개의 수렴은 다음과 같습니다.

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

따라서 1730이 좋은 근사이므로, s=17과 r=30을 후보로 추론합니다. 실제로 r=30이 구하려던 위수임을 확인할 수 있습니다.

이 방법이 항상 통하지는 않습니다111잡음이라는 일반적인 문제는 말할 것도 없지만, 그것은 공학자들이 걱정할 일입니다. (예를 들어 운이 나쁘면 j=0, 즉 s=0을 측정할 수도 있는데, 이는 아무런 정보도 주지 않습니다).

그러나

gcd(s,r)=1.

일 때마다 성공한다는 것을 보일 수 있습니다. 이는 적어도 1logr의 비율로 일어나며, r<M이므로 충분히 많이 시행하면 결국 올바른 위수 r을 추출하게 됩니다. 이것이 쇼어 알고리즘입니다.