Deutschův algoritmus
Deutschův algoritmus řeší problém parity pro speciální případ, kdy V kontextu kvantového počítání se tento problém někdy označuje jako Deutschův problém a v této lekci se budeme držet tohoto pojmenování.
Přesněji řečeno, vstup je reprezentován funkcí z jednoho bitu na jeden bit. Takové funkce existují čtyři:
První a poslední z těchto funkcí jsou konstantní a prostřední dvě jsou vyvážené (balanced), což znamená, že obě možné výstupní hodnoty funkce se vyskytují stejně často, když procházíme všechny vstupy. Deutschův problém spočívá v určení, do které z těchto dvou kategorií vstupní funkce patří: konstantní nebo vyvážená.
Pokud se na vstupní funkci v Deutschově problému díváš jako na reprezentaci náhodného přístupu k řetězci, mluvíme o dvoubitovém řetězci:
Při tomto pohledu Deutschův problém spočívá ve výpočtu parity (nebo ekvivalentně exkluzivního OR) těchto dvou bitů.
Každý klasický dotazovací algoritmus, který správně řeší tento problém, se musí dotázat na oba bity: a Pokud se například dozvíme, že odpověď může být stále nebo v závislosti na tom, zda nebo Každý další případ je obdobný; znalost pouze jednoho ze dvou bitů neposkytuje vůbec žádnou informaci o jejich paritě. Booleovský obvod popsaný v předchozí části je tedy to nejlepší, čeho můžeme dosáhnout z hlediska počtu dotazů potřebných k vyřešení tohoto problému.
Popis kvantového obvodu
Deutschův algoritmus řeší Deutschův problém pomocí jediného dotazu, a poskytuje tak kvantifikovatelnou výhodu kvantového výpočtu oproti klasickému. Může to být skromná výhoda — jeden dotaz oproti dvěma — ale někde začít musíme. Vědecký pokrok má někdy zdánlivě skromné počátky.
Zde je kvantový obvod, který popisuje Deutschův algoritmus:
Analýza
Pro analýzu Deutschova algoritmu projdeme působení výše uvedeného obvodu a identifikujeme stavy qubitů v časech naznačených tímto obrázkem:
Počáteční stav je a dvě Hadamardovy operace na levé straně obvodu transformují tento stav na
(Jak vždy, dodržujeme konvenci řazení qubitů v Qiskitu, která umísťuje horní qubit doprava a dolní qubit doleva.) Může se zdát neintuitivní zapsat tento produktový stav částečně rozepsaný (ponechat stavy qubitu 1 vytažené před závorku), ale díky tomu budou naše pozdější výrazy kompaktnější.
Dále se provede hradlo Podle definice hradla se hodnota funkce pro klasický stav horního/pravého qubitu XORuje na dolní/levý qubit, čímž se transformuje do stavu
Tento výraz můžeme zjednodušit pozorováním, že vzorec
funguje pro obě možné hodnoty Konkrétněji, oba případy vypadají následovně.
Takže můžeme alternativně vyjádřit takto:
Právě se stalo něco zajímavého! Ačkoli působení hradla na standardní bázové stavy ponechává horní/nejpravější qubit beze změny a XORuje hodnotu funkce na spodní/nejlevější qubit, zde vidíme, že se stav horního/nejpravějšího qubitu (obecně) změnil, zatímco stav spodního/nejlevějšího qubitu zůstal stejný — konkrétně ve stavu před i po provedení hradla . Tento jev je známý jako phase kickback (fázový zpětný ráz) a za chvíli si o něm řekneme víc.
S jedním posledním zjednodušením, kterým je vytažení faktoru před součet, získáme tento výraz stavu :
Všimni si, že v tomto výrazu máme v exponentu místo což bychom mohli očekávat z čistě algebraického hlediska, ale výsledek je v obou případech stejný. Je to proto, že hodnota pro libovolné celé číslo závisí pouze na tom, zda je sudé nebo liché.
Aplikací posledního Hadamardova hradla na horní qubit získáme stav
což vede ke správnému výsledku s pravděpodobností při měření pravého/horního qubitu.
Další poznámky k phase kickbacku
Než budeme pokračovat, podívejme se na výše uvedenou analýzu z mírně odlišného úhlu, který může osvětlit jev phase kickbacku.
Nejprve si všimni, že následující vzorec platí pro všechny volby bitů
To lze ověřit kontrolou pro dvě možné hodnoty a :
Pomocí tohoto vzorce vidíme, že
pro každou volbu bitů Protože tento vzorec platí pro a z linearity vyplývá, že
pro všechny stavové vektory qubitu a proto
Klíčem, díky kterému to funguje, je to, že V matematické terminologii je vektor vlastním vektorem matice s vlastním číslem
Vlastní vektory a vlastní čísla probereme podrobněji v nadcházející lekci o odhadu fáze a faktorizaci, kde je jev phase kickbacku zobecněn na další unitární operace.
S vědomím, že skaláry volně procházejí tenzorovými součiny, najdeme alternativní způsob uvažování o tom, jak operace transformuje na ve výše uvedené analýze:
Implementace v Qiskit
Teď se podíváme, jak můžeš implementovat Deutschův algoritmus v Qiskit. Začneme kontrolou verze a poté provedeme importy potřebné výhradně pro tuto implementaci. Pro implementace dalších algoritmů, které následují, provedeme potřebné importy zvlášť kvůli větší modularitě.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-aer
from qiskit import __version__
print(__version__)
2.1.1
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
Nejprve definujeme kvantový obvod, který implementuje dotazovací hradlo pro jednu ze čtyř funkcí nebo z jednoho bitu do jednoho bitu, popsaných dříve. Jak jsme již zmínili, implementace dotazovacího hradla není ve skutečnosti součástí samotného Deutschova algoritmu; zde v podstatě ukazujeme jeden způsob, jak připravit vstup ve formě implementace dotazovacího hradla jako obvod.
def deutsch_function(case: int):
# This function generates a quantum circuit for one of the 4 functions
# from one bit to one bit
if case not in [1, 2, 3, 4]:
raise ValueError("`case` must be 1, 2, 3, or 4.")
f = QuantumCircuit(2)
if case in [2, 3]:
f.cx(0, 1)
if case in [3, 4]:
f.x(1)
return f
Pomocí metody draw si můžeš prohlédnout, jak každý obvod vypadá. Tady je obvod pro funkci
display(deutsch_function(3).draw(output="mpl"))
Dále vytvoříme samotný kvantový obvod pro Deutschův algoritmus, přičemž dotazovací hradlo nahradíme implementací kvantového obvodu zadanou jako argument. Za chvíli do něj zapojíme jeden ze čtyř obvodů definovaných funkcí deutsch_function, kterou jsme definovali dříve.
Bariéry jsou zahrnuty pro vizuální oddělení implementace dotazovacího hradla od zbytku obvodu.
def compile_circuit(function: QuantumCircuit):
# Compiles a circuit for use in Deutsch's algorithm.
n = function.num_qubits - 1
qc = QuantumCircuit(n + 1, n)
qc.x(n)
qc.h(range(n + 1))
qc.barrier()
qc.compose(function, inplace=True)
qc.barrier()
qc.h(range(n))
qc.measure(range(n), range(n))
return qc
Opět si můžeš prohlédnout, jak obvod vypadá, pomocí metody draw.
display(compile_circuit(deutsch_function(3)).draw(output="mpl"))
Nakonec vytvoříme funkci, která spustí dříve definovaný obvod jednou a vypíše odpovídající výsledek: „constant" nebo „balanced".
def deutsch_algorithm(function: QuantumCircuit):
# Determine if a one-bit function is constant or balanced.
qc = compile_circuit(function)
result = AerSimulator().run(qc, shots=1, memory=True).result()
measurements = result.get_memory()
if measurements[0] == "0":
return "constant"
return "balanced"
Teď můžeš spustit Deutschův algoritmus na kteroukoli ze čtyř výše definovaných funkcí.
f = deutsch_function(3)
display(deutsch_algorithm(f))
'balanced'