Deutsch-Jozsa 알고리즘 — 단 한 번의 평가로 판별하기
Deutsch-Jozsa 알고리즘은 주어진 함수가 상수 함수인지 균형 함수인지를 단 한 번의 오라클 호출로 확정적으로 판별하는 최초의 양자 우위 알고리즘 중 하나다. 중첩과 양자 간섭을 결합하여, 고전 컴퓨터가 최악의 경우 지수적 횟수의 질의가 필요한 문제를 상수 시간에 해결한다.
개념 소개
함수 이 다음 두 가지 중 하나라고 보장되어 있다고 가정한다.
- 상수 함수(constant): 모든 입력 에 대해 또는
- 균형 함수(balanced): 입력의 정확히 절반이 0, 나머지 절반이 1로 대응
고전 결정론적 알고리즘은 최악의 경우 번 함수를 평가해야 두 경우를 구별할 수 있다. Deutsch-Jozsa 알고리즘은 오라클을 단 한 번 호출하는 것으로 이를 확정적으로 해결한다.
일상적 비유로는, 동전이 모두 앞면(상수)인지 정확히 절반이 뒷면(균형)인지를 동전을 하나씩 뒤집어 확인하는 대신, 전체를 동시에 비추는 특수한 거울로 한 번에 확인하는 것과 유사하다.
핵심 원리
회로 구성
알고리즘은 개의 입력 큐비트와 1개의 보조(ancilla) 큐비트로 구성된다.
1단계 — Hadamard 변환:
모든 큐비트에 를 적용하면,
여기서 이다.
2단계 — 양자 오라클 적용:
오라클은 로 정의된다. 보조 큐비트가 상태일 때 이른바 **위상 킥백(phase kickback)**이 발생한다.
3단계 — 입력 큐비트에 다시 Hadamard 적용:
을 적용하면,
4단계 — 측정:
(모두 0) 상태의 진폭은 이다.
- 가 상수 함수이면 모든 항의 부호가 같으므로 합의 절댓값이 1 → 측정 확률 = 1
- 가 균형 함수이면 양수·음수 항이 정확히 상쇄되어 합 = 0 → 측정 확률 = 0
따라서 입력 큐비트를 측정하여 전부 0이면 상수, 하나라도 1이면 균형으로 판별한다.
예시·응용
인 경우 (Deutsch 알고리즘)
의 네 가지 경우 — , (상수), , (균형) — 를 단 1번의 오라클 호출로 구별한다. 이것이 Deutsch의 원래 1985년 아이디어이며, Deutsch-Jozsa는 이를 비트로 일반화한 것이다.
Qiskit 구현 예시 (, 균형 오라클)
from qiskit import QuantumCircuit
def deutsch_jozsa_balanced(n=3):
qc = QuantumCircuit(n + 1, n)
# 초기화
qc.x(n) # 보조 큐비트 |1>
qc.h(range(n + 1)) # 모든 큐비트에 Hadamard
# 균형 오라클 예시: 첫 번째 입력 큐비트를 보조에 CNOT
for i in range(n):
qc.cx(i, n)
qc.h(range(n)) # 입력 큐비트에 다시 Hadamard
qc.measure(range(n), range(n))
return qc
qc = deutsch_jozsa_balanced()
print(qc.draw())
# 측정 결과: 000이 아닌 값 → 균형 함수로 판별
의의와 한계
Deutsch-Jozsa 알고리즘은 실용적 문제를 직접 해결하기보다, 양자 병렬성과 간섭이 결합하면 지수적 속도 향상이 가능함을 최초로 증명한 '개념 증명'으로서의 가치가 크다. Simon 알고리즘, Shor 알고리즘 등 이후 양자 알고리즘들의 이론적 토대가 된다.
정리
Deutsch-Jozsa 알고리즘의 핵심은 두 단계의 Hadamard 변환 사이에 오라클을 배치하는 구조다. 첫 번째 Hadamard로 모든 입력의 중첩을 생성하고, 오라클의 위상 킥백으로 함수 정보를 위상에 인코딩한 뒤, 두 번째 Hadamard로 간섭을 통해 정보를 진폭에 집약시킨다. 측정은 단 한 번으로 충분하며, 오류 없이 확정적 결과를 낸다는 점에서 확률적 양자 알고리즘과도 구별된다.
연습문제
Q1.$n=2$일 때 균형 함수의 예를 하나 들고, 해당 오라클 적용 후 입력 큐비트의 상태를 직접 계산하라. 측정 결과가 $|00\rangle$이 될 확률은 얼마인가?
힌트 보기
균형 함수의 예로 $f(00)=0,\, f(01)=0,\, f(10)=1,\, f(11)=1$을 사용하면 오라클 적용 후 위상이 $+1,+1,-1,-1$로 배분된다. 두 번째 Hadamard 후 $|00\rangle$ 진폭을 계산한다.
해설 보기
오라클 적용 후 상태는 $\frac{1}{2}(|00\rangle+|01\rangle-|10\rangle-|11\rangle)|{-}\rangle$이다. 두 번째 $H^{\otimes 2}$를 적용하면 $|00\rangle$ 성분의 진폭은 $\frac{1}{4}(1+1-1-1)=0$이다. 따라서 $|00\rangle$ 측정 확률은 **0**이며, 균형 함수로 올바르게 판별된다.
Q2.Deutsch-Jozsa 알고리즘이 확정적(deterministic) 알고리즘인 이유는 무엇인가? 측정 결과에 확률이 개입하지 않는 이유를 간섭의 관점에서 설명하라.
해설 보기
상수 함수일 때 $|0\rangle^{\otimes n}$ 진폭의 절댓값은 정확히 1이고, 균형 함수일 때는 정확히 0이다. 간섭이 두 경우 모두 '완전 보강' 또는 '완전 상쇄'로 귀결되기 때문에 중간값이 나오지 않는다. 이는 함수가 상수/균형으로 명확히 분류될 때만 성립하는 구조적 특성이며, 그래서 단 한 번의 측정으로 오류 없이 결론을 내릴 수 있다.
Q3.Deutsch-Jozsa 알고리즘에서 보조 큐비트를 $|0\rangle$ 대신 $|1\rangle$로 초기화하는 이유는 무엇인가?
힌트 보기
Hadamard를 적용한 뒤 $|{-}\rangle$ 상태가 되어야 위상 킥백이 발생한다는 점을 생각해 보라.
해설 보기
$|1\rangle$에 $H$를 적용하면 $|{-}\rangle = \frac{|0\rangle-|1\rangle}{\sqrt{2}}$가 된다. 오라클 $U_f$는 $|{-}\rangle$ 상태의 보조 큐비트에 작용할 때 $(-1)^{f(x)}$라는 위상을 입력 큐비트 쪽으로 킥백시킨다. 보조 큐비트가 $|0\rangle$이었다면 이 위상 인코딩이 일어나지 않아 알고리즘이 동작하지 않는다.