Přeskočit na hlavní obsah

Deutsch-Jozsův algoritmus

Deutschův algoritmus překonává všechny klasické algoritmy pro problém dotazování, ale tato výhoda je poměrně skromná: jeden dotaz oproti dvěma. Deutsch-Jozsův algoritmus tuto výhodu rozšiřuje — a ve skutečnosti ho lze použít k řešení několika různých problémů dotazování.

Zde je popis Deutsch-Jozsova algoritmu pomocí kvantového obvodu. Další krok klasického post-processingu, který není na obrázku znázorněn, může být také potřeba v závislosti na konkrétním řešeném problému.

Deutsch-Jozsův algoritmus

Samozřejmě jsme zatím neprobrali, jaké problémy tento algoritmus řeší; to je obsahem následujících dvou sekcí.

Deutsch-Jozsův problém​

Začneme problémem dotazování, pro který byl Deutsch-Jozsův algoritmus původně navržen, a který je známý jako Deutsch-Jozsův problém.

Vstupní funkce tohoto problému má tvar f:Σn→Σf:\Sigma^n \rightarrow \Sigma pro libovolné kladné celé číslo nn. Podobně jako u Deutschova problému je úkolem vypsat 00, pokud je ff konstantní, a 11, pokud je ff vyvážená, což opět znamená, že počet vstupních řetězců, pro které funkce nabývá hodnoty 00, je roven počtu vstupních řetězců, pro které funkce nabývá hodnoty 11.

Všimni si, že pokud je nn větší než 11, existují funkce tvaru f:Σn→Σf:\Sigma^n \rightarrow \Sigma, které nejsou ani konstantní, ani vyvážené. Například funkce f:Σ2→Σf:\Sigma^2\rightarrow\Sigma definovaná jako

f(00)=0f(01)=0f(10)=0f(11)=1\begin{aligned} f(00) & = 0 \\ f(01) & = 0 \\ f(10) & = 0 \\ f(11) & = 1 \end{aligned}

nespadá do žádné z těchto dvou kategorií. U Deutsch-Jozsova problému se o takové funkce jednoduše nestaráme — považují se za vstupy typu „nezáleží na nich". To znamená, že u tohoto problému máme příslib, že ff je buď konstantní, nebo vyvážená.

Deutsch-Jozsův problém

Vstup: funkce f:{0,1}n→{0,1}f:\{0,1\}^n\rightarrow\{0,1\}
Příslib: ff je buď konstantní, nebo vyvážená
Výstup: 00 pokud je ff konstantní, 11 pokud je ff vyvážená

Deutsch-Jozsův algoritmus se svým jediným dotazem řeší tento problém následovně: pokud jsou všechny výsledky nn měření rovny 00, pak je funkce ff konstantní; a jinak, pokud je alespoň jeden z výsledků měření roven 11, pak je funkce ff vyvážená. Jinak řečeno, za obvodem popsaným výše následuje krok klasického post-processingu, ve kterém se z výsledků měření vypočítá operace OR a vytvoří se výstup.

Analýza algoritmu​

Pro analýzu výkonu Deutsch-Jozsova algoritmu pro Deutsch-Jozsův problém je užitečné začít úvahou o působení jedné vrstvy Hadamardových hradel. Hadamardovu operaci lze vyjádřit jako matici obvyklým způsobem,

H=(121212−12),H = \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\[2mm] \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix},

ale tuto operaci můžeme také vyjádřit pomocí jejího působení na stavy standardní báze:

H∣0⟩=12∣0⟩+12∣1⟩H∣1⟩=12∣0⟩−12∣1⟩.\begin{aligned} H \vert 0\rangle & = \frac{1}{\sqrt{2}} \vert 0 \rangle + \frac{1}{\sqrt{2}} \vert 1 \rangle\\[3mm] H \vert 1\rangle & = \frac{1}{\sqrt{2}} \vert 0 \rangle - \frac{1}{\sqrt{2}} \vert 1 \rangle. \end{aligned}

Tyto dvě rovnice lze spojit do jednoho vzorce,

H∣a⟩=12∣0⟩+12(−1)a∣1⟩=12∑b∈{0,1}(−1)ab∣b⟩,H \vert a \rangle = \frac{1}{\sqrt{2}} \vert 0 \rangle + \frac{1}{\sqrt{2}} (-1)^a \vert 1 \rangle = \frac{1}{\sqrt{2}} \sum_{b\in\{0,1\}} (-1)^{ab} \vert b\rangle,

který platí pro obě volby a∈Σa\in\Sigma.

Nyní předpokládejme, že místo jednoho qubitu máme nn qubitů a na každém se provede Hadamardova operace. Kombinovaná operace na nn qubitech je popsána tenzorovým součinem H⊗⋯⊗HH\otimes \cdots \otimes H (nn-krát), který pro stručnost a přehlednost zapisujeme jako H⊗nH^{\otimes n}. Pomocí výše uvedeného vzorce, po rozepsání a následném zjednodušení, můžeme vyjádřit působení této kombinované operace na stavy standardní báze nn qubitů takto:

H⊗n∣xn−1⋯x1x0⟩=(H∣xn−1⟩)⊗⋯⊗(H∣x0⟩)=(12∑yn−1∈Σ(−1)xn−1yn−1∣yn−1⟩)⊗⋯⊗(12∑y0∈Σ(−1)x0y0∣y0⟩)=12n∑yn−1⋯y0∈Σn(−1)xn−1yn−1+⋯+x0y0∣yn−1⋯y0⟩.\begin{aligned} & H^{\otimes n} \vert x_{n-1} \cdots x_1 x_0 \rangle \\ & \qquad = \bigl(H \vert x_{n-1} \rangle \bigr) \otimes \cdots \otimes \bigl(H \vert x_{0} \rangle \bigr) \\ & \qquad = \Biggl( \frac{1}{\sqrt{2}} \sum_{y_{n-1}\in\Sigma} (-1)^{x_{n-1} y_{n-1}} \vert y_{n-1} \rangle \Biggr) \otimes \cdots \otimes \Biggl( \frac{1}{\sqrt{2}} \sum_{y_{0}\in\Sigma} (-1)^{x_{0} y_{0}} \vert y_{0} \rangle \Biggr) \\ & \qquad = \frac{1}{\sqrt{2^n}} \sum_{y_{n-1}\cdots y_0 \in \Sigma^n} (-1)^{x_{n-1}y_{n-1} + \cdots + x_0 y_0} \vert y_{n-1} \cdots y_0 \rangle. \end{aligned}

Mimochodem, binární řetězce délky nn zde zapisujeme jako xn−1⋯x0x_{n-1}\cdots x_0 a yn−1⋯y0y_{n-1}\cdots y_0, podle konvence indexování v Qiskitu.

Tento vzorec nám poskytuje užitečný nástroj pro analýzu výše uvedeného kvantového obvodu. Po provedení první vrstvy Hadamardových hradel je stav n+1n+1 qubitů (včetně nejlevějšího/spodního qubitu, který je ošetřen odděleně od ostatních)

(H∣1⟩)(H⊗n∣0⋯0⟩)=∣−⟩⊗12n∑xn−1⋯x0∈Σn∣xn−1⋯x0⟩.\bigl( H \vert 1 \rangle \bigr) \bigl( H^{\otimes n} \vert 0 \cdots 0 \rangle \bigr) = \vert - \rangle \otimes \frac{1}{\sqrt{2^n}} \sum_{x_{n-1}\cdots x_0 \in \Sigma^n} \vert x_{n-1} \cdots x_0 \rangle.

Když se provede operace UfU_f, tento stav se transformuje na

∣−⟩⊗12n∑xn−1⋯x0∈Σn(−1)f(xn−1⋯x0)∣xn−1⋯x0⟩\vert - \rangle \otimes \frac{1}{\sqrt{2^n}} \sum_{x_{n-1}\cdots x_0 \in \Sigma^n} (-1)^{f(x_{n-1}\cdots x_0)} \vert x_{n-1} \cdots x_0 \rangle

prostřednictvím přesně stejného jevu fázového zpětného rázu, který jsme viděli v analýze Deutschova algoritmu.

Poté se provede druhá vrstva Hadamardových hradel, která (podle výše uvedeného vzorce) transformuje tento stav na

∣−⟩⊗12n∑xn−1⋯x0∈Σn∑yn−1⋯y0∈Σn(−1)f(xn−1⋯x0)+xn−1yn−1+⋯+x0y0∣yn−1⋯y0⟩.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x_{n-1}\cdots x_0 \in \Sigma^n} \sum_{y_{n-1}\cdots y_0 \in \Sigma^n} (-1)^{f(x_{n-1}\cdots x_0) + x_{n-1}y_{n-1} + \cdots + x_0 y_0} \vert y_{n-1} \cdots y_0 \rangle.

Tento výraz vypadá poněkud komplikovaně a bez dalších znalostí o funkci ff nelze o pravděpodobnostech získání různých výsledků měření příliš mnoho usoudit.

Naštěstí vše, co potřebujeme znát, je pravděpodobnost, že každý z výsledků měření bude 00 — protože to je pravděpodobnost, že algoritmus určí, že ff je konstantní. Tato pravděpodobnost má jednoduchý vzorec.

∣12n∑xn−1⋯x0∈Σn(−1)f(xn−1⋯x0)∣2={1if f is constant0if f is balanced\Biggl\vert \frac{1}{2^n} \sum_{x_{n-1}\cdots x_0 \in \Sigma^n} (-1)^{f(x_{n-1}\cdots x_0)} \Biggr\vert^2 = \begin{cases} 1 & \text{if $f$ is constant}\\[1mm] 0 & \text{if $f$ is balanced} \end{cases}

Všimni si, že tyto hodnoty odpovídají pravděpodobnosti naměření stavu ∣0⊗n⟩\vert 0^{\otimes n} \rangle, spíše než přímo finálnímu klasickému výstupnímu bitu Deutsch-Jozsova problému. Algoritmus vrací 00, když jsou všechny výsledky měření 00 (což naznačuje, že ff je konstantní), a vrací 11 jinak (což naznačuje, že ff je vyvážená).

Podrobněji, pokud je ff konstantní, pak buď f(xn−1⋯x0)=0f(x_{n-1}\cdots x_0) = 0 pro každý řetězec xn−1⋯x0x_{n-1}\cdots x_0, v tom případě je hodnota součtu 2n2^n, nebo f(xn−1⋯x0)=1f(x_{n-1}\cdots x_0) = 1 pro každý řetězec xn−1⋯x0x_{n-1}\cdots x_0, v tom případě je hodnota součtu −2n-2^n. Vydělením 2n2^n a umocněním absolutní hodnoty na druhou získáme 11.

Pokud je naopak ff vyvážená, pak ff nabývá hodnoty 00 na polovině řetězců xn−1⋯x0x_{n-1}\cdots x_0 a hodnoty 11 na druhé polovině, takže se členy +1+1 a −1-1 v součtu vzájemně vyruší a zbude nám hodnota 0.0.

Docházíme k závěru, že algoritmus funguje správně za předpokladu, že je splněn příslib.

Obtížnost pro klasické algoritmy​

Deutsch-Jozsův algoritmus funguje pokaždé, vždy dává správnou odpověď, když je příslib splněn, a vyžaduje jediný dotaz. Jak je to ve srovnání s klasickými dotazovacími algoritmy pro Deutsch-Jozsův problém?

Za prvé, jakýkoli deterministický klasický algoritmus, který správně řeší Deutsch-Jozsův problém, musí provést exponenciálně mnoho dotazů: v nejhorším případě je potřeba 2n−1+12^{n-1} + 1 dotazů. Důvod je ten, že pokud deterministický algoritmus dotazuje ff na 2n−12^{n-1} nebo méně různých řetězcích a pokaždé získá stejnou hodnotu funkce, pak jsou stále možné obě odpovědi. Funkce může být konstantní, nebo může být vyvážená, ale smůlou se stalo, že dotazy všechny vrátily stejnou hodnotu funkce.

Druhá možnost se může zdát nepravděpodobná — ale u deterministických algoritmů neexistuje žádná náhodnost ani nejistota, takže systematicky selžou na určitých funkcích. Máme tedy v tomto ohledu významnou výhodu kvantových algoritmů oproti klasickým.

Je tu však háček, a to ten, že pravděpodobnostní klasické algoritmy dokáží vyřešit Deutsch-Jozsův problém s velmi vysokou pravděpodobností pomocí pouhých několika dotazů. Konkrétně, pokud jednoduše náhodně zvolíme několik různých řetězců délky nn a dotážeme se ff na tyto řetězce, je nepravděpodobné, že pro všechny získáme stejnou hodnotu funkce, když je ff vyvážená.

Přesněji řečeno, pokud zvolíme kk vstupních řetězců x1,…,xk∈Σnx^1,\ldots,x^k \in \Sigma^n rovnoměrně náhodně, vyhodnotíme f(x1),…,f(xk)f(x^1),\ldots,f(x^k) a odpovíme 00, pokud jsou všechny hodnoty funkce stejné, a 11, pokud ne, pak budeme vždy správně, když je ff konstantní, a v případě, že ff je vyvážená, se zmýlíme s pravděpodobností pouhých 2−k+12^{-k + 1}. Pokud vezmeme například k=11k = 11, tento algoritmus odpoví správně s pravděpodobností větší než 99,999{,}9%.

Z tohoto důvodu máme stále poměrně skromnou výhodu kvantových algoritmů oproti klasickým — ale přesto jde o kvantifikovatelnou výhodu představující zlepšení oproti Deutschovu algoritmu.

Deutsch-Jozsův algoritmus s Qiskit​

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
import numpy as np

Pro implementaci Deutsch-Jozsova algoritmu v Qiskit začneme definováním funkce dj_query, která generuje kvantový obvod implementující dotazovací hradlo pro náhodně zvolenou funkci splňující příslib Deutsch-Jozsova problému. S 50% pravděpodobností je funkce konstantní a s 50% pravděpodobností je funkce vyvážená. Pro každou z těchto dvou možností je funkce zvolena rovnoměrně z funkcí daného typu. Argumentem je počet vstupních bitů funkce.

def dj_query(num_qubits):
# Create a circuit implementing for a query gate for a random function
# satisfying the promise for the Deutsch-Jozsa problem.

qc = QuantumCircuit(num_qubits + 1)

if np.random.randint(0, 2):
# Flip output qubit with 50% chance
qc.x(num_qubits)
if np.random.randint(0, 2):
# return constant circuit with 50% chance
return qc

# Choose half the possible input strings
on_states = np.random.choice(
range(2**num_qubits), # numbers to sample from
2**num_qubits // 2, # number of samples
replace=False, # makes sure states are only sampled once
)

def add_cx(qc, bit_string):
for qubit, bit in enumerate(reversed(bit_string)):
if bit == "1":
qc.x(qubit)
return qc

for state in on_states:
qc.barrier() # Barriers are added to help visualize how the functions are created.
qc = add_cx(qc, f"{state:0b}")
qc.mcx(list(range(num_qubits)), num_qubits)
qc = add_cx(qc, f"{state:0b}")

qc.barrier()

return qc

Implementaci dotazovacího hradla jako kvantového obvodu si můžeme zobrazit pomocí metody draw, jak je obvyklé.

display(dj_query(3).draw(output="mpl"))

Output of the previous code cell

Dále definujeme funkci, která vytvoří Deutsch-Jozsův obvod a jako argument přijímá implementaci dotazovacího hradla jako kvantový obvod.

def compile_circuit(function: QuantumCircuit):
# Compiles a circuit for use in the Deutsch-Jozsa algorithm.

n = function.num_qubits - 1
qc = QuantumCircuit(n + 1, n)
qc.x(n)
qc.h(range(n + 1))
qc.compose(function, inplace=True)
qc.h(range(n))
qc.measure(range(n), range(n))
return qc

Nakonec je definována funkce, která jednou spustí Deutsch-Jozsův obvod.

def dj_algorithm(function: QuantumCircuit):
# Determine if a function is constant or balanced.

qc = compile_circuit(function)

result = AerSimulator().run(qc, shots=1, memory=True).result()
measurements = result.get_memory()
if "1" in measurements[0]:
return "balanced"
return "constant"

Naši implementaci si můžeme otestovat tak, že náhodně zvolíme funkci, zobrazíme implementaci dotazovacího hradla jako kvantový obvod pro tuto funkci a poté na ni spustíme Deutsch-Jozsův algoritmus.

f = dj_query(3)
display(f.draw("mpl"))
display(dj_algorithm(f))

Output of the previous code cell

'balanced'

Bernstein-Vaziraniho problém​

Dále si probereme problém známý jako Bernstein-Vaziraniho problém. Říká se mu také problém Fourierova vzorkování, i když existují obecnější formulace tohoto problému, které se také tak nazývají.

Nejprve si zaveďme notaci. Pro libovolné dva binární řetězce x=xn−1⋯x0x = x_{n-1} \cdots x_0 a y=yn−1⋯y0y = y_{n-1}\cdots y_0 délky nn definujeme

x⋅y=xn−1yn−1⊕⋯⊕x0y0.x \cdot y = x_{n-1} y_{n-1} \oplus \cdots \oplus x_0 y_0.

Tuto operaci budeme nazývat binární skalární součin. Alternativně ji lze definovat takto.

x⋅y={1xn−1yn−1+⋯+x0y0 is odd0xn−1yn−1+⋯+x0y0 is evenx \cdot y = \begin{cases} 1 & x_{{n-1}} y_{n-1} + \cdots + x_0 y_0 \text{ is odd}\\[0.5mm] 0 & x_{{n-1}} y_{n-1} + \cdots + x_0 y_0 \text{ is even} \end{cases}

Všimni si, že jde o symetrickou operaci, což znamená, že výsledek se nezmění, pokud prohodíme xx a yy, takže to můžeme kdykoli udělat, když se nám to hodí. Někdy je užitečné přemýšlet o binárním skalárním součinu x⋅yx \cdot y jako o paritě bitů xx na pozicích, kde má řetězec yy hodnotu 11, nebo ekvivalentně o paritě bitů yy na pozicích, kde má řetězec xx hodnotu 11.

S touto notací nyní můžeme definovat Bernstein-Vaziraniho problém.

Bernstein-Vaziraniho problém

Vstup: funkce f:{0,1}n→{0,1}f:\{0,1\}^n\rightarrow\{0,1\}
Příslib: existuje binární řetězec s=sn−1⋯s0s = s_{n-1} \cdots s_0 takový, že f(x)=s⋅xf(x) = s\cdot x pro všechna x∈Σnx\in\Sigma^n
Výstup: řetězec ss

Pro tento problém vlastně nepotřebujeme nový kvantový algoritmus; řeší ho Deutsch-Jozsův algoritmus. Pro přehlednost budeme kvantový obvod shora, který nezahrnuje klasický post-processing krok výpočtu OR, nazývat Deutsch-Jozsův obvod.

Analýza algoritmu​

Abychom analyzovali, jak Deutsch-Jozsův obvod funguje pro funkci splňující slib Bernstein-Vaziraniho problému, začneme rychlým pozorováním. Pomocí binárního skalárního součinu můžeme alternativně popsat působení nn Hadamardových hradel na standardní bázové stavy nn qubitů následovně.

H⊗n∣x⟩=12n∑y∈Σn(−1)x⋅y∣y⟩H^{\otimes n} \vert x \rangle = \frac{1}{\sqrt{2^n}} \sum_{y\in\Sigma^n} (-1)^{x\cdot y} \vert y\rangle

Podobně jako jsme viděli při analýze Deutschova algoritmu, je to proto, že hodnota (−1)k(-1)^k pro libovolné celé číslo kk závisí pouze na tom, zda je kk sudé nebo liché.

Nyní se vraťme k Deutsch–Jozsovu obvodu; po první vrstvě Hadamardových hradel je stav n+1n+1 qubitů

∣−⟩⊗12n∑x∈Σn∣x⟩.\vert - \rangle \otimes \frac{1}{\sqrt{2^n}} \sum_{x \in \Sigma^n} \vert x \rangle.

Poté se provede dotazovací hradlo, které (skrze jev zpětného rázu fáze) transformuje stav na

∣−⟩⊗12n∑x∈Σn(−1)f(x)∣x⟩.\vert - \rangle \otimes \frac{1}{\sqrt{2^n}} \sum_{x \in \Sigma^n} (-1)^{f(x)} \vert x \rangle.

Pomocí naší formule pro působení vrstvy Hadamardových hradel vidíme, že druhá vrstva Hadamardových hradel pak transformuje tento stav na

∣−⟩⊗12n∑x∈Σn∑y∈Σn(−1)f(x)+x⋅y∣y⟩.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{f(x) + x \cdot y} \vert y \rangle.

Nyní můžeme provést některá zjednodušení v exponentu −1-1 uvnitř sumy. Máme slíbeno, že f(x)=s⋅xf(x) = s\cdot x pro nějaký řetězec s=sn−1⋯s0s = s_{n-1} \cdots s_0, takže můžeme stav vyjádřit jako

∣−⟩⊗12n∑x∈Σn∑y∈Σn(−1)s⋅x+x⋅y∣y⟩.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{s\cdot x + x \cdot y} \vert y \rangle.

Protože s⋅xs\cdot x a x⋅yx\cdot y jsou binární hodnoty, můžeme nahradit sčítání exkluzivním OR — opět proto, že jediné, na čem záleží pro celé číslo v exponentu −1-1, je, zda je sudé nebo liché. Využitím symetrie binárního skalárního součinu získáme tento výraz pro stav:

∣−⟩⊗12n∑x∈Σn∑y∈Σn(−1)(s⋅x)⊕(y⋅x)∣y⟩.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{(s\cdot x) \oplus (y \cdot x)} \vert y \rangle.

(Závorky byly přidány pro přehlednost, i když nejsou opravdu nutné, protože je konvencí považovat binární skalární součin za mající vyšší prioritu než exkluzivní OR.)

V tomto bodě využijeme následující vzorec.

(s⋅x)⊕(y⋅x)=(s⊕y)⋅x(s\cdot x) \oplus (y \cdot x) = (s \oplus y) \cdot x

Tento vzorec můžeme odvodit z podobného vzorce pro bity,

(ac)⊕(bc)=(a⊕b)c,(a c) \oplus (b c) = (a \oplus b) c,

spolu s rozpisem binárního skalárního součinu a bitového exkluzivního OR:

(s⋅x)⊕(y⋅x)=(sn−1xn−1)⊕⋯⊕(s0x0)⊕(yn−1xn−1)⊕⋯⊕(y0x0)=(sn−1⊕yn−1)xn−1⊕⋯⊕(s0⊕y0)x0=(s⊕y)⋅x\begin{aligned} (s\cdot x) \oplus (y \cdot x) & = (s_{n-1} x_{n-1}) \oplus \cdots \oplus (s_{0} x_{0}) \oplus (y_{n-1} x_{n-1}) \oplus \cdots \oplus (y_{0} x_{0}) \\ & = (s_{n-1} \oplus y_{n-1}) x_{n-1} \oplus \cdots \oplus (s_{0} \oplus y_{0}) x_{0} \\ & = (s \oplus y) \cdot x \end{aligned}

To nám umožňuje vyjádřit stav obvodu těsně před měřením takto:

∣−⟩⊗12n∑x∈Σn∑y∈Σn(−1)(s⊕y)⋅x∣y⟩.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{(s\oplus y)\cdot x} \vert y \rangle.

Posledním krokem je využití ještě dalšího vzorce, který platí pro každý binární řetězec z=zn−1⋯z0z = z_{n-1}\cdots z_0.

12n∑x∈Σn(−1)z⋅x={1if z=0n0if z≠0n\frac{1}{2^n} \sum_{x \in \Sigma^n} (-1)^{z \cdot x} = \begin{cases} 1 & \text{if $z = 0^n$}\\ 0 & \text{if $z\neq 0^n$} \end{cases}

Zde používáme jednoduchou notaci pro řetězce, kterou v této lekci použijeme ještě několikrát: 0n0^n je samý-nulový řetězec délky n.n.

Jednoduchý způsob, jak zdůvodnit platnost tohoto vzorce, je zvážit oba případy zvlášť. Pokud z=0nz = 0^n, pak z⋅x=0z\cdot x = 0 pro každý řetězec x∈Σnx\in\Sigma^n, takže hodnota každého členu sumy je 11 a po sečtení a vydělení 2n2^n dostaneme 11. Na druhou stranu, pokud je jakýkoli bit zz roven 11, pak binární skalární součin z⋅xz\cdot x je roven 00 pro přesně polovinu možných voleb x∈Σnx\in\Sigma^n a 11 pro druhou polovinu -- protože hodnota binárního skalárního součinu z⋅xz\cdot x se překlopí (z 00 na 11 nebo z 11 na 00), pokud překlopíme jakýkoli bit xx na pozici, kde má zz hodnotu 11.

Pokud nyní tento vzorec aplikujeme na zjednodušení stavu obvodu před měřením, získáme

∣−⟩⊗12n∑x∈Σn∑y∈Σn(−1)(s⊕y)⋅x∣y⟩=∣−⟩⊗∣s⟩,\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{(s\oplus y)\cdot x} \vert y \rangle = \vert - \rangle \otimes \vert s \rangle,

díky tomu, že s⊕y=0ns\oplus y = 0^n právě tehdy, když y=sy = s. Měření tedy odhalí přesně řetězec ss, který hledáme.

Klasická obtížnost​

Zatímco Deutsch-Jozsův obvod řeší Bernstein-Vaziraniho problém jedním dotazem, jakýkoli klasický dotazovací algoritmus musí k vyřešení tohoto problému provést alespoň nn dotazů.

To lze zdůvodnit takzvaným informačně-teoretickým argumentem, který je v tomto případě velmi jednoduchý. Každý klasický dotaz odhalí jeden bit informace o řešení a je třeba odhalit nn bitů informace -- takže je potřeba alespoň nn dotazů.

Ve skutečnosti je možné vyřešit Bernstein-Vaziraniho problém klasicky dotazováním funkce na každý z nn řetězců, které mají jedinou 11 na každé možné pozici a 00 na všech ostatních bitech, čímž se bity ss odhalují jeden po druhém. Výhoda kvantových algoritmů oproti klasickým je tedy pro tento problém 11 dotaz versus nn dotazů.

Bernstein-Vazirani s Qiskit​

Deutsch-Jozsův obvod jsme již implementovali výše a zde ho využijeme k řešení Bernstein-Vaziraniho problému. Nejprve definujeme funkci, která implementuje dotazovací hradlo pro Bernstein-Vaziraniho problém pro libovolný binární řetězec ss.

def bv_query(s):
# Create a quantum circuit implementing a query gate for the
# Bernstein-Vazirani problem.

qc = QuantumCircuit(len(s) + 1)
for index, bit in enumerate(reversed(s)):
if bit == "1":
qc.cx(index, len(s))
return qc

display(bv_query("1011").draw(output="mpl"))

Output of the previous code cell

Nyní můžeme vytvořit funkci, která spustí Deutsch-Jozsův obvod na funkci pomocí dříve definované funkce compile_circuit.

def bv_algorithm(function: QuantumCircuit):
qc = compile_circuit(function)
result = AerSimulator().run(qc, shots=1, memory=True).result()
return result.get_memory()[0]

display(bv_algorithm(bv_query("1011")))
'1011'

Poznámka k názvosloví​

V kontextu Bernstein-Vaziraniho problému se Deutsch-Jozsův algoritmus běžně označuje jako "Bernstein-Vaziraniho algoritmus." To je mírně zavádějící, protože tento algoritmus je Deutsch-Jozsův algoritmus, jak Bernstein a Vazirani ve své práci jasně uvedli.

Co Bernstein a Vazirani udělali poté, co ukázali, že Deutsch-Jozsův algoritmus řeší Bernstein-Vaziraniho problém (jak je formulován výše), bylo definování mnohem složitějšího problému známého jako problém rekurzivního Fourierova vzorkování. Jde o vysoce umělý problém, kde řešení různých instancí problému efektivně odemykají nové úrovně problému uspořádané do stromové struktury. Bernstein-Vaziraniho problém je v podstatě jen základní případ tohoto složitějšího problému.

Problém rekurzivního Fourierova vzorkování byl prvním známým příkladem dotazovacího problému, kde kvantové algoritmy mají takzvanou super-polynomiální výhodu oproti pravděpodobnostním algoritmům, čímž překonávají výhodu kvantového nad klasickým přístupem, kterou nabízí Deutsch-Jozsův algoritmus. Intuitivně řečeno, rekurzivní verze problému zesiluje výhodu 11 versus nn kvantových algoritmů na něco mnohem většího.

Nejnáročnějším aspektem matematické analýzy prokazující tuto výhodu je ukázat, že klasické dotazovací algoritmy nemohou problém vyřešit bez velkého počtu dotazů. To je dost typické; u mnoha problémů může být velmi obtížné vyloučit kreativní klasické přístupy, které je efektivně řeší.

Simonův problém a algoritmus pro něj popsaný v další sekci však poskytují mnohem jednodušší příklad super-polynomiální (a ve skutečnosti exponenciální) výhody kvantových algoritmů oproti klasickým, a proto se problém rekurzivního Fourierova vzorkování diskutuje méně často. Přesto je to sám o sobě zajímavý výpočetní problém.