Algorytm Shora
Na potrzeby tego modułu Qiskit in Classrooms uczniowie muszą mieć działające środowisko Python z zainstalowanymi następującymi pakietami:
qiskitw wersji 2.1.0 lub nowszejqiskit-ibm-runtimew wersji 0.40.1 lub nowszejqiskit-aerw wersji 0.17.0 lub nowszejqiskit.visualizationnumpypylatexenc
Aby skonfigurować i zainstalować powyższe pakiety, zapoznaj się z przewodnikiem Instalacja Qiskit. Aby uruchamiać zadania na prawdziwych komputerach kwantowych, uczniowie muszą założyć konto w IBM Quantum®, postępując zgodnie z instrukcjami w przewodniku Konfiguracja konta IBM Cloud.
Ten moduł był testowany i wykorzystał trzy sekundy czasu QPU. To jedynie szacunek. Twoje rzeczywiste zużycie może być inne.
# 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'
Wprowadzenie
Na początku lat 90. XX wieku narastał entuzjazm związany z potencjałem komputerów kwantowych do rozwiązywania problemów trudnych dla klasycznych komputerów. Kilku utalentowanych informatyków opracowało algorytmy demonstrujące moc obliczeń kwantowych dla wybranych, niszowych problemów, lecz nikomu nie udało się znaleźć jednej, przełomowej „zabójczej aplikacji" dla obliczeń kwantowych, która zrewolucjonizowałaby tę dziedzinę. Tak było aż do 1994 roku, kiedy Peter Shor wymyślił to, co dziś nazywamy algorytmem Shora – służący do faktoryzacji dużych liczb.
W tamtych czasach powszechnie wiadomo było, że znalezienie czynników pierwszych dużej liczby jest niezwykle trudne dla klasycznego komputera. Właśnie na tej trudności opierały się protokoły bezpieczeństwa w internecie. Shor odkrył sposób na wykładniczo bardziej efektywne znajdowanie tych czynników, przenosząc najtrudniejsze etapy obliczeń na teoretyczny, przyszły komputer kwantowy.
W tym module przyjrzymy się algorytmowi Shora. Najpierw zarysujemy szerszy kontekst, formalizując problem, który rozwiązuje, i wyjaśniając jego znaczenie dla cyberbezpieczeństwa. Następnie przedstawimy wprowadzenie do matematyki modularnej i pokażemy, jak zastosować ją do problemu faktoryzacji — wyjaśniając, jak faktoryzacja sprowadza się do innego zagadnienia, zwanego „znajdowaniem rzędu". Zobaczymy, jak Kwantowa Transformata Fouriera i Kwantowe Szacowanie Fazy, poznane w poprzednim module, wchodzą do gry, oraz jak ich użyć do rozwiązania problemu znajdowania rzędu.
Na koniec uruchomimy algorytm Shora na prawdziwym komputerze kwantowym! Pamiętaj jednak, że algorytm ten będzie naprawdę użyteczny dopiero wtedy, gdy będziemy dysponować dużym, odpornym na błędy komputerem kwantowym — co wciąż jest kwestią kilku najbliższych lat. Dlatego po prostu rozłożymy małą liczbę na czynniki, żeby pokazać, jak algorytm działa.
Problem faktoryzacji
Celem problemu faktoryzacji jest znalezienie czynników pierwszych liczby . Dla niektórych wartości jest to dość proste. Na przykład, jeśli jest parzyste, jednym z jego czynników pierwszych będzie 2. Jeśli jest potęgą liczby pierwszej, tzn. dla pewnej liczby pierwszej , znalezienie jest również stosunkowo łatwe: wystarczy przybliżyć -ty pierwiastek z i poszukać pobliskich liczb pierwszych, które mogłyby być wartością .
Klasyczne komputery mają jednak problemy w sytuacji, gdy jest nieparzyste i nie jest potęgą liczby pierwszej. To właśnie ten przypadek rozwiązuje algorytm Shora. Algorytm znajduje dwa czynniki i takie, że . Można go stosować rekurencyjnie, aż wszystkie czynniki będą pierwsze. W kolejnych sekcjach zobaczymy, jak podchodzi się do tego problemu.
Znaczenie dla cyberbezpieczeństwa
Wiele schematów kryptograficznych zostało zbudowanych w oparciu o fakt, że faktoryzacja dużych liczb jest trudna — w tym jeden powszechnie stosowany dziś schemat o nazwie RSA. W RSA klucz publiczny powstaje przez pomnożenie dwóch dużych liczb pierwszych, dając . Każdy może użyć tego klucza publicznego do szyfrowania danych. Jednak tylko ktoś posiadający klucz prywatny, i , może je odszyfrować.
Gdyby dało się łatwo rozłożyć na czynniki, każdy mógłby ustalić wartości i i złamać szyfrowanie. Ale tak nie jest. To słynnie trudny problem. W rzeczywistości czynniki pierwsze liczby RSA1024 — mającej 1024 cyfry w zapisie binarnym i 309 cyfr w zapisie dziesiętnym — nie zostały znalezione do dziś, mimo że za jej faktoryzację jeszcze w 1991 roku zaoferowano nagrodę w wysokości $100 000.
Rozwiązanie Shora
W 1994 roku Peter Shor zdał sobie sprawę, że komputer kwantowy mógłby rozkładać dużą liczbę na czynniki wykładniczo efektywniej niż klasyczny komputer. Jego spostrzeżenie opierało się na związku między problemem faktoryzacji a arytmetyką modularną. Przedstawimy krótkie wprowadzenie do arytmetyki modularnej, a następnie zobaczymy, jak można jej użyć do faktoryzacji .
Arytmetyka modularna
Arytmetyka modularna to cykliczny system liczenia, w którym liczenie zaczyna się w zwykły sposób — od liczb całkowitych 0, 1, 2 itd. — lecz po pewnym czasie, po upłynięciu okresu , zaczyna się od nowa. Zobaczmy, jak to działa na przykładzie. Niech nasz okres wynosi 5. Wtedy podczas liczenia, w miejscu, gdzie normalnie pojawiłoby się 5, zaczynamy od nowa od 0:
Wynika to stąd, że w „świecie modulo 5" liczba 5 jest równoważna 0. Mówimy, że . W istocie wszystkie wielokrotności 5 będą równoważne .
Sprawdź swoją wiedzę
Przeczytaj poniższe pytania, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby odkryć rozwiązanie.
Użyj arytmetyki modularnej, aby rozwiązać następujący problem:
Wyruszasz w długą, transkontynentalną podróż pociągiem o godzinie 8:00. Podróż trwa 60 godzin. O której godzinie przyjeżdżasz?
Odpowiedź:
Okres wynosi 24, ponieważ doba ma 24 godziny. Zadanie można więc zapisać w arytmetyce modularnej jako:
Dotrzesz więc do celu o godzinie 20:00, czyli o 20:00 wieczorem.
i
Przydatne jest wprowadzenie dwóch zbiorów: i . to po prostu zbiór liczb istniejących w „świecie modulo ". Na przykład, gdy liczyliśmy modulo 5, zbiór ten to . Inny przykład: . Na elementach można wykonywać dodawanie i mnożenie (modulo ), a wynik każdej z tych operacji również należy do , co czyni obiektem matematycznym zwanym pierścieniem.
Dla algorytmu Shora szczególnie interesujący jest pewien podzbiór . Jest to podzbiór liczb z , dla których największy wspólny dzielnik każdego elementu i wynosi 1, tzn. każdy element jest „wzajemnie pierwszym" z . Jeśli weźmiemy zbiór tych liczb wraz z operacją mnożenia modularnego, otrzymamy inny obiekt matematyczny zwany grupą. Grupę tę oznaczamy . Okazuje się, że w (i skończonych grupach w ogólności), jeśli wybierzemy dowolny element i będziemy wielokrotnie mnożyć przez siebie, zawsze w końcu otrzymamy liczbę . Minimalna liczba mnożeń przez siebie potrzebna do uzyskania nosi nazwę rzędu elementu . Fakt ten będzie bardzo ważny w naszej dyskusji o tym, jak faktoryzować liczby.
Sprawdź swoją wiedzę
Przeczytaj poniższe pytania, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby odkryć rozwiązanie.
Czym jest ?
Odpowiedź:
Wykluczyliśmy następujące liczby:
Jaki jest rząd każdego z elementów ?
Odpowiedź:
Rząd to najmniejsza liczba taka, że dla każdego elementu .
Zauważ, że choć byliśmy w stanie wyznaczyć rząd liczb w , w ogólności — dla większych — NIE jest to łatwe zadanie. To sedno problemu faktoryzacji i powód, dla którego potrzebujemy komputera kwantowego. Zobaczymy dlaczego, gdy będziemy przechodzić przez dalszą część tego notesu.
Zastosowanie arytmetyki modularnej do problemu faktoryzacji
Kluczem do znalezienia czynników i takich, że , jest znalezienie pewnej innej liczby całkowitej spełniającej
i
Jak znalezienie pomaga nam wyznaczyć czynniki i ? Przeprowadźmy teraz to rozumowanie. Ponieważ , oznacza to, że . Innymi słowy, jest wielokrotnością . A zatem dla pewnej liczby całkowitej :
Możemy rozłożyć na czynniki:
Z naszych początkowych założeń wiemy, że , więc nie dzieli równo ani , ani . Zatem dwa czynniki , czyli i , muszą każdy dzielić odpowiednio i . Albo jest czynnikiem , a czynnikiem , albo odwrotnie. Dlatego obliczając największe wspólne dzielniki (NWD) między a i , otrzymamy czynniki i . Wyznaczenie NWD dwóch liczb jest klasycznie łatwym zadaniem, które można wykonać np. za pomocą algorytmu Euklidesa.
Sprawdź swoją wiedzę
Przeczytaj poniższe pytania, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby odkryć rozwiązanie.
Zrozumienie każdego kroku powyższego rozumowania może być niełatwe, dlatego spróbuj prześledzić je na przykładzie. Użyj i . Najpierw zweryfikuj, że i . Następnie sprawdź każdy kolejny krok. Na koniec oblicz i zweryfikuj, że są to czynniki liczby .
Odpowiedź:
, co wynosi , zatem .
, co nie jest równoważne .
, co nie jest równoważne .
Wiemy teraz, że dla pewnej liczby całkowitej . Weryfikujemy to, podstawiając i : dla .
Teraz musimy obliczyć i .
Znaleźliśmy czynniki liczby !
The algorithm
Teraz, gdy wiemy już, jak znalezienie pewnej liczby całkowitej spełniającej warunek pomaga nam rozłożyć na czynniki, możemy przejść przez algorytm Shora. Sprowadza się on w zasadzie do znalezienia :
- Wybierz losową liczbę całkowitą Wybierz losową liczbę całkowitą taką, że .
- Oblicz klasycznie.
- Jeśli , znalazłeś już czynnik. Zakończ.
- W przeciwnym razie kontynuuj.
-
Znajdź rząd liczby modulo Znajdź najmniejszą dodatnią liczbę całkowitą spełniającą .
-
Sprawdź, czy rząd jest parzysty
- Jeśli jest nieparzyste, wróć do kroku 1 i wybierz nowe .
- Jeśli jest parzyste, przejdź do kroku 4.
- Oblicz
- Sprawdź, czy oraz .
- Jeśli , wróć do kroku 1 i wybierz nowe .
- W przeciwnym razie oblicz NWD, aby wyłuskać czynniki:
Będą to nietrywialnie czynniki .
- W razie potrzeby rozłóż rekurencyjnie
- Jeśli i/lub nie są liczbami pierwszymi, zastosuj algorytm rekurencyjnie, aby je w pełni rozłożyć.
- Gdy wszystkie czynniki są pierwsze, rozkład jest kompletny.
Na podstawie tej procedury może nie być oczywiste, dlaczego do wykonania tego zadania potrzebny jest komputer kwantowy. Jest to konieczne, ponieważ krok 2 — znalezienie rzędu modulo — jest klasycznie bardzo trudnym problemem. Złożoność rośnie wykładniczo względem . Jednak przy użyciu komputera kwantowego wystarczy skorzystać z Kwantowej Estymacji Fazy (Quantum Phase Estimation), aby go rozwiązać. Krok 4, czyli znalezienie NWD dwóch liczb całkowitych, jest natomiast klasycznie dość prostym zadaniem. Mówimy zatem, że problem rozkładu na czynniki „redukuje się" do problemu wyznaczania rzędu.
The hard part: order finding
Teraz omówimy, jak można użyć komputera kwantowego do wyznaczania rzędu. Najpierw wyjaśnijmy dokładniej, co rozumiemy przez „rząd". Oczywiście podałem już jego matematyczne znaczenie: to pierwsza niezerowa liczba całkowita taka, że . Spróbujmy jednak nieco lepiej wyczuć intuicję kryjącą się za tym pojęciem.
Dla wystarczająco małego możemy po prostu wyznaczyć rząd, obliczając kolejne potęgi , biorąc modulus każdego wyniku, a następnie zatrzymując się, gdy znajdziemy potęgę spełniającą . Tak właśnie zrobiliśmy w powyższym przykładzie z . Przyjrzyjmy się wykresom tych potęg modularnych dla kilku przykładowych wartości i :
Zauważasz coś? To są funkcje periodyczne! A rząd jest równy okresowi! Wyznaczanie rzędu jest zatem równoważne z wyznaczaniem okresu.
Komputery kwantowe doskonale nadają się do znajdowania okresu funkcji. W tym celu możemy skorzystać z podprocedury algorytmicznej zwanej Kwantową Estymacją Fazy (Quantum Phase Estimation). Omawialiśmy QPE i jej związek z Kwantową Transformatą Fouriera w poprzednim module. Szczegółowe przypomnienie znajdziesz w module QFT lub w lekcji Johna Watrouca dotyczącej Kwantowej Estymacji Fazy w jego kursie algorytmów kwantowych. Teraz omówimy ogólny zarys procedury:
W Kwantowej Estymacji Fazy (QPE) zaczynamy od unitarnego operatora oraz własnego stanu tego unitarnego . Następnie używamy QPE do przybliżenia odpowiedniej wartości własnej, która — ponieważ operator jest unitarny — ma postać . Znalezienie wartości własnej jest zatem równoważne ze znalezieniem wartości w funkcji periodycznej. Układ (Circuit) wygląda następująco:

gdzie liczba Qubitów sterujących (górne Qubitów na powyższym rysunku) wyznacza dokładność przybliżenia.
W algorytmie Shora stosujemy QPE na unitarnym operatorze :
Tutaj oznacza stan z bazy obliczeniowej wieloQubitowego rejestru, gdzie binarna wartość Qubitów odpowiada liczbie całkowitej . Na przykład, jeśli i , to jest reprezentowane przez czteroQubitowy stan bazowy , ponieważ do zakodowania liczb do 15 potrzebne są cztery Qubity. (Jeśli to pojęcie jest Ci nieznane, zajrzyj do wstępnego modułu Qiskit w Classrooms, gdzie znajdziesz przypomnienie o binarnym kodowaniu stanów kwantowych.)
Musimy teraz znaleźć stan własny tego operatora unitarnego. Jeśli zaczęlibyśmy w stanie , każde kolejne zastosowanie przemnożyłoby stan naszego rejestru przez , a po zastosowaniach wrócimy do stanu . Na przykład dla i :
Zatem superpozycje stanów w tym cyklu () postaci:
są stanami własnymi . (Istnieje więcej stanów własnych niż tylko te. Ale interesują nas wyłącznie stany powyższej postaci.)
Check your understanding
Przeczytaj poniższe pytanie(-a), zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby ujawnić rozwiązanie.
Znajdź stan własny operatora unitarnego odpowiadającego i .
Odpowiedź:
Zatem rząd . Interesujące nas stany własne będą równą superpozycją wszystkich stanów, przez które przechodził powyższy cykl, z różnymi fazami:
Powiedzmy, że bylibyśmy w stanie zainicjować stan naszego Qubita w jednym z tych stanów własnych (uwaga — nie jesteśmy. Przynajmniej nie w prosty sposób. Za chwilę wyjaśnimy, dlaczego i co można zamiast tego zrobić). Wtedy moglibyśmy użyć QPE do oszacowania odpowiedniej wartości własnej, , gdzie . Następnie będziemy mogli wyznaczyć rząd z prostego równania:
Pamiętaj jednak, że QPE jedynie przybliża — nie podaje dokładnej wartości. Potrzebujemy, aby przybliżenie było wystarczająco dobre, by odróżnić od . Im więcej Qubitów sterujących , tym lepsze będzie przybliżenie. W zadaniach na końcu lekcji zostaniesz poproszony(-a) o wyznaczenie minimalnej wartości potrzebnej do rozłożenia liczby na czynniki.
Musimy teraz rozwiązać pewien problem. Całe powyższe wyjaśnienie, jak znaleźć , zaczyna się od przygotowania stanu własnego . Nie wiemy jednak, jak to zrobić bez uprzedniej znajomości . Rozumowanie jest kołowe. Potrzebujemy sposobu na oszacowanie wartości własnej bez inicjowania stanu własnego.
Zamiast zaczynać od stanu własnego , możemy przygotować stan początkowy jako -Qubitowy stan odpowiadający w zapisie binarnym (tzn. ). Choć ten stan sam w sobie oczywiście nie jest stanem własnym , jest superpozycją wszystkich stanów własnych :