시간 방향과 wire
대부분의 회로도에서 시간은 왼쪽에서 오른쪽으로 흐릅니다. 같은 wire 위의 게이트는 순서대로 적용됩니다.
$$
|\psi_{\mathrm{out}}\rangle = U_3U_2U_1|\psi_{\mathrm{in}}\rangle
$$
그림에서는 U_1이 왼쪽, U_3가 오른쪽에 있어도 수식에서는 오른쪽에서 왼쪽으로 작용한다는 점이 중요합니다.
병렬 게이트와 텐서곱
서로 다른 wire에 동시에 놓인 게이트는 텐서곱으로 묶입니다.
$$
(A\otimes B)(|\psi\rangle\otimes|\phi\rangle)
=
A|\psi\rangle\otimes B|\phi\rangle
$$
예를 들어 첫 번째 큐비트에 H, 두 번째 큐비트에 X를 적용하면 전체 연산은 H\otimes X입니다.
측정
측정 기호는 큐비트를 고전 비트로 바꾸는 경계입니다. 계산기저 측정은 상태를 |0\rangle 또는 |1\rangle로 붕괴시키고 결과를 classical register에 기록합니다.
$$
|\psi\rangle=\alpha|0\rangle+\beta|1\rangle
\quad\Rightarrow\quad
\Pr(0)=|\alpha|^2,\quad \Pr(1)=|\beta|^2
$$
측정 뒤에는 보통 더 이상 유니터리 회로가 아닙니다. 중간 측정과 feed-forward를 쓰면 회로는 classical control을 포함한 절차가 됩니다.
회로 동치
두 회로가 모든 입력 상태에 대해 같은 출력을 만들면 같은 회로로 봅니다. 즉 전체 유니터리가 같으면 됩니다.
$$
C_1 \equiv C_2
\quad\Longleftrightarrow\quad
U(C_1)=e^{i\theta}U(C_2)
$$
전역 위상 e^{i\theta}는 측정확률에 영향을 주지 않으므로 회로 동치에서 보통 무시합니다.
작은 예제
Bell 상태 회로는 회로 표기의 핵심을 모두 포함합니다. 먼저 첫 큐비트에 H를 적용하고, 그 큐비트를 control로 CX를 적용합니다.
$$
|00\rangle
\xrightarrow{H\otimes I}
{ |00\rangle+|10\rangle \over \sqrt{2}}
\xrightarrow{\mathrm{CX}}
{ |00\rangle+|11\rangle \over \sqrt{2}}
$$
이 예제는 병렬 게이트, 텐서곱, 제어 게이트, 얽힘을 모두 보여줍니다.
5큐비트 확률 계산 예제
회로를 읽을 때 최종 목표는 “각 비트열이 나올 확률이 얼마인가”를 계산하는 것입니다. 5큐비트 예제로 보겠습니다. 초기 상태를 |00000\rangle라 두고, 첫 두 큐비트에 Hadamard를 적용합니다.
$$
(H\otimes H\otimes I\otimes I\otimes I)|00000\rangle
=
{1\over2}(
|00000\rangle+|01000\rangle+|10000\rangle+|11000\rangle)
$$
이제 1번 큐비트를 control로 3번 큐비트에 CX를, 2번 큐비트를 control로 4번 큐비트에 CX를 건다고 합시다. 그러면 control이 1인 항에서 target만 뒤집힙니다.
$$
{1\over2}(
|00000\rangle+|01010\rangle+|10100\rangle+|11110\rangle)
$$
각 항의 진폭은 모두 1/2입니다. 따라서 각 비트열의 측정 확률은 진폭의 절댓값 제곱입니다.
$$
\Pr(00000)=\Pr(01010)=\Pr(10100)=\Pr(11110)
=\left|{1\over2}\right|^2={1\over4}
$$
나머지 28개 비트열은 진폭이 0이므로 확률도 0입니다. 회로가 복잡해져도 기본 원리는 같습니다. 가능한 basis state의 진폭을 따라가고, 마지막에 절댓값 제곱을 취합니다.
읽는 체크리스트
- wire 수가 몇 개인가?
- 왼쪽에서 오른쪽으로 어떤 게이트가 적용되는가?
- 병렬 게이트는 어떤 텐서곱인가?
- 측정 전에 어떤 상태가 만들어지는가?
- 측정 결과의 확률은 무엇인가?
회로 순서와 행렬곱 순서
양자 회로를 처음 읽을 때 가장 많이 헷갈리는 지점은 그림의 순서와 수식의 곱셈 순서가 반대로 보인다는 점입니다. 회로는 왼쪽에서 오른쪽으로 읽지만, 상태벡터에 작용하는 행렬곱은 가장 오른쪽 행렬이 먼저 작용합니다.
예를 들어 한 큐비트에 X, H, Z를 순서대로 적용하는 회로가 있다고 합시다.
$$
|\psi_{\mathrm{out}}\rangle = ZHX|\psi_{\mathrm{in}}\rangle
$$
이 식을 말로 읽으면 “먼저 X를 적용하고, 그 다음 H를 적용하고, 마지막으로 Z를 적용한다”입니다. 회로 그림의 시간 방향은 왼쪽에서 오른쪽이지만, 행렬이 상태벡터 왼쪽에 계속 붙기 때문에 최종 수식은 ZHX가 됩니다.
이 규칙은 다중 큐비트 회로에서도 그대로 유지됩니다. layer 단위로 보면 아래처럼 쓸 수 있습니다.
$$
|\psi_{\mathrm{out}}\rangle
=
L_mL_{m-1}\cdots L_2L_1|\psi_{\mathrm{in}}\rangle
$$
여기서 L_i는 같은 시간 단계에 병렬로 놓인 게이트들을 텐서곱한 전체 layer 연산입니다.
측정 기저를 바꾸는 회로
기본 측정은 보통 Z basis 측정입니다. 즉 장비는 마지막에 계산기저 |0\rangle,|1\rangle 기준으로 결과를 줍니다. 그런데 X basis로 측정하고 싶다면 측정 직전에 H를 넣으면 됩니다.
$$
\text{measure in X basis}
\quad\equiv\quad
H\text{ then measure in Z basis}
$$
왜냐하면 Hadamard가 |+\rangle를 |0\rangle로, |-\rangle를 |1\rangle로 보내기 때문입니다.
$$
H|+\rangle=|0\rangle,\qquad
H|-\rangle=|1\rangle
$$
마찬가지로 다른 basis 측정도 “측정하고 싶은 basis를 계산기저로 돌려놓는 유니터리”를 먼저 적용한 뒤 Z basis 측정을 하는 방식으로 구현합니다.
Classical control과 feed-forward
측정 결과를 고전 비트에 저장한 뒤, 그 결과에 따라 뒤의 게이트를 조건부로 실행할 수 있습니다. 이때 회로는 더 이상 하나의 순수한 유니터리 행렬로만 설명되지 않습니다. 측정으로 분기가 생기고, 각 분기마다 다른 연산이 적용됩니다.
예를 들어 측정 결과가 1이면 X를 적용하는 classical correction은 아래처럼 말할 수 있습니다.
$$
\rho \mapsto
P_0\rho P_0
+ X P_1\rho P_1 X
$$
여기서 P_0=|0\rangle\langle0|, P_1=|1\rangle\langle1|입니다. 이 표현은 측정과 조건부 보정이 합쳐진 채널로 볼 수 있습니다.
양자 텔레포테이션, 오류정정 syndrome 측정, measurement-based computation에서는 이 feed-forward가 핵심이 됩니다.
회로를 손으로 디버깅하는 법
작은 회로를 디버깅할 때는 전체 행렬을 바로 쓰기보다 basis state를 따라가는 편이 좋습니다.
- 입력 basis state를 하나 고릅니다.
- 각 게이트가 그 basis state를 어디로 보내는지 계산합니다.
- Hadamard나 회전 게이트가 나오면 중첩 항을 펼칩니다.
- 제어게이트가 나오면 각 항마다 control 값이 무엇인지 봅니다.
- 같은 basis state로 모이는 항들의 진폭을 더합니다.
- 마지막에 절댓값 제곱으로 확률을 구합니다.
특히 마지막 5번이 중요합니다. 양자 회로는 같은 결과로 오는 여러 경로의 확률을 더하는 것이 아니라, 진폭을 먼저 더합니다. 그래서 부호와 위상이 맞으면 커지고, 반대면 사라집니다.