제7장. 양자 오류 정정 코드 (QECC)

6장에서 우리는 현실의 큐빗이 \(X\)(비트 플립), \(Z\)(위상 플립), \(Y\)(둘 다)라는 이산적인 오류에 노출된다는 것을 배웠습니다. 만약 이 오류를 수정할 수 없다면, 양자 컴퓨터는 몇 개의 게이트만 거쳐도 결어긋남으로 인해 모든 정보가 무작위적인 잡음으로 변해버릴 것입니다.

하지만 양자 정보는 어떻게 “수정”할 수 있을까요? 고전 컴퓨터는 ’1’을 ’111’로 복제하여 나중에 다수결로 오류를 찾습니다. 하지만 양자역학은 복제 불가능 원칙(No-Cloning Theorem) 때문에 임의의 큐빗 상태 \(|\psi\rangle = \alpha|0\rangle + \beta|1\rangle\)를 복제하는 것을 근본적으로 금지합니다.

양자 오류 정정 코드(QECC)는 ‘복제’나 ’직접 측정’(중첩을 붕괴시키는) 없이, 정보를 여러 큐빗에 분산(인코딩)하고, 보조 큐빗(ancilla)을 이용해 오류의 ’증상’만을 알아내는 놀라운 기법입니다.


1. 기본 개념 (Fundamental Concepts)

  • 복제 불가능 원칙 (No-Cloning Theorem): 알려지지 않은 임의의 양자 상태 \(|\psi\rangle\)를 복사하여 \(|\psi\rangle|\psi\rangle\)로 만드는 유니터리 연산자는 존재하지 않습니다. 이는 양자역학의 선형성(linearity)에 위배됩니다.

    상세 설명: 만약 복제 연산자 \(U\)가 존재한다면, \(U|\psi_A\rangle|0\rangle = |\psi_A\rangle|\psi_A\rangle\) 이고 \(U|\psi_B\rangle|0\rangle = |\psi_B\rangle|\psi_B\rangle\) 여야 합니다. 선형성에 의해, \(U(\alpha|\psi_A\rangle + \beta|\psi_B\rangle)|0\rangle = \alpha|\psi_A\rangle|\psi_A\rangle + \beta|\psi_B\rangle|\psi_B\rangle\) 입니다. 하지만 우리가 복제하려는 상태는 \((\alpha|\psi_A\rangle + \beta|\psi_B\rangle)\)이므로, 복제 결과는 \((\alpha|\psi_A\rangle + \beta|\psi_B\rangle) \otimes (\alpha|\psi_A\rangle + \beta|\psi_B\rangle)\) 이어야 합니다. 이 두 결과는 \(\alpha\beta\)의 교차항 때문에 명백히 다릅니다.

  • 오류 정정의 3단계:

    1. 인코딩 (Encoding): 1개의 ‘논리 큐빗’(\(|\psi\rangle_L\)) 정보를 \(n\)개의 ’물리 큐빗’으로 분산시켜 얽습니다.
    2. 신드롬 측정 (Syndrome Measurement): 원본 데이터는 건드리지 않고, 보조 큐빗(ancilla)을 사용하여 오류가 ‘발생했는지’, ‘어떤 종류인지’, ’어디서 발생했는지’에 대한 정보(신드롬)만 추출합니다.
    3. 복구 (Recovery): 측정된 신드롬에 해당하는 복구 연산(예: \(X_3\))을 적용하여 오류를 되돌립니다.
  • 신드롬 (Syndrome) - 오류의 증상: 핵심 아이디어는 데이터의 상태(\(\alpha, \beta\))를 묻지 않고 오류 정보만 얻는 것입니다.

    • 예: 3-큐빗 코드에서, 우리는 1번 큐빗이 \(|0\rangle\)인지 \(|1\rangle\)인지 묻지 않습니다.
    • 대신, “1번 큐빗과 2번 큐빗의 상태가 (오류가 없었어야 할 상태에 비해) 같은가, 다른가?” 만을 묻습니다.
    • 이 “같음/다름” 정보가 바로 신드롬이며, 이는 \(\alpha, \beta\)의 중첩을 붕괴시키지 않습니다.
  • 코드 공간 (Code Space): 인코딩된 ’논리적 0’과 ’논리적 1’이 머무는 \(n\)-큐빗 힐베르트 공간의 2차원 부분공간입니다.

    • \(|0\rangle_L = \text{인코딩된 0 상태}\)
    • \(|1\rangle_L = \text{인코딩된 1 상태}\)
    • 일반 논리 상태: \(|\psi\rangle_L = \alpha|0\rangle_L + \beta|1\rangle_L\)

2. 기호 및 핵심 관계식

  • 논리적 상태 (Logical States): \(|\psi\rangle_L = \alpha|0\rangle_L + \beta|1\rangle_L\)

  • 오류 연산자 (Error Operators): “양자역사” 5장의 크라우스 연산자 \(\{K_i\}\) (여기서는 \(X_1, Z_3\) 등)

  • 신드롬 측정 연산자 (Syndrome Operators): 오류를 탐지하는 헤르미트 연산자(관측량) 집합 \(\{M_k\}\)입니다. (예: \(Z_1 Z_2\), \(Z_2 Z_3\))

    • 오류 없는 상태의 조건: 코드 공간의 모든 상태 \(|\psi\rangle_L\)는 모든 \(M_k\)의 공통 고유 상태(보통 고유값 +1)여야 합니다. \(M_k |\psi\rangle_L = (+1) |\psi\rangle_L\).
  • 오류 탐지: 만약 오류 \(E\)가 발생하면, \(|\psi'\rangle = E |\psi\rangle_L\)가 됩니다. 이때 \(M_k\)\(E\)반교환(anti-commute)하면(\(M_k E = -E M_k\)), 신드롬이 바뀝니다. \(M_k |\psi'\rangle = M_k E |\psi\rangle_L = -E M_k |\psi\rangle_L = -E |\psi\rangle_L = -|\psi'\rangle\).

    • 측정된 고유값이 \(+1\)에서 \(-1\)로 바뀌었으므로, 오류 \(E\)가 발생했음을 알 수 있습니다.
  • 복구 (Recovery): 신드롬 \(s\)가 측정되면, 그에 맞는 복구 연산 \(R_s\)를 적용하여 \(R_s E |\psi\rangle_L \propto |\psi\rangle_L\) 로 되돌립니다.


3. 손쉬운 예제 (Examples with Deeper Insight)

예제 1: 3-큐빗 비트 플립 코드 (\(X\) 오류 정정)

  • 목표: 1-큐빗 \(X\) 오류(예: \(X_1, X_2, X_3\))를 탐지하고 수정합니다.

  • 인코딩 (Encoding): (고전적 반복과 유사하지만, 중첩이 가능)

    • \(|0\rangle_L = |000\rangle\)
    • \(|1\rangle_L = |111\rangle\)
    • 논리 상태: \(|\psi\rangle_L = \alpha|000\rangle + \beta|111\rangle\)
  • 신드롬 연산자 (Syndrome Operators): “이웃과 같은가?”

    • \(M_1 = Z_1 Z_2\) (1-2번 큐빗의 Z-패리티)
    • \(M_2 = Z_2 Z_3\) (2-3번 큐빗의 Z-패리티)
  • 신드롬 측정 (작동 원리):

    • 오류 없음 (\(I\)): \(|\psi\rangle_L\)\(M_1\)을 적용하면, \(Z_1 Z_2 |000\rangle = (+1)|000\rangle\) 이고 \(Z_1 Z_2 |111\rangle = (+1)|111\rangle\) 이므로, 고유값은 항상 \(+1\)입니다. \(M_2\)\(+1\).
      • 신드롬: (+1, +1) \(\equiv\) (0, 0)
    • \(X_1\) 오류 (\(X_1 \otimes I \otimes I\)):
      • \(|\psi'\rangle = X_1 |\psi\rangle_L = \alpha|100\rangle + \beta|011\rangle\)
      • \(M_1\) 측정: \(Z_1 Z_2 |100\rangle = (-1)|100\rangle\), \(Z_1 Z_2 |011\rangle = (-1)|011\rangle\). 고유값 \(-1\).
      • \(M_2\) 측정: \(Z_2 Z_3 |100\rangle = (+1)|100\rangle\), \(Z_2 Z_3 |011\rangle = (+1)|011\rangle\). 고유값 \(+1\).
      • 신드롬: (-1, +1) \(\equiv\) (1, 0)
    • \(X_2\) 오류:
      • \(M_1\) 측정: 고유값 \(-1\).
      • \(M_2\) 측정: 고유값 \(-1\).
      • 신드롬: (-1, -1) \(\equiv\) (1, 1)
  • 복구 (Recovery): | 신드롬 | 측정된 고유값 (\(M_1, M_2\)) | 탐지된 오류 | 복구 연산 | | :— | :— | :— | :— | | (0, 0) | (+1, +1) | 오류 없음 | \(I\) (아무것도 안 함) | | (1, 0) | (-1, +1) | \(X_1\) 오류 | \(X_1\) 적용 | | (1, 1) | (-1, -1) | \(X_2\) 오류 | \(X_2\) 적용 | | (0, 1) | (+1, -1) | \(X_3\) 오류 | \(X_3\) 적용 |

  • 💡 상세 설명 (정보를 붕괴시키지 않는 이유)

    신드롬 \(M_1 = Z_1 Z_2\)을 측정할 때, 우리는 \(\alpha|100\rangle + \beta|011\rangle\) 상태 전체에 대해 “고유값이 \(-1\)이다”라는 단일한 정보만 얻습니다. 이 측정은 \(|\psi'\rangle\)\(\alpha|100\rangle\) 또는 \(\beta|011\rangle\)로 붕괴시키지 않습니다. 왜냐하면 두 항(\(|100\rangle, |011\rangle\)) 모두가 \(M_1\)에 대해 동일한 고유값 \(-1\)을 가지므로, 측정 후에도 이 둘의 중첩 상태가 그대로 보존되기 때문입니다. 즉, \(\alpha, \beta\)에 대한 정보(우리가 지키려는 정보)는 숨겨진 채, 오류(\(X_1\))에 대한 정보만 밖으로 빼내는 데 성공한 것입니다.

예제 2: 3-큐빗 위상 플립 코드 (\(Z\) 오류 정정)

  • 목표: 1-큐빗 \(Z\) 오류를 수정합니다.
  • 핵심 트릭: “양자역학” 2장의 \(HXH=Z\) 관계를 이용합니다. \(Z\) 오류는 하다마드(\(H\)) 기저에서 \(X\) 오류와 같습니다.
  • 인코딩 (Encoding): 비트 플립 코드의 모든 큐빗에 \(H\)를 적용합니다.
    • \(|0\rangle_L = H^{\otimes 3}|000\rangle = |+++\rangle = \frac{1}{\sqrt{8}}(|0\rangle+|1\rangle)(|0\rangle+|1\rangle)(|0\rangle+|1\rangle)\)
    • \(|1\rangle_L = H^{\otimes 3}|111\rangle = |--- \rangle = \frac{1}{\sqrt{8}}(|0\rangle-|1\rangle)(|0\rangle-|1\rangle)(|0\rangle-|1\rangle)\)
  • 오류 (\(Z_1\)): \(Z_1\) 오류가 발생하면 \(|\psi\rangle_L = \alpha|+++\rangle + \beta|--- \rangle\)\(|\psi'\rangle = Z_1(\alpha|+++\rangle + \beta|--- \rangle) = \alpha(Z_1|{+}\rangle)|++\rangle + \beta(Z_1|{-}\rangle)|--\rangle\) \(Z_1|{+}\rangle = |{-}\rangle\) 이고 \(Z_1|{-}\rangle = |{+}\rangle\) 이므로, \(|\psi'\rangle = \alpha|-++\rangle + \beta|+-- \rangle\). (비트 플립 코드의 \(X_1\) 오류와 형태가 같음)
  • 신드롬 연산자: \(X\) 오류를 잡기 위해 \(Z_i Z_j\)를 썼듯이, \(Z\) 오류를 잡기 위해 \(X_i X_j\)를 씁니다.
    • \(M_1 = X_1 X_2\)
    • \(M_2 = X_2 X_3\)
  • 복구: \(X\) 오류와 동일한 신드롬 테이블을 사용하되, 복구 연산으로 \(X_k\) 대신 \(Z_k\)를 적용합니다.

예제 3: 9-큐빗 쇼어 코드 (모든 단일 큐빗 오류 정정)

  • 목표: \(X, Z, Y\) 중 어떤 오류가 9개 큐빗 중 하나에 발생하든 모두 정정합니다.
  • 인코딩 (두 코드의 결합):
    1. 위상 보호 (외부 코드): 먼저 1큐빗을 3큐빗 위상 플립 코드로 인코딩합니다. \(|\psi\rangle = \alpha|0\rangle + \beta|1\rangle \to |\psi_{step1}\rangle = \alpha|+++\rangle + \beta|--- \rangle\)
    2. 비트 보호 (내부 코드): 위 3개의 큐빗 각각을 다시 3-큐빗 비트 플립 코드로 인코딩합니다. (총 \(3 \times 3 = 9\) 큐빗) \(|+\rangle \to |+\rangle_L = \frac{1}{\sqrt{2}}(|000\rangle + |111\rangle)\) \(|-\rangle \to |-\rangle_L = \frac{1}{\sqrt{2}}(|000\rangle - |111\rangle)\)
    3. 최종 상태 (매우 복잡한 9큐빗 얽힘 상태): \(|0\rangle_L = \frac{1}{\sqrt{8}}(|000\rangle+|111\rangle)(|000\rangle+|111\rangle)(|000\rangle+|111\rangle)\) \(|1\rangle_L = \frac{1}{\sqrt{8}}(|000\rangle-|111\rangle)(|000\rangle-|111\rangle)(|000\rangle-|111\rangle)\)
  • 신드롬 측정:
    • 3개의 큐빗으로 이루어진 각 블록(1-3, 4-6, 7-9) 내부에서 \(Z_i Z_{i+1}\) 타입의 비트 플립 신드롬을 측정합니다. (총 6개의 측정)
    • 3개의 블록 \(X_i X_j\) 타입의 위상 플립 신드롬을 측정합니다. (총 2개의 측정)
    • 총 8개의 신드롬 측정으로 9개 큐빗 중 어디에 \(X\) 또는 \(Z\) 오류가 났는지 정확히 식별할 수 있습니다.
  • 💡 상세 설명 (Y 오류는 어떻게?): > “양자역사” 6장에서 \(Y = iXZ\) 임을 배웠습니다. 만약 \(Y_1\) 오류가 발생하면, 이는 \(X_1\) 오류와 \(Z_1\) 오류가 동시에 1번 큐빗에 발생한 것과 같습니다. > 쇼어 코드는 비트 플립 신드롬을 통해 \(X_1\) 오류를 감지하고, 위상 플립 신드롬을 통해 \(Z_1\) 오류를 감지합니다. 두 신드롬이 모두 1번 큐빗을 가리키면, 우리는 복구 연산으로 \(Y_1 = iXZ\) (또는 그냥 \(XZ\))를 적용하여 두 오류를 동시에 수정합니다. (전역 위상 \(i\)는 무시 가능) > 이로써 우리는 모든 단일 큐빗 오류를 정정할 수 있습니다.

4. 연습문제

  1. 신드롬 계산: 3-큐빗 비트 플립 코드에서 3번 큐빗에 \(X_3\) 오류가 발생했을 때, \(M_1 = Z_1 Z_2\)\(M_2 = Z_2 Z_3\)의 고유값이 어떻게 나오는지 계산하십시오.
  2. 회로 그리기: 3-큐빗 비트 플립 코드에서 \(M_1 = Z_1 Z_2\)의 신드롬을 측정하는 양자 회로를 2개의 CNOT 게이트와 1개의 보조 큐빗(ancilla)을 이용해 그리십시오. (힌트: 보조 큐빗을 제어로 사용)
  3. 오류 교차: 3-큐빗 비트 플립 코드(\(|000\rangle, |111\rangle\))가 \(X\) 오류 대신 \(Z_1\) 위상 플립 오류를 겪었다고 가정합니다. 신드롬 연산자(\(M_1, M_2\))가 이 오류를 탐지할 수 있습니까? 그 이유는 무엇입니까?
  4. 쇼어 코드 용량: 9-큐빗 쇼어 코드는 \(n=9\)개의 물리 큐빗을 사용하여 \(k=1\)개의 논리 큐빗을 보호합니다. 이 코드가 \(t=1\)개의 단일 큐빗 오류를 수정할 수 있을 때, 이 \((n, k, d)\) 파라미터(단, \(d=2t+1\))는 무엇이라고 부릅니까? (상식 문제)

5. 해설

  1. \(|\psi'\rangle = X_3 |\psi\rangle_L = \alpha|001\rangle + \beta|110\rangle\).
    • \(M_1 = Z_1 Z_2\): \(Z_1 Z_2 |001\rangle = (+1)|001\rangle\), \(Z_1 Z_2 |110\rangle = (+1)|110\rangle\). 고유값 +1.
    • \(M_2 = Z_2 Z_3\): \(Z_2 Z_3 |001\rangle = (-1)|001\rangle\), \(Z_2 Z_3 |110\rangle = (-1)|110\rangle\). 고유값 -1.
    • 신드롬: (+1, -1) \(\equiv\) (0, 1). (예제 1의 표와 일치)
  2. 보조 큐빗(ancilla)을 \(|0\rangle_a\)로 준비하고 H 게이트를 적용 \(\to |+\rangle_a\). \(|0\rangle_a \to [H] \to \bullet (\text{제어}) \to \bullet (\text{제어}) \to [H] \to \text{측정}\) \(\quad \quad \quad \quad \quad | \quad \quad \quad \quad |\) \(|q_1\rangle \to \quad \quad \oplus (\text{대상}) \quad \quad\) \(|q_2\rangle \to \quad \quad \quad \quad \quad \oplus (\text{대상})\) (수정) \(Z\) 연산자를 측정하는 것은 CNOT의 방향이 반대입니다. \(|0\rangle_a \to [H] \to \text{CNOT(제어:q1, 대상:a)} \to \text{CNOT(제어:q2, 대상:a)} \to [H] \to \text{측정}\) (재수정) \(Z_1 Z_2\) 측정은 더 간단합니다. \(|0\rangle_a \to \text{CNOT(제어:q1, 대상:a)} \to \text{CNOT(제어:q2, 대상:a)} \to \text{측정}\) (H 게이트 없음) 보조 큐빗을 \(|0\rangle\)으로 준비. CNOT(1->a) \(\to\) CNOT(2->a) \(\to\) 보조 큐빗 측정. 측정 결과가 ’1’이면 고유값 -1, ’0’이면 +1을 의미합니다.
  3. \(|\psi'\rangle = Z_1 |\psi\rangle_L = Z_1(\alpha|000\rangle + \beta|111\rangle) = \alpha|000\rangle - \beta|111\rangle\).
    • \(M_1 = Z_1 Z_2\): \(Z_1 Z_2(\alpha|000\rangle - \beta|111\rangle) = \alpha(+1)|000\rangle - \beta(+1)|111\rangle = +1 |\psi'\rangle\).
    • \(M_2 = Z_2 Z_3\): \(Z_2 Z_3(\alpha|000\rangle - \beta|111\rangle) = \alpha(+1)|000\rangle - \beta(+1)|111\rangle = +1 |\psi'\rangle\).
    • 신드롬은 (0, 0)입니다. \(Z\) 오류는 탐지되지 않습니다. 비트 플립 코드는 \(X\) 오류에만 특화되어 있으며, \(Z\) 오류에는 완전히 무방비합니다.
  4. \(n=9\) (물리 큐빗 수), \(k=1\) (논리 큐빗 수), \(t=1\) (수정 가능 오류 수). 오류 코드의 ‘거리(distance)’ \(d\)\(d=2t+1\)로 정의됩니다. \(t=1\)이므로 \(d=3\)입니다. 이를 \([[n, k, d]]\) 코드로 표기하며, 쇼어 코드는 [[9, 1, 3]] 코드입니다.