Deutsch-Jozsa 알고리즘 — 단 한 번의 양자 평가로 풀기
Deutsch-Jozsa 알고리즘은 n비트 함수가 '상수 함수'인지 '균형 함수'인지를 단 한 번의 오라클 질의만으로 판별하는 양자 알고리즘이다. 고전 컴퓨터는 최악의 경우 지수적 횟수의 평가가 필요하지만, 양자 컴퓨터는 중첩과 간섭을 결합해 단 한 번의 오라클 호출로 결론을 낸다. 결정론적 양자 우위를 최초로 증명한 알고리즘으로, 양자 계산 이론의 출발점이 된다.
개념 소개
함수 가 다음 두 가지 중 하나라는 사전 보장(promise)이 있다고 하자.
- 상수 함수(constant): 모든 입력 에 대해 , 또는 모두 .
- 균형 함수(balanced): 정확히 개의 입력에서 , 나머지에서 .
고전적으로 이 둘을 확실히 구분하려면 최악의 경우 번의 질의가 필요하다. 앞선 번이 모두 동일한 값을 돌려준다 해도, 그것이 상수 함수인지 아닌지는 한 번을 더 확인해야 단정 지을 수 있기 때문이다.
Deutsch-Jozsa 알고리즘은 이 문제를 단 한 번의 오라클 호출로 결정론적으로 해결한다.
핵심 원리
양자 오라클과 위상 반동
함수 는 유니터리 오라클 로 구현된다.
보조 큐비트를 로 준비하면, 오라클 적용 후
가 된다. 의 정보가 전역 위상이 아닌 상대 위상으로 인코딩되는 이 현상을 **위상 반동(phase kickback)**이라 한다. 보조 큐비트는 상태가 바뀌지 않으므로 이후 계산에서 분리된다.
알고리즘 회로
- 입력 레지스터 개를 으로, 보조 큐비트를 로 초기화.
- 전체 큐비트에 아다마르 변환 적용.
- 오라클 적용.
- 입력 레지스터에 다시 적용.
- 입력 레지스터 개를 측정.
수학적 분석
2단계 이후 상태는
3단계(오라클) 후, 위상 반동에 의해
4단계의 적용 후 상태를 관측할 진폭은
- 상수 함수이면 가 모두 또는 이므로 합이 , 즉 → 측정 결과가 반드시 .
- 균형 함수이면 양의 항과 음의 항이 정확히 상쇄되어 합이 , 즉 → 이 절대 관측되지 않음.
측정 결과가 모두 0이면 상수 함수, 하나라도 1이 있으면 균형 함수로 확실히 판별된다.
예시·응용
n=1: 도이치 알고리즘
인 특수 경우를 도이치(Deutsch) 알고리즘이라 한다. 가능한 일비트 함수 네 가지 중 과 은 상수 함수, 과 은 균형 함수다.
Qiskit 구현 예시
from qiskit import QuantumCircuit
def deutsch_jozsa_circuit(n, oracle_type='balanced'):
"""
oracle_type: 'constant_0', 'constant_1', 'balanced'
"""
qc = QuantumCircuit(n + 1, n)
# 보조 큐비트 |1⟩ 준비
qc.x(n)
# 전체 아다마르 (중첩 + |-⟩ 생성)
qc.h(range(n + 1))
# 오라클
if oracle_type == 'constant_1':
qc.x(n) # 전체 위상 -1
elif oracle_type == 'balanced':
for i in range(n):
qc.cx(i, n) # 간단한 균형 오라클
# 입력 레지스터에 아다마르
qc.h(range(n))
# 측정
qc.measure(range(n), range(n))
return qc
qc = deutsch_jozsa_circuit(3, oracle_type='balanced')
print(qc.draw(output='text'))
# 측정 결과: 000이 아닌 값 → 균형 함수 확인
의의와 한계
이 알고리즘이 해결하는 문제 자체는 실용성이 낮다. 그러나 중첩으로 모든 입력을 동시에 탐색하고, 위상 반동으로 함수 정보를 인코딩한 뒤, 간섭으로 유용한 결과만 증폭하는 3단계 구조는 Bernstein-Vazirani, Simon, Shor, Grover 알고리즘 전반에 걸쳐 반복된다.
정리
Deutsch-Jozsa 알고리즘은 양자 계산의 세 가지 핵심 자원인 중첩·위상·간섭이 어떻게 맞물리는지를 가장 단순하고 명확하게 보여준다. 고전 컴퓨터가 질의를 필요로 하는 문제를 단 한 번의 오라클 호출로 결정론적으로 해결하며, 이는 양자 알고리즘이 고전 알고리즘보다 지수적으로 빠를 수 있다는 첫 번째 엄밀한 증거가 된다.
연습문제
Q1.고전 컴퓨터가 $n=10$인 Deutsch-Jozsa 문제를 확실히 판별하려면 최악의 경우 몇 번의 질의가 필요한가? 양자 컴퓨터와 비교하라.
힌트 보기
최악의 경우는 $2^{n-1}$번의 결과가 모두 같은 값일 때다.
해설 보기
고전적으로는 $2^{9}+1 = 513$번이 필요하다. 양자 컴퓨터는 단 1번의 오라클 호출로 충분하므로 지수적 차이가 발생한다.
Q2.상수 함수 $f(x)=1$에 대해 마지막 $H^{\otimes n}$ 적용 후 $|0\rangle^{\otimes n}$의 진폭을 수식으로 계산하라.
힌트 보기
$\alpha_{0^n} = \frac{1}{2^n}\sum_x (-1)^{f(x)}$이고, $f(x)=1$이면 각 항은 $(-1)^1 = -1$이다.
해설 보기
$\alpha_{0^n} = \frac{1}{2^n}\sum_{x}(-1)^1 = \frac{1}{2^n}\cdot(-2^n) = -1$. 측정 확률은 $|-1|^2 = 1$이므로 반드시 $|0\rangle^{\otimes n}$이 관측된다. 음의 위상은 전역 위상이 되어 관측에 영향을 주지 않는다.
Q3.위상 반동이 일어나려면 보조 큐비트를 반드시 $|-\rangle$ 상태로 준비해야 하는가? $|0\rangle$으로 준비하면 어떤 차이가 생기는가?
해설 보기
$|0\rangle$으로 준비하면 오라클 적용 후 보조 큐비트가 $|f(x)\rangle$로 바뀌어 위상 인코딩이 일어나지 않는다. 입력 레지스터에 $(-1)^{f(x)}$ 위상이 실리지 않으므로 간섭 효과가 사라지고, 알고리즘은 정상 동작하지 않는다. 위상 반동은 $|-\rangle$ 상태가 필수 전제 조건이다.