개념 소개
인 함수가 주어졌다고 하자. 이 함수는 두 가지 유형 중 하나임이 보장된다.
- 상수 함수(constant function): 모든 입력에 대해 항상 또는 항상 을 출력한다.
- 균형 함수(balanced function): 가능한 개의 입력 중 정확히 절반에서 , 나머지 절반에서 을 출력한다.
고전 컴퓨터로 이를 확실히 판별하려면 최악의 경우 번의 함수 평가가 필요하다. 라면 수십억 번의 쿼리가 불가피하다. Deutsch-Jozsa 알고리즘은 이 문제를 단 한 번의 오라클 쿼리로 결정론적으로 해결한다. 이는 양자 컴퓨터가 특정 문제에서 고전 컴퓨터를 지수적으로 능가할 수 있다는 사실을 명확히 보인 초기 사례 중 하나다.
핵심 원리
양자 오라클과 위상 반전
알고리즘은 개의 큐비트를 사용한다. 앞의 개는 입력 레지스터, 마지막 1개는 보조(ancilla) 큐비트다. 양자 오라클 는 다음과 같이 정의된다.
보조 큐비트를 상태로 준비하면, 위상 반전(phase kickback) 현상이 발생한다.
함수값 가 보조 큐비트 대신 입력 큐비트의 전역 위상으로 인코딩되는 것이 핵심이다.
알고리즘 전개
1단계. 초기화
2단계. 전체 Hadamard 변환
3단계. 오라클 적용
4단계. 입력 레지스터에 Hadamard 재적용 후 측정
상태가 측정될 진폭은 다음과 같다.
- 상수 함수: 모든 항의 부호가 동일하므로 합이 , 즉 . 측정 결과는 반드시 .
- 균형 함수: 양수 항과 음수 항이 완전히 상쇄되어 합이 . 이 측정될 확률은 .
측정 결과 하나만으로 판별이 완료된다.
예시·응용
: 원래의 Deutsch 알고리즘
일 때는 네 가지 함수가 존재한다.
| 함수 | 유형 | ||
|---|---|---|---|
| 0 | 0 | 상수 | |
| 1 | 1 | 상수 | |
| 0 | 1 | 균형 | |
| 1 | 0 | 균형 |
고전적으로는 두 번 평가해야 구분할 수 있지만, 양자 알고리즘은 한 번으로 충분하다.
Python 구현 (Qiskit)
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
def deutsch_jozsa(n, oracle='constant'):
qc = QuantumCircuit(n + 1, n)
qc.x(n) # 보조 큐비트를 |1>로 초기화
qc.h(range(n + 1)) # 전체 Hadamard
qc.barrier()
# 오라클: 균형 함수는 각 입력 큐비트에 CNOT 적용
if oracle == 'balanced':
for i in range(n):
qc.cx(i, n)
qc.barrier()
qc.h(range(n)) # 입력 레지스터에 Hadamard 재적용
qc.measure(range(n), range(n))
return qc
sim = AerSimulator()
for oracle_type in ['constant', 'balanced']:
qc = deutsch_jozsa(3, oracle=oracle_type)
counts = sim.run(qc, shots=1).result().get_counts()
print(f"{oracle_type}: {counts}")
# constant → {'000': 1} (반드시 전부 0)
# balanced → {'111': 1} (0이 아닌 비트스트링)
측정 결과가 이면 상수 함수, 그 외의 상태이면 균형 함수로 판별한다.
후속 알고리즘과의 연결
Deutsch-Jozsa 알고리즘의 Hadamard → 오라클 → Hadamard 구조는 이후 다음 알고리즘들의 핵심 골격이 된다.
- Bernstein-Vazirani 알고리즘: 숨겨진 비트스트링을 단 한 번의 쿼리로 복원
- Simon 알고리즘: 숨겨진 주기를 지수적으로 빠르게 찾음
- Grover 탐색: 오라클 반복 구조의 기초
정리
Deutsch-Jozsa 알고리즘은 양자 중첩이 만드는 대규모 병렬성과 위상 반전이라는 두 가지 양자 자원을 결합한다. 오라클은 함수 정보를 위상에 새기고, 두 번째 Hadamard 변환은 전역 간섭을 통해 그 위상 정보를 진폭—즉 측정 가능한 물리량—으로 변환한다. 고전적 지수 복잡도 문제를 상수 쿼리로 해결하는 이 구조는 양자 알고리즘 설계의 원형으로서, 이후 등장하는 알고리즘들을 이해하는 데 필수적인 출발점이 된다.
Exercises
연습문제
Q1고전 컴퓨터에서 $n=10$인 Deutsch-Jozsa 문제를 최악의 경우 확실히 판별하려면 몇 번의 함수 평가가 필요한가?
힌트 보기
최악의 경우는 앞의 $2^{n-1}$번 평가가 모두 같은 값을 반환할 때다.
해설 보기
$2^{n-1}+1 = 2^9+1 = 513$번이 필요하다. 처음 512번이 모두 같은 값을 반환해도, 상수 함수인지 균형 함수인지 확정하려면 513번째 평가가 필요하다. 양자 알고리즘은 이를 단 1번으로 해결한다.
Q2보조 큐비트를 $|{-}\rangle$ 대신 $|0\rangle$ 상태로 준비하면 알고리즘이 올바르게 동작하는가? 그 이유를 설명하라.
해설 보기
올바르게 동작하지 않는다. $|y\rangle = |0\rangle$일 때 오라클 $U_f|x\rangle|0\rangle = |x\rangle|f(x)\rangle$은 $f(x)$를 출력 큐비트에 저장할 뿐, 입력 큐비트의 위상을 변화시키지 않는다. 위상 반전이 발생하려면 보조 큐비트가 반드시 $|{-}\rangle = (|0\rangle - |1\rangle)/\sqrt{2}$이어야 한다. 이 상태에서만 $f(x)$의 값이 $(-1)^{f(x)}$의 위상으로 인코딩된다.
Q3$n=2$이고 $f(00)=0, f(01)=1, f(10)=1, f(11)=0$인 함수에 Deutsch-Jozsa 알고리즘을 적용할 때, 두 번째 Hadamard 변환 이후 $|00\rangle$ 상태의 진폭을 계산하고, 측정 결과를 예측하라.
힌트 보기
$\alpha_{00} = \frac{1}{2^2}\sum_{x} (-1)^{f(x)}$를 직접 계산해보라.
해설 보기
$\alpha_{00} = \frac{1}{4}\left[(-1)^0 + (-1)^1 + (-1)^1 + (-1)^0\right] = \frac{1}{4}(1 - 1 - 1 + 1) = 0$. 이 함수는 $f(00)=f(11)=0$, $f(01)=f(10)=1$이므로 균형 함수다. 진폭이 $0$이므로 $|00\rangle$이 측정될 확률은 $0$이고, 측정 결과는 반드시 $|00\rangle$ 이외의 상태(예: $|01\rangle$, $|10\rangle$, $|11\rangle$ 중 하나)가 나온다.
관련 용어


