Deutsch-Jozsa 알고리즘 — 단 한 번의 오라클 평가
Deutsch-Jozsa 알고리즘은 함수가 상수 함수인지 균형 함수인지를 고전적으로는 최악의 경우 지수 번 평가해야 하는 문제를 단 한 번의 양자 오라클 호출로 해결한다. 중첩·위상 반전·양자 간섭을 결합하여 지수적 속도 향상이 원리적으로 가능함을 최초로 명확히 보여준 알고리즘이다.
개념 소개
인 함수가 블랙박스(오라클)로 주어진다고 하자. 이 함수는 다음 두 유형 중 하나임이 보장된다.
- 상수 함수(constant): 모든 입력에 대해 출력이 동일 (전부 0 또는 전부 1)
- 균형 함수(balanced): 정확히 절반의 입력에서 0, 나머지 절반에서 1을 출력
고전 결정론적 알고리즘은 최악의 경우 번 오라클을 호출해야 한다. 앞서 번을 모두 같은 값으로 받아도, 마지막 한 번을 더 호출하기 전까지는 상수 함수인지 확신할 수 없기 때문이다. Deutsch-Jozsa 알고리즘은 이를 단 한 번의 오라클 호출로 해결한다.
핵심 원리
알고리즘은 개의 데이터 큐비트와 1개의 보조(ancilla) 큐비트를 사용한다.
초기 상태
1단계: 전체 아다마르 변환
모든 큐비트에 아다마르 게이트 를 적용한다.
데이터 큐비트는 가능한 모든 입력의 균등 중첩이 되고, 보조 큐비트는 상태가 된다.
2단계: 오라클 적용 (위상 반전)
오라클은 위상 반전(phase kickback) 방식으로 동작한다.
함수값 가 진폭의 위상으로 인코딩된다.
3단계: 데이터 큐비트에 아다마르 재적용
아다마르 변환의 일반식 을 이용하면, 최종 상태에서 의 진폭은 다음과 같다.
- 가 상수 함수이면: 모든 항의 부호가 같아
- 가 균형 함수이면: 양수 항과 음수 항이 정확히 상쇄되어
4단계: 측정
데이터 큐비트를 계산 기저로 측정한다. 모두 이면 상수 함수, 그렇지 않으면 균형 함수다.
예시·응용
Qiskit 구현 예시
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
def deutsch_jozsa_circuit(oracle, n):
qc = QuantumCircuit(n + 1, n)
qc.x(n) # 보조 큐비트 |1⟩ 초기화
qc.h(range(n + 1)) # 전체 아다마르
qc.compose(oracle, inplace=True) # 오라클
qc.h(range(n)) # 데이터 큐비트 아다마르 재적용
qc.measure(range(n), range(n))
return qc
# 균형 오라클 예시: f(x) = x_0 (CNOT 하나)
n = 3
balanced_oracle = QuantumCircuit(n + 1)
balanced_oracle.cx(0, n)
qc = deutsch_jozsa_circuit(balanced_oracle, n)
sim = AerSimulator()
counts = sim.run(transpile(qc, sim), shots=1).result().get_counts()
print(counts) # 예: {'001': 1} → 000이 아니므로 균형 함수
고전 vs 양자 오라클 호출 횟수
| 알고리즘 | 최선 | 최악 |
|---|---|---|
| 고전 결정론적 | 2회 | 회 |
| 고전 확률론적 | O(1) | O(1) (오류 허용 시) |
| Deutsch-Jozsa | 1회 | 1회 |
이론적 의의
이 알고리즘의 실용적 응용은 제한적이나, 양자 병렬성(모든 입력을 동시에 탐색)과 간섭(불필요한 정보의 소거)이 결합될 때 고전 대비 지수적 이점이 생긴다는 것을 최초로 형식적으로 증명했다. 이후 Simon 알고리즘, Shor 알고리즘 등 실용적 양자 알고리즘의 구조적 토대가 됐다.
정리
Deutsch-Jozsa 알고리즘의 핵심 흐름은 세 단계로 요약된다: 아다마르 변환으로 모든 입력을 중첩 상태에 올리고, 오라클이 함수값을 위상으로 인코딩하며, 다시 아다마르 변환을 적용해 간섭으로 함수의 전역 성질을 한 번에 읽어낸다. 위상 반전 → 간섭 → 측정이라는 이 패턴은 이후 등장하는 수많은 양자 알고리즘에서 반복적으로 나타나는 핵심 구조다.
연습문제
Q1.데이터 큐비트가 $n=2$일 때, 균형 함수의 구체적인 예시 하나를 들고, 이 함수에 대한 Deutsch-Jozsa 회로가 최종적으로 $|00\rangle$ 이외의 결과를 내는 이유를 수식으로 설명하라.
힌트 보기
균형 함수의 예로 $f(00)=0, f(01)=0, f(10)=1, f(11)=1$을 고려하라. 3단계 이후 $|00\rangle$의 진폭 $\alpha_0 = \frac{1}{4}\sum_x (-1)^{f(x)}$를 직접 계산해보라.
해설 보기
$f$가 위의 예시일 때 $\sum_x (-1)^{f(x)} = (-1)^0 + (-1)^0 + (-1)^1 + (-1)^1 = 1+1-1-1 = 0$이다. 따라서 $|00\rangle$의 진폭이 0이 되어 측정 시 $|00\rangle$을 절대 얻을 수 없다. 확률 보존에 의해 다른 계산 기저 상태 중 하나가 반드시 측정된다.
Q2.위상 반전(phase kickback)이 일어나는 이유를 설명하라. 즉, $U_f|x\rangle|{-}\rangle = (-1)^{f(x)}|x\rangle|{-}\rangle$가 성립함을 보여라.
해설 보기
오라클은 $U_f|x\rangle|y\rangle = |x\rangle|y \oplus f(x)\rangle$로 정의된다. $|{-}\rangle = (|0\rangle - |1\rangle)/\sqrt{2}$에 적용하면, $f(x)=0$일 때 $|{-}\rangle \to |{-}\rangle$이고, $f(x)=1$일 때 $|0\oplus1\rangle - |1\oplus1\rangle = |1\rangle - |0\rangle = -(|0\rangle - |1\rangle)$이므로 $|{-}\rangle \to -|{-}\rangle$이 된다. 두 경우를 합치면 $U_f|x\rangle|{-}\rangle = (-1)^{f(x)}|x\rangle|{-}\rangle$가 성립한다.
Q3.고전 확률론적 알고리즘은 오류 확률 $\epsilon$ 이하로 판별하는 데 $O(\log(1/\epsilon))$번의 오라클 호출이면 충분하다. 그렇다면 Deutsch-Jozsa 알고리즘이 고전 확률 알고리즘 대비 제공하는 이점은 무엇인가?
해설 보기
확률적 오류를 허용하면 고전 알고리즘도 상수 번의 오라클 호출로 충분하므로, 확률적 복잡도 관점에서는 지수적 차이가 사라진다. Deutsch-Jozsa 알고리즘의 의의는 **결정론적(오류 없는)** 정확성을 단 1회로 보장한다는 점에 있다. 즉, 고전 결정론적 알고리즘과 비교했을 때 지수적 우위가 명확하며, 이는 양자 간섭이 전역적 함수 성질을 오류 없이 한 번에 추출할 수 있음을 원리적으로 보여준다.