Shorův algoritmus
Pro tento modul Qiskit in Classrooms musí mít studenti funkční prostředí Python s nainstalovanými následujícími balíčky:
qiskitv2.1.0 nebo novějšíqiskit-ibm-runtimev0.40.1 nebo novějšíqiskit-aerv0.17.0 nebo novějšíqiskit.visualizationnumpypylatexenc
Jak nastavit a nainstalovat výše uvedené balíčky, najdeš v průvodci Instalace Qiskitu. Aby mohli studenti spouštět úlohy na skutečných kvantových počítačích, budou si muset zřídit účet u IBM Quantum® podle kroků v průvodci Nastavení účtu IBM Cloud.
Tento modul byl otestován a využil tři sekundy času QPU. Jedná se pouze o odhad. Skutečná spotřeba se může lišit.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
Úvod
Na začátku 90. let panoval velký entuziasmus ohledně potenciálu kvantových počítačů řešit problémy, které byly pro klasické počítače obtížné. Několik nadaných počítačových vědců navrhlo algoritmy, které demonstrovaly sílu kvantového výpočtu pro některé okrajové, uměle zkonstruované problémy, ale nikomu se nepodařilo najít jedinou „zabijáckou aplikaci" kvantového výpočtu, která by obor bezpochyby revolucionizovala. To se změnilo v roce 1994, kdy Peter Shor přišel s tím, co se dnes nazývá Shorův algoritmus pro faktorizaci velkých čísel.
V té době bylo dobře známo, že nalezení prvočíselných dělitelů velkého čísla je pro klasický počítač nesmírně obtížné. Internetové bezpečnostní protokoly se na tuto obtížnost přímo spoléhaly. Shor našel způsob, jak tyto dělitele nalézt exponenciálně efektivněji tím, že část náročnějších kroků přenesl na teoretický, budoucí kvantový počítač.
V tomto modulu prozkoumáme Shorův algoritmus. Nejprve si trochu více přiblížíme kontext algoritmu, formalizujeme problém, který řeší, a vysvětlíme jeho relevanci pro kybernetickou bezpečnost. Dále si stručně představíme modulární matematiku a to, jak ji aplikovat na problém faktorizace – ukážeme, jak se faktorizace redukuje na jiný problém zvaný „hledání řádu". Ukážeme, jak do toho vstupují Kvantová Fourierova transformace a Kvantové fázové odhadování, o nichž jsme se učili v předchozím modulu, a jak je použít k řešení problému hledání řádu.
Nakonec spustíme Shorův algoritmus na skutečném kvantovém počítači! Měj ale na paměti, že tento algoritmus bude skutečně užitečný až tehdy, až budeme mít velký, bezchybově tolerantní kvantový počítač, což je stále ještě několik let vzdálené. Proto faktorizujeme jen malé číslo, abychom ukázali, jak algoritmus funguje.
Problém faktorizace
Cílem problému faktorizace je najít prvočíselné dělitele čísla . Pro některá čísla je to celkem snadné. Pokud je například sudé, jedním z jeho prvočíselných dělitelů bude 2. Pokud je mocninou prvočísla, tedy pro nějaké prvočíslo , je také poměrně snadné najít: stačí přibližně spočítat -tou odmocninu z a hledat blízká prvočísla, která by mohla být .
Klasické počítače ale mají potíže tehdy, když je liché a není mocninou prvočísla. To je případ, s nímž Shorův algoritmus pracuje. Algoritmus najde dva dělitele a tak, že . Lze ho rekurzivně aplikovat, dokud nejsou všechny dělitele prvočísla. V dalších částech uvidíme, jak se k tomuto problému přistupuje.
Relevance pro kybernetickou bezpečnost
Mnoho kryptografických schémat bylo vybudováno na základě skutečnosti, že faktorizace velkých čísel je obtížná, včetně jednoho, které se dnes běžně používá a nazývá se RSA. V RSA se veřejný klíč vytvoří tak, že se dvě velká prvočísla vynásobí a získá se . Kdokoli pak může tento veřejný klíč použít k šifrování dat. Ale pouze ten, kdo má soukromý klíč, tedy a , může tato data dešifrovat.
Kdyby šlo snadno faktorizovat, mohl by kdokoli zjistit, jaká jsou a , a prolomit šifrování. Ale tak tomu není. Jde o proslule obtížný problém. Prvočíselné dělitele čísla zvaného RSA1024, které má 1024 binárních číslic a 309 desetinných číslic, nebyly dosud nalezeny, přestože za jejich faktorizaci byla v roce 1991 nabídnuta odměna ve výši $100 000.
Shorovo řešení
V roce 1994 si Peter Shor uvědomil, že kvantový počítač dokáže faktorizovat velké číslo exponenciálně efektivněji než klasický počítač. Jeho poznatek se opíral o vztah mezi tímto faktorizačním problémem a modulární aritmetikou. Projdeme si stručný úvod do modulární aritmetiky a poté uvidíme, jak ji lze využít k faktorizaci .
Modulární aritmetika
Modulární aritmetika je systém počítání, který je cyklický – zatímco počítání začíná obvyklým způsobem celými čísly 0, 1, 2 atd., v určitém okamžiku, po období délky , se počítání znovu spustí od začátku. Podívejme se, jak to funguje, na příkladu. Řekněme, že naše perioda je 5. Pak při počítání tam, kde bychom normálně dosáhli 5, začínáme znovu od 0:
Je to proto, že ve světě „modulo-5" je 5 ekvivalentní 0. Říkáme, že . Všechny násobky 5 budou ve skutečnosti ekvivalentní .
Ověř si porozumění
Přečti si níže uvedenou otázku, zamysli se nad odpovědí a poté klikni na trojúhelník a odhal řešení.
Pomocí modulární aritmetiky vyřeš následující úlohu:
Vyrážíš na dlouhou transkontinentální cestu vlakem v 8 hodin ráno. Jízda trvá 60 hodin. Kolik bude hodin, až dorazíš?
Odpověď:
Perioda je 24, protože den má 24 hodin. Tento problém lze tedy zapsat v modulární aritmetice takto:
Dorazíš do cíle tedy ve 20:00, neboli v 8 hodin večer.
a
Často je užitečné zavést dvě množiny, a . je jednoduše množina čísel, která existují ve světě „modulo-". Například při počítání modulo-5 by tato množina byla . Další příklad: . Na prvcích lze provádět sčítání a násobení (modulo ) a výsledek každé z těchto operací je také prvkem , takže tvoří matematický objekt zvaný okruh.
Pro Shorův algoritmus nás zajímá jedna speciální podmnožina . Je to podmnožina čísel z taková, že největší společný dělitel každého prvku a čísla je 1, tedy každý prvek je „nesoudělný" s . Vezmeme-li množinu těchto čísel spolu s operací modulárního násobení, vznikne jiný matematický objekt zvaný grupa. Tuto grupu nazýváme . Ukázalo se, že u (a konečných grup obecně) platí: zvolíme-li libovolný prvek a budeme opakovaně násobit sám sebou, vždy nakonec dostaneme číslo . Minimální počet, kolikrát musíme vynásobit sám sebou, abychom dostali , se nazývá řád čísla . Tento fakt bude pro naši diskusi o faktorizaci čísel níže velmi důležitý.
Ověř si porozumění
Přečti si níže uvedenou otázku, zamysli se nad odpovědí a poté klikni na trojúhelník a odhal řešení.
Jaká je množina ?
Odpověď:
Vyloučili jsme tato čísla:
Jaký je řád každého z prvků množiny ?
Odpověď:
Řád je nejmenší číslo takové, že pro každý prvek .
Všimni si, že ačkoli jsme dokázali najít řád čísel v , obecně to pro větší NENÍ snadný úkol. To je jádro faktorizačního problému a důvod, proč potřebujeme kvantový počítač. Proč tomu tak je, uvidíme, až projdeme zbytek tohoto notebooku.
Aplikace modulární aritmetiky na problém faktorizace
Klíč k nalezení dělitelů a takových, že , spočívá v nalezení nějakého jiného celého čísla takového, že
a
Jak nám nalezení pomůže najít dělitele a ? Projděme si tento argument nyní. Protože , plyne z toho, že . Jinými slovy, je násobkem . Pro nějaké celé číslo tedy platí:
Výraz lze rozložit na:
Z našich počátečních předpokladů víme, že , takže se nedělí beze zbytku ani do , ani do . Oba dělitelé , tedy a , se proto musí každý dělit do a . Buď je dělitelem a dělitelem , nebo naopak. Pokud tedy vypočítáme největší společné dělitele (GCD) mezi a oběma hodnotami a , získáme dělitele a . Výpočet GCD dvou čísel je klasicky snadný úkol, který lze provést například pomocí Eukleidova algoritmu.
Ověř si porozumění
Přečti si níže uvedenou otázku, zamysli se nad odpovědí a poté klikni na trojúhelník a odhal řešení.
Každý krok výše uvedené logiky může být trochu složité pochopit, proto zkus projít příkladem. Použij a . Nejprve ověř, že a . Poté pokračuj v ověřování každého kroku. Nakonec vypočítej a ověř, že jde o dělitele čísla .
Odpověď:
, což je , takže .
, což není ekvivalentní .
, což není ekvivalentní .
Víme, že pro nějaké celé číslo . To se ověří, když dosadíme a : pro .
Nyní musíme vypočítat a .
Nalezli jsme tedy dělitele čísla !
Algoritmus
Teď, když jsme viděli, jak nám nalezení celého čísla takového, že , pomáhá rozložit na součin, můžeme projít Shorův algoritmus. V podstatě se celý scvrkne na nalezení :
- Vyber náhodné celé číslo Vyber náhodné celé číslo takové, že .
- Klasicky spočítej .
- Pokud , už jsi našel(la) dělitele. Zastav se.
- Jinak pokračuj.
-
Najdi řád čísla modulo Najdi nejmenší kladné celé číslo , které splňuje .
-
Zkontroluj, zda je řád sudý
- Pokud je liché, vrať se ke kroku 1 a vyber nové .
- Pokud je sudé, pokračuj ke kroku 4.
- Spočítej
- Ověř, že a .
- Pokud , vrať se ke kroku 1 a vyber nové .
- Jinak spočítej největší společné dělitele a vyextrahuj dělitele:
To budou netriviální dělitelé .
- Rekurzivně rozlož, pokud je to potřeba
- Pokud a/nebo nejsou prvočísla, aplikuj algoritmus rekurzivně, dokud je úplně nerozložíš.
- Jakmile jsou všechny dělitele prvočísla, je rozklad hotový.
Na základě tohoto postupu nemusí být na první pohled zřejmé, proč je k jeho provedení potřeba kvantový počítač. Je to nutné proto, že krok 2 – nalezení řádu modulo – je klasicky velmi obtížný problém. Složitost roste exponenciálně v závislosti na . Ale s kvantovým počítačem stačí využít Kvantové fázové odhadování. Krok 4, nalezení největšího společného dělitele dvou celých čísel, je klasicky docela snadný. Takže jediný krok, který skutečně potřebuje sílu kvantového počítače, je krok hledání řádu. Říkáme, že problém faktorizace se „redukuje" na problém hledání řádu.
Nejtěžší část: hledání řádu
Teď projdeme, jak můžeme při hledání řádu použít kvantový počítač. Nejdřív si ujasněme, co myslíme slovem „řád". Samozřejmě jsem ti matematický význam řádu už vysvětlil(a): je to nejmenší nenulové celé číslo takové, že Ale zkusme pro tento pojem získat trochu více intuice.
Pro dostatečně malá můžeme řád zjistit jednoduše tak, že vypočítáme každou mocninu , vezmeme zbytek po dělení a zastavíme se, až najdeme mocninu splňující . Přesně to jsme dělali v našem příkladu s výše. Pojďme se podívat na grafy těchto modulárních mocnin pro několik vzorových hodnot a :
Všiml(a) sis něčeho? Jsou to periodické funkce! A řád je stejný jako perioda! Hledání řádu je tedy ekvivalentní hledání periody.
Kvantové počítače jsou k nalezení periody funkcí velmi dobře přizpůsobené. K tomu můžeme využít algoritmickou podrutinu zvanou Kvantové fázové odhadování. QPE a jeho vztah ke Kvantové Fourierově transformaci jsme probírali v předchozím modulu. Pro podrobné osvěžení znalostí navštiv modul QFT nebo lekci Johna Watrouse o Kvantovém fázovém odhadování v jeho kurzu Kvantové algoritmy. Teď projdeme jádro postupu:
V Kvantovém fázovém odhadování (QPE) začínáme s unitárním operátorem a jeho vlastním stavem . Poté pomocí QPE přibližně určíme odpovídající vlastní hodnotu, která – jelikož je operátor unitární – bude mít tvar . Nalezení vlastní hodnoty je tedy ekvivalentní nalezení hodnoty v periodické funkci. Circuit vypadá takto:

kde počet řídicích Qubitů (horních Qubitů na obrázku výše) určuje přesnost aproximace.
V Shorově algoritmu používáme QPE na unitární operátor :
Zde označuje stav výpočetní báze víceQubitového registru, kde binární hodnota Qubitů odpovídá celému číslu . Například pokud a , pak je reprezentován čtyřQubitovým bázovým stavem , protože ke kódování čísel až do 15 jsou potřeba čtyři Qubity. (Pokud ti tento pojem není povědomý, podívej se na úvodní modul Qiskit ve třídách, kde najdeš osvěžení o binárním kódování kvantových stavů.)
Teď musíme přijít na to, jaký je vlastní stav tohoto unitárního operátoru. Pokud začneme ve stavu , vidíme, že každá následující aplikace vynásobí stav našeho registru číslem , a po aplikacích se opět dostaneme do stavu . Například pro a :
Superpozice stavů v tomto cyklu () ve tvaru:
jsou tedy všechny vlastními stavy operátoru . (Existuje více vlastních stavů než jen tyto. Ale zajímají nás pouze ty ve výše uvedeném tvaru.)
Ověř si porozumění
Přečti si níže uvedené otázky, zamysli se nad odpovědí a pak klikni na trojúhelník, aby se zobrazilo řešení.
Najdi vlastní stav unitárního operátoru odpovídajícího hodnotám a .
Odpověď:
Takže řád je . Vlastní stavy, které nás zajímají, budou stejnoměrnou superpozicí všech stavů, jimiž jsme prošli výše, s různými fázemi:
Řekněme, že jsme schopni inicializovat stav našeho Qubitu do jednoho z těchto vlastních stavů (spoiler — nejsme. Nebo alespoň ne snadno. Za chvíli vysvětlíme proč a co místo toho lze udělat). Pak bychom mohli použít QPE k odhadnutí odpovídající vlastní hodnoty , kde . Poté budeme schopni určit řád jednoduchým vztahem:
Ale pamatuj, řekl jsem, že QPE odhaduje — nedává nám přesnou hodnotu. Odhad musí být dostatečně přesný, aby bylo možné rozlišit mezi a . Čím více řídicích Qubitů máme, tím přesnější odhad bude. V úlohách na konci lekce budeš vyzván/a, abys určil/a minimální potřebné k faktorizaci čísla .
Nyní musíme vyřešit jeden problém. Celé výše uvedené vysvětlení, jak najít , začíná přípravou vlastního stavu . Jenže nevíme, jak to udělat, aniž bychom již znali. Logika je kruhová. Potřebujeme způsob, jak odhadnout vlastní hodnotu bez inicializace vlastního stavu.
Místo zahájení z vlastního stavu můžeme připravit počáteční stav jako -qubitový stav odpovídající v binárním zápisu (tj. ). Ačkoli tento stav sám o sobě zjevně není vlastním stavem , je superpozicí všech vlastních stavů :
Ověř si porozumění
Přečti si níže uvedené otázky, zamysli se nad odpovědí a pak klikni na trojúhelník, aby se zobrazilo řešení.
Ověř, že je ekvivalentní superpozici přes vlastní stavy, které jsi nalezl/a pro a v předchozí kontrolní otázce.
Odpověď:
Čtyři vlastní stavy byly:
Tedy:
Jak nám to pomůže najít řád ? Protože počáteční stav je superpozicí přes všechny výše uvedené vlastní stavy, algoritmus QPE současně odhaduje každé z odpovídajících těmto vlastním stavům. Měření řídicích Qubitů na konci tedy vydá přibližnou hodnotu , kde je jedna z náhodně zvolených vlastních hodnot. Pokud tento Circuit zopakujeme několikrát a získáme několik vzorků s různými hodnotami , budeme schopni rychle odvodit.
Implementace v Qiskit
Jak jsme zmínili dříve, náš hardware ještě není na takové úrovni, abychom mohli faktorizovat obrovská čísla jako RSA1024. Faktorizujeme jen malé číslo, abychom ukázali, jak algoritmus funguje. Pro tuto ukázku použijeme zjednodušenou verzi kódu uvedeného v tutoriálu Shorova algoritmu. Pokud chceš více podrobností, navštiv daný tutoriál.
Algoritmus spustíme pomocí našeho standardního rámce pro řešení kvantových problémů, který se nazývá rámec Qiskit patterns. Skládá se ze čtyř kroků:
- Převod tvého problému na kvantový Circuit
- Optimalizace Circuitu pro spuštění na kvantovém hardwaru
- Spuštění Circuitu na kvantovém počítači
- Následné zpracování měření
1. Mapování
Faktorizujme a jako naše nesoudělné celé číslo zvolme .
Nejprve musíme sestavit Circuit, který implementuje unitární operátor modulárního násobení . To je ve skutečnosti nejtrickovější část celé implementace a může být výpočetně velmi náročné v závislosti na způsobu provedení. Zde si trochu podvedeme: víme, že začínáme ve stavu a z dřívější kontrolní otázky platí:
Sestrojíme tedy unitární operátor, který provede správné operace na těchto čtyřech stavech, ale ostatní stavy ponechá beze změny. To je podvod, protože využíváme znalost řádu čísla ke zjednodušení unitárního operátoru. Kdybychom se skutečně snažili faktorizovat číslo, jehož faktory nám nejsou známy, nemohli bychom to takto udělat.
Ověř si porozumění
Přečti si otázku (otázky) níže, zamysli se nad odpovědí a pak klikni na trojúhelník, aby se zobrazilo řešení.
Na základě svých znalostí o tom, jak operátor transformuje výše uvedené stavy, zkonstruuj tento operátor jako posloupnost hradel SWAP, která vzájemně vyměňují stavy dvou qubitů. (Nápověda: pomůže ti zapsat každý stav ve dvojkové soustavě.)
Odpověď:
Přepišme působení na stavy ve dvojkové soustavě:
Každé z těchto zobrazení lze provést jednoduchým hradlem SWAP. získáme prohozením stavů qubitu a . získáme prohozením stavů qubitu a . A tak dále. Matici tedy lze rozložit na následující posloupnost hradel SWAP:
S vědomím, že operátory působí zprava doleva, ověřme, že to má požadovaný efekt na každý ze stavů:
Nyní můžeme zakódovat Circuit, který je ekvivalentní tomuto operátoru, v Qiskitu.
Nejprve naimportujeme potřebné balíčky:
# Import necessary packages
import numpy as np
from fractions import Fraction
from math import floor, gcd, log
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.circuit.library import QFTGate
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.visualization import plot_histogram
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import SamplerV2 as Sampler
Pak vytvoříme operátor :
def M2mod15():
"""
M2 (mod 15)
"""
b = 2
U = QuantumCircuit(4)
U.swap(2, 3)
U.swap(1, 2)
U.swap(0, 1)
U = U.to_gate()
U.name = f"M_{b}"
return U
# Get the M2 operator
M2 = M2mod15()
# Add it to a circuit and plot
circ = QuantumCircuit(4)
circ.compose(M2, inplace=True)
circ.decompose(reps=2).draw(output="mpl", fold=-1)
Algoritmus QPE používá řízené hradlo (controlled-). Teď, když máme Circuit pro , musíme z něj udělat řízený- Circuit:
def controlled_M2mod15():
"""
Controlled M2 (mod 15)
"""
b = 2
U = QuantumCircuit(4)
U.swap(2, 3)
U.swap(1, 2)
U.swap(0, 1)
U = U.to_gate()
U.name = f"M_{b}"
c_U = U.control()
return c_U
# Get the controlled-M2 operator
controlled_M2 = controlled_M2mod15()
# Add it to a circuit and plot
circ = QuantumCircuit(5)
circ.compose(controlled_M2, inplace=True)
circ.decompose(reps=1).draw(output="mpl", fold=-1)
Nyní máme naše řízené hradlo . Abychom ale mohli spustit algoritmus Quantum Phase Estimation, budeme potřebovat řízené , řízené , až po řízené , kde je počet qubitů použitých k odhadu fáze. Čím více qubitů, tím přesnější odhad fáze. Pro náš postup odhadu fáze použijeme řídicích qubitů. Potřebujeme tedy:
kde index , přičemž , odpovídá řídicímu qubitu. Vypočítejme nyní pro každou hodnotu :
def a2kmodN(a, k, N):
"""Compute a^{2^k} (mod N) by repeated squaring"""
for _ in range(k):
a = int(np.mod(a**2, N))
return a
k_list = range(8)
b_list = [a2kmodN(2, k, 15) for k in k_list]
print(b_list)
[2, 4, 1, 1, 1, 1, 1, 1]
Protože pro , jsou všechny odpovídající operátory ( a vyšší) ekvivalentní identitě. Potřebujeme tedy zkonstruovat jen jednu další matici:
Poznámka: Toto zjednodušení funguje zde pouze proto, že řád je . Jakmile (tedy ), každá další mocnina operátoru je identita. Obecně platí, že pro vět ší čísla nebo jiné volby nelze přeskočit konstrukci vyšších mocnin. To je jeden z důvodů, proč se jedná o hračkový příklad: malá čísla umožňují zkratky, které by pro větší případy nefungovaly.
def M4mod15():
"""
M4 (mod 15)
"""
b = 4
U = QuantumCircuit(4)
U.swap(1, 3)
U.swap(0, 2)
U = U.to_gate()
U.name = f"M_{b}"
return U
# Get the M4 operator
M4 = M4mod15()
# Add it to a circuit and plot
circ = QuantumCircuit(4)
circ.compose(M4, inplace=True)
circ.decompose(reps=2).draw(output="mpl", fold=-1)
A stejně jako předtím z něj uděláme řízený- operátor:
def controlled_M4mod15():
"""
Controlled M4 (mod 15)
"""
b = 4
U = QuantumCircuit(4)
U.swap(1, 3)
U.swap(0, 2)
U = U.to_gate()
U.name = f"M_{b}"
c_U = U.control()
return c_U
# Get the controlled-M4 operator
controlled_M4 = controlled_M4mod15()
# Add it to a circuit and plot
circ = QuantumCircuit(5)
circ.compose(controlled_M4, inplace=True)
circ.decompose(reps=1).draw(output="mpl", fold=-1)
Nyní vše složíme dohromady, abychom s pomocí odhadu fáze nalezli řád pomocí kvantového Circuit:
# Order finding problem for N = 15 with a = 2
N = 15
a = 2
# Number of qubits
num_target = floor(log(N - 1, 2)) + 1 # for modular exponentiation operators
num_control = 2 * num_target # for enough precision of estimation
# List of M_b operators in order
k_list = range(num_control)
b_list = [a2kmodN(2, k, 15) for k in k_list]
# Initialize the circuit
control = QuantumRegister(num_control, name="C")
target = QuantumRegister(num_target, name="T")
output = ClassicalRegister(num_control, name="out")
circuit = QuantumCircuit(control, target, output)
# Initialize the target register to the state |1>
circuit.x(num_control)
# Add the Hadamard gates and controlled versions of the
# multiplication gates
for k, qubit in enumerate(control):
circuit.h(k)
b = b_list[k]
if b == 2:
circuit.compose(
M2mod15().control(), qubits=[qubit] + list(target), inplace=True
)
elif b == 4:
circuit.compose(
M4mod15().control(), qubits=[qubit] + list(target), inplace=True
)
else:
continue # M1 is the identity operator
# Apply the inverse QFT to the control register
circuit.compose(QFTGate(num_control).inverse(), qubits=control, inplace=True)
# Measure the control register
circuit.measure(control, output)
circuit.draw("mpl", fold=-1)
2. Optimize
Teď, když jsme namapovali náš Circuit, je dalším krokem jeho optimalizace pro spuštění na konkrétním kvantovém počítači. Nejprve musíme načíst Backend.
service = QiskitRuntimeService()
backend = service.backend("ibm_marrakesh")
Pokud nemáš na svém účtu dostupný čas nebo chceš z jakéhokoli důvodu použít simulátor, můžeš spustit níže uvedenou buňku a nastavit simulátor, který bude napodobovat kvantové zařízení, které jsme vybrali výše:
pm = generate_preset_pass_manager(optimization_level=2, backend=backend)
transpiled_circuit = pm.run(circuit)
print(f"2q-depth: {transpiled_circuit.depth(lambda x: x.operation.num_qubits==2)}")
print(f"2q-size: {transpiled_circuit.size(lambda x: x.operation.num_qubits==2)}")
print(f"Operator counts: {transpiled_circuit.count_ops()}")
transpiled_circuit.draw(output="mpl", fold=-1, style="clifford", idle_wires=False)
2q-depth: 188
2q-size: 281
Operator counts: OrderedDict({'sx': 548, 'rz': 380, 'cz': 281, 'measure': 8, 'x': 6})

3. Execute
# Sampler primitive to obtain the probability distribution
sampler = Sampler(backend)
# Turn on dynamical decoupling with sequence XpXm
sampler.options.dynamical_decoupling.enable = True
sampler.options.dynamical_decoupling.sequence_type = "XpXm"
# Enable gate twirling
sampler.options.twirling.enable_gates = True
pub = transpiled_circuit
job = sampler.run([pub], shots=1024)
result = job.result()[0]
counts = result.data["out"].get_counts()
plot_histogram(counts, figsize=(35, 5))

Vidíme čtyři zřetelné vrcholy u 00000000, 01000000, 10000000 a 11000000, přičemž v ostatních bitových řetězcích jsou určité počty způsobené šumem kvantového počítače. Tyto výsledky budeme ignorovat a ponecháme pouze dominantní čtyři tím, že zavedeme prahovou hodnotu: za skutečný signál nad šumem se považují pouze počty přesahující tento práh.
# Dictionary of bitstrings and their counts to keep
counts_keep = {}
# Threshold to filter
threshold = np.max(list(counts.values())) / 2
for key, value in counts.items():
if value > threshold:
counts_keep[key] = value
print(counts_keep)
4. Post-process
V případě Shorova algoritmu se velká část algoritmu provádí klasicky. Proto zbytek umístíme do kroku „post-processingu", poté co získáme měření z kvantového počítače. Každé z výše uvedených měření lze převést na celá čísla, která po vydělení hodnotou tvoří naše aproximace , kde je pokaždé náhodné.
a = 2
N = 15
FACTOR_FOUND = False
num_attempt = 0
while not FACTOR_FOUND:
print(f"\nATTEMPT {num_attempt}:")
# Here, we get the bitstring by iterating over outcomes
# of a previous hardware run with multiple shots.
# Instead, we can also perform a single-shot measurement
# here in the loop.
bitstring = list(counts_keep.keys())[num_attempt]
num_attempt += 1
# Find the phase from measurement
decimal = int(bitstring, 2)
phase = decimal / (2**num_control) # phase = k / r
print(f"Phase: theta = {phase}")
# Guess the order from phase
frac = Fraction(phase).limit_denominator(N)
r = frac.denominator # order = r
print(f"Order of {a} modulo {N} estimated as: r = {r}")
if phase != 0:
# Guesses for factors are gcd(a^{r / 2} ± 1, 15)
if r % 2 == 0:
x = pow(a, r // 2, N) - 1
d = gcd(x, N)
if d > 1:
FACTOR_FOUND = True
print(f"*** Non-trivial factor found: {x} ***")
ATTEMPT 0:
Phase: theta = 0.0
Order of 2 modulo 15 estimated as: r = 1
ATTEMPT 1:
Phase: theta = 0.75
Order of 2 modulo 15 estimated as: r = 4
*** Non-trivial factor found: 3 ***
Závěr
Po absolvování tohoto modulu možná budeš nově obdivovat genialitu Petera Shora, který přišel s tak důmyslným algoritmem. Doufejme však, že jsi také dosáhl nové úrovně porozumění jeho klamné jednoduchosti. Ačkoli se algoritmus může zdát působivě (nebo intimidujícím způsobem) složitý, pokud ho rozložíš do jednotlivých logických kroků a projdeš je pomalu, i ty budeš schopen spustit Shorův algoritmus.
I když jsme daleko od použití tohoto algoritmu k faktorizaci čísel jako RSA1024, naše kvantové počítače se každým dnem zlepšují a jakmile bude dosažena hranice nazývaná odolnost vůči chybám, brzy budou následovat i takovéto algoritmy. Je to vzrušující doba pro studium kvantové informatiky!
Úlohy
Klíčové pojmy:
- Moderní kryptografické systémy se spoléhají na klasickou obtížnost faktorizace velkých celých čísel.
- Modulární aritmetika — včetně struktur a — poskytuje matematický základ Shorova algoritmu.
- Problém faktorizace celého čísla lze redukovat na problém nalezení řádu čísla modulo .
- Kvantové hledání řádu využívá techniky kvantové fázové estimace k určení periody funkce .
- Shorův algoritmus se skládá z klasicko-kvantového hybridního postupu, který vybere základ, provede kvantové hledání řádu a poté klasicky vypočítá faktory z výsledku.