개념 소개
어떤 함수 가 주어지고, 이 함수는 다음 두 유형 중 하나임이 보장된다.
- 상수 함수(constant function): 모든 입력에 대해 또는
- 균형 함수(balanced function): 정확히 절반의 입력에 대해 출력이 0, 나머지 절반에 대해 출력이 1
목표는 블랙박스(오라클)로만 접근 가능한 이 함수의 유형을 판별하는 것이다. 고전 결정론적 알고리즘은 최선을 다해도 최악의 경우 번 질의해야 확실한 답을 얻을 수 있다. 예컨대 이면 5번, 이면 513번이 필요하다. Deutsch-Jozsa 알고리즘은 이를 단 1번의 오라클 호출로 해결한다.
핵심 원리
양자 오라클과 위상 킥백
양자 오라클은 유니터리 연산 로 구현된다.
보조 큐비트(ancilla)를 상태로 준비하면 위상 킥백(phase kickback) 현상에 의해
가 성립한다. 함수값 가 보조 큐비트를 변경하는 대신 전체 위상으로 인코딩되는 것이 핵심이다.
알고리즘 절차
- 초기화: 입력 레지스터 개를 , 보조 큐비트를 로 설정한다.
- 첫 번째 하다마르 변환: 모든 큐비트에 하다마르 게이트 를 적용한다.
- 오라클 적용: 를 한 번 호출한다. 입력 레지스터의 상태는
- 두 번째 하다마르 변환: 입력 레지스터에 다시 을 적용한다.
여기서 는 비트별 내적이다.
- 측정: 입력 레지스터를 측정한다.
- 이 나오면 → 상수 함수
- 그 외의 결과가 나오면 → 균형 함수
왜 작동하는가
상태의 진폭은 을 대입하면 이다.
- 가 상수 함수: 모든 항의 부호가 같으므로 합의 절댓값이 1 → 측정 확률 1
- 가 균형 함수: 양수항과 음수항이 정확히 상쇄되어 합이 0 → 측정 확률 0
**간섭(interference)**이 두 경우를 완벽하게 구분해 준다.
예시·응용
사례 (Deutsch 알고리즘)
가장 단순한 경우로, 상수 함수( 또는 )와 균형 함수( 또는 )를 구분한다.
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
def deutsch_circuit(balanced=True):
qc = QuantumCircuit(2, 1)
# 초기화: 보조 큐비트 |1>
qc.x(1)
# 첫 번째 하다마르
qc.h([0, 1])
# 오라클 (balanced: CNOT, constant: 아무것도 안 함)
if balanced:
qc.cx(0, 1)
# 두 번째 하다마르
qc.h(0)
qc.measure(0, 0)
return qc
sim = AerSimulator()
for label, bal in [("constant", False), ("balanced", True)]:
qc = deutsch_circuit(balanced=bal)
job = sim.run(transpile(qc, sim), shots=1024)
print(f"{label}: {job.result().get_counts()}")
# constant: {'0': 1024}
# balanced: {'1': 1024}
측정 결과가 0이면 상수, 1이면 균형으로 결정론적으로 판별된다.
이론적 의의
Deutsch-Jozsa 알고리즘은 실제 산업 응용보다 양자 우위(quantum advantage)를 최초로 엄밀하게 증명한 원형으로서 가치가 있다. 이후 Bernstein-Vazirani 알고리즘, Simon 알고리즘, 나아가 Shor·Grover 알고리즘의 이론적 토대를 제공한다. 또한 양자 회로 설계에서 오라클 추상화, 위상 킥백, 하다마르 기반 간섭이라는 세 가지 기법을 체계적으로 활용하는 방법을 가르쳐 준다.
정리
Deutsch-Jozsa 알고리즘은 세 가지 양자역학적 자원을 정교하게 결합한다. ① 중첩: 모든 개 입력을 단일 상태로 동시 표현, ② 위상 킥백: 함수값을 계산 기저가 아닌 위상에 저장, ③ 간섭: 두 번째 하다마르 변환에서 상수/균형의 신호를 증폭·상쇄. 고전 복잡도 대비 양자 복잡도는 로, 지수적 격차를 가장 명쾌하게 보여주는 알고리즘이다.
Exercises
연습문제
Q1함수 $f:\{0,1\}^2 \to \{0,1\}$가 $f(00)=0,\, f(01)=1,\, f(10)=0,\, f(11)=1$로 정의될 때, 이 함수는 상수 함수인가 균형 함수인가? Deutsch-Jozsa 알고리즘을 적용했을 때 최종 측정 결과는 무엇인가?
힌트 보기
출력값이 0인 경우와 1인 경우의 개수를 세어 보라. 균형 함수라면 $|0\rangle^{\otimes 2}$ 진폭이 얼마인지 계산해 보라.
해설 보기
출력이 0인 입력은 $\{00, 10\}$ 2개, 출력이 1인 입력은 $\{01, 11\}$ 2개로 균형 함수다. $|00\rangle$ 진폭은 $\frac{1}{4}[(-1)^0+(-1)^1+(-1)^0+(-1)^1] = \frac{1}{4}[1-1+1-1]=0$이므로 측정 결과는 반드시 $|00\rangle$이 아닌 상태, 즉 균형 함수로 판별된다.
Q2보조 큐비트를 $|0\rangle$ 상태로 초기화하고 오라클을 적용하면 위상 킥백이 발생하지 않는 이유를 설명하라.
해설 보기
위상 킥백은 $U_f|x\rangle|y\rangle = |x\rangle|y \oplus f(x)\rangle$에서 $|y\rangle=|-\rangle$일 때 발생한다. $|-\rangle$는 $|0\rangle$과 $|1\rangle$의 특정 위상 중첩이므로, $y \oplus f(x)$가 $y$의 위상을 $(-1)^{f(x)}$로 바꾸는 효과를 낸다. 보조 큐비트가 $|0\rangle$이면 $0 \oplus f(x) = f(x)$로 큐비트 자체가 변할 뿐 위상이 입력 레지스터로 전달되지 않아, 오라클이 입력 레지스터에 어떠한 위상도 부여하지 못한다.
Q3Deutsch-Jozsa 알고리즘은 결정론적(deterministic)인가, 확률적(probabilistic)인가? 또한 같은 문제를 고전 확률 알고리즘(무작위 샘플링)으로 풀 때의 복잡도와 비교하라.
해설 보기
Deutsch-Jozsa 알고리즘은 **결정론적**이다. 단 1번의 오라클 호출 후 측정 결과가 항상 옳은 답을 준다(오류 확률 0). 반면 고전 확률 알고리즘은 $k$번 무작위로 입력을 샘플링하면 오류 확률이 $2^{-(k-1)}$로 줄어든다. 오류 확률을 $\epsilon$ 이하로 만들려면 $O(\log(1/\epsilon))$번의 질의가 필요하므로, 완전한 확실성을 원하면 여전히 지수적인 질의가 필요하다. 양자 알고리즘은 이를 1번으로 해결한다는 점에서 결정론적 고전 알고리즘 대비 지수적 우위를 가진다.
관련 용어


