개념 소개
Deutsch-Jozsa 알고리즘은 David Deutsch와 Richard Jozsa가 제안한 알고리즘으로, 양자컴퓨터가 고전 컴퓨터 대비 지수적으로 빠를 수 있음을 보여주는 최초의 명확한 사례다. 문제 자체는 단순하지만, 핵심 양자 기법들이 집약되어 있어 양자 알고리즘 학습의 출발점으로 자주 활용된다.
문제 설정: 함수 가 다음 두 경우 중 하나임이 약속(promise)되어 있다.
- 상수 함수(constant): 모든 입력에 대해 출력이 동일 (전부 0 또는 전부 1)
- 균형 함수(balanced): 정확히 절반 입력에서 0, 나머지 절반에서 1 출력
고전 컴퓨터는 최악의 경우 번 질의해야 확정 판별이 가능하다. 양자 알고리즘은 이를 단 1번의 오라클 호출로 완벽하게 해결한다.
핵심 원리
알고리즘은 개의 큐비트를 사용한다. 앞 개는 입력 레지스터, 마지막 1개는 보조(ancilla) 큐비트다.
1단계: 초기화
2단계: 전체 하다마르 변환
모든 큐비트에 게이트를 적용한다.
입력 레지스터는 개 상태의 동등 중첩, 보조 큐비트는 상태가 된다.
3단계: 오라클 적용 (위상 킥백)
오라클은 보조 큐비트가 상태일 때 위상 킥백에 의해 다음과 같이 작동한다.
함수값이 위상으로 인코딩되어 입력 레지스터에 기록된다.
4단계: 입력 레지스터에 다시 하다마르 변환
큐비트 하다마르 변환은 이며, 여기서 이다. 최종 상태에서 의 진폭은:
- f가 상수 함수: 모든 의 부호가 같으므로 합 → 측정 확률 100%
- f가 균형 함수: 과 이 정확히 상쇄되어 합 → 측정 확률 0%
측정 결과가 모두 0이면 상수 함수, 하나라도 1이 있으면 균형 함수로 확정된다.
예시·응용
Qiskit을 이용한 구현 예시
from qiskit import QuantumCircuit
def deutsch_jozsa_circuit(oracle_type='balanced', n=3):
qc = QuantumCircuit(n + 1, n)
# 보조 큐비트를 |1> 로 초기화
qc.x(n)
# 전체 하다마르 변환
qc.h(range(n + 1))
qc.barrier()
# 오라클 적용
if oracle_type == 'balanced':
# 균형 오라클: 각 입력 큐비트를 보조 큐비트에 CNOT
for i in range(n):
qc.cx(i, n)
# constant oracle: 아무 게이트도 없음 (항등 변환)
qc.barrier()
# 입력 레지스터에 다시 하다마르
qc.h(range(n))
# 입력 레지스터 측정
qc.measure(range(n), range(n))
return qc
qc_balanced = deutsch_jozsa_circuit('balanced', n=3)
print(qc_balanced.draw())
oracle_type='balanced'이면 측정 결과는 반드시 000이 아닌 값, oracle_type='constant'이면 반드시 000이 출력된다.
이론적 의의
Deutsch-Jozsa 알고리즘은 실용적 응용보다 이론적 가치가 핵심이다. 이 알고리즘은 양자 병렬성과 간섭이 결합하면 고전적으로 지수 시간이 필요한 문제를 상수 시간에 해결할 수 있음을 증명했다. 이후 Simon 알고리즘(2의 멱 위수 탐색), Shor 알고리즘(정수 인수분해) 등 더 실용적인 양자 알고리즘들이 유사한 구조—중첩으로 병렬 평가, 간섭으로 정보 추출—를 계승한다.
정리
Deutsch-Jozsa 알고리즘은 세 가지 핵심 기법의 결합이다: (1) 하다마르 변환을 통한 모든 입력의 동시 중첩, (2) 위상 킥백을 통한 함수값의 위상 인코딩, (3) 역 하다마르 변환을 통한 간섭으로 정보를 결정론적으로 추출. 오라클 1회 호출에 개 입력을 병렬 처리하는 이 구조는, 이후 설계되는 모든 양자 알고리즘의 근본 패러다임으로 이어진다.
Exercises
연습문제
Q1$n=2$이고 $f(x) = x_0 \oplus x_1$ (균형 함수)인 경우, 알고리즘의 각 단계별 양자 상태를 직접 계산하고 최종 측정 결과를 구하시오.
힌트 보기
2단계 이후 상태는 $\frac{1}{2}(|00\rangle+|01\rangle+|10\rangle+|11\rangle)$이다. 오라클 적용 후 각 기저 상태의 위상을 계산해 보라.
해설 보기
초기화 후 하다마르 변환으로 $|\psi_1\rangle = \frac{1}{2}(|00\rangle+|01\rangle+|10\rangle+|11\rangle)$. 오라클 적용 시 $f(00)=0,\ f(01)=1,\ f(10)=1,\ f(11)=0$이므로 $|\psi_2\rangle = \frac{1}{2}(|00\rangle - |01\rangle - |10\rangle + |11\rangle)$. 역 하다마르 변환 후 $|00\rangle$ 성분의 진폭은 $\frac{1}{4}(1-1-1+1)=0$, $|11\rangle$ 성분은 $\frac{1}{4}(1+1+1+1)=1$. 따라서 측정 결과는 $|11\rangle$로, 균형 함수임이 확인된다.
Q2위상 킥백이 발생하려면 보조 큐비트가 반드시 $|{-}\rangle = \frac{|0\rangle-|1\rangle}{\sqrt{2}}$ 상태여야 한다. 보조 큐비트가 $|0\rangle$ 상태일 때 오라클을 적용하면 어떤 일이 일어나는지 설명하시오.
해설 보기
보조 큐비트가 $|0\rangle$이면 오라클은 $|x\rangle|0\rangle \to |x\rangle|f(x)\rangle$으로 작동한다. 위상 변화가 발생하지 않고 함수값이 보조 큐비트에 그대로 기록된다. 입력 레지스터의 위상에는 변화가 없으므로 이후 하다마르 변환을 통해 간섭이 일어나지 않고, 알고리즘이 정상 동작하지 않는다.
Q3Deutsch-Jozsa 알고리즘은 약속(promise) 문제를 전제로 한다. 만약 $f$가 상수도 균형도 아닌 임의의 함수라면 알고리즘의 출력 결과를 어떻게 해석해야 하는가?
해설 보기
약속이 위반된 경우 $|0\rangle^{\otimes n}$ 진폭의 절댓값은 0과 1 사이 임의의 값이 될 수 있다. 측정 결과가 모두 0일 수도, 아닐 수도 있으며, 결과가 상수/균형 여부를 보장하지 않는다. Deutsch-Jozsa 알고리즘은 약속 조건 하에서만 올바른 판별을 보장하므로, 약속 없이 일반 함수를 판별하는 데는 사용할 수 없다.
관련 용어


