„Spojrzeniem wbitym w pustki mgliste
w czarnym daleku szukam Ciebie”
 

(Stanisław Staszewski, Most)

W czasie kiedy wszyscy piszą i mówią o AI, trochę z boku i znacznie mniej medialnie kształtuje się zalążek innej, potencjalnie większej niż AI, rewolucji. Komputer kwantowy, o tym się  pisze i mówi, ale, no właśnie, czy ktoś takowy widział, czy ktoś uruchomił na nim jakiś program? Na oba pytania możemy już dzisiaj odpowiedzieć „tak”. Potrafimy z sukcesem uruchomić proste (niestety wciąż tylko naprawdę proste) algorytmy na komputerach kwantowych i otrzymać jakieś, zbliżone do oczekiwanych, wyniki. Technologia jest „w powijakach”, pomimo wielu lat pracy i góry pieniędzy. Te „powijaki” to dosyć dobre określenie stanu aktualnego a do realnej rewolucji jest jeszcze daleko. Jednak już dzisiaj, jak sądzę, pewne jest, że ona nastąpi. Dlatego też zachęcam do zapoznania się z podstawami (jeżeli ich się jeszcze nie zna), przedstawię je poniżej, a zachęcam tym bardziej, że w sieci odnajdujemy „tony” treści w tym temacie o wartości bliskiej zeru (szkoda czasu) a ja postaram się temat przedstawić na tyle prosto, że każdy kto rozumie „zwykłe” komputery, powinien także zrozumieć kwantowe, choć będzie potrzeba odrobinę elastyczności w myśleniu i swobody w zakresie wyobraźni.

Zaczniemy od omówienia podstaw. Podstawą klasycznych komputerów jest bit, pojedyncza jednostka informacji, jeden albo zero (nigdy jeden i zero jednocześnie) a dalej bajt, czyli zestaw takich bitów, może to być np. 16 bitów. Takie 16 bitów, możemy sobie umieścić w dowolnym rejestrze procesora np. w bardzo popularnym EAX i wykonywać na nich jakieś operacje. Co to znaczy „umieścić”? To znaczy, że możemy do takiego rejestru wpisać jakąś liczbę (w danej chwili wyłącznie jedną) np. liczbę dziesiętną 17, która w systemie binarnym ma postać 10001, co wpisane do 16 bitowego rejestru EAX będzie wyglądać tak:

blog it

Co to znaczy „wykonać jakąś operację”? To znaczy, że możemy na aktualnej wartości w takim rejestrze wykonać jakieś działanie, dodać liczbę, porównać z jakąś liczbą itp. Możemy np. dodać do naszej liczby, liczbę 3 (add eax 3), co spowoduje, że po czasie jednego „tyknięcia” zegara procesora rejestr EAX będzie wyglądał tak (10100 to dziesiętnie 20):

blog it

Co ważne i warto to zapamiętać

  • w rejestrze może być w jednej chwili zapisana tylko jedna liczba
  • na wartości w rejestrze można wykonać różne operacje zmieniające jego wartość, zapis, dodawanie, mnożenie …, zajmuje to zazwyczaj jeden lub kilka „taktów” zegara procesora
  • wartość zapisaną w rejestrze można dowolną ilość razy odczytywać ze 100% pewnością odczytania poprawnej wartości

Konsekwencje powyższego, choć w oczywisty sposób naturalne, są dosyć drastyczne, dość powiedzieć, że aby w naszym przykładzie dodać do siebie milion liczb, trzeba by wykonać milion operacji na rejestrze, co spowoduje, że cały proces potrwa milion cykli procesora (mniej więcej), a to pomimo, że procesory są szybkie, dosyć długo. A gdyby mieć milion milionów milionów liczb do dodania czy przeszukania … dochodzimy do ściany, nikt tak długo nie zdoła poczekać. Podsumujmy, schemat działania w zwykłym komputerze wygląda tak:

blog it

Przejdźmy do komputerów kwantowych. Tu analogicznie do bit’a mamy qbit’a. Qbit jest to byt pozwalający na przechowywanie także jedynki i zera ale jednocześnie, w taki sposób, że jest on jednocześnie w pewnym stopniu wartością jeden a w pewnym wartością zero (zwie się to superpozycją), może być tylko zerem i wcale jedynką i odwrotnie, może być trochę (np. 20%) jedynką i trochę zerem (np. 80%) i odwrotnie, oraz w dowolnych kombinacjach sumujących się do 100%. Co ważne stan qbitu nie jest deterministyczny, co znaczy, że te powyższe procenty są tylko prawdopodobieństwem, z którym odczytując qbit dostaniemy daną wartość. Co nie gwarantuje, że w powyższym przykładzie otrzymamy zero bo prawdopodobieństwo 80% jest większe od 20%, nie, możemy z powodzeniem otrzymać jeden, choć jest to mniej prawdopodobne, uff. Co to znaczy „odczytać”, „otrzymać”, znaczy to, że przed odczytem qubit jest w opisanym wyżej kwantowym stanie superpozycji a w procesie odczytu stan ten ulega „zniszczeniu” i qubit, jak jego klasyczny kolega, zwraca nam wartość 0 lub 1. Taki proces pomiaru bezpowrotnie niszczy jego kwantowy, „ulotny” stan sprzed odczytu.

Do czego qbit może być przydatny? Tu zaskoczenie, w zasadzie do niczego, no może poza tym, że można z niego zbudować rejestr qbitów a to już nie tyle, że ma sens a jest wręcz podstawą wszystkiego co w komputerze kwantowym się dzieje. Jednak mając 16 qbitów „obok siebie”, taki powiedzmy rejestr kwantowy, w dalszym ciągu nie ma w tym nic odkrywczego. Zasady gry zmieniają się dopiero jak „splątamy” ze sobą wszystkie te qubity w rejestrze. Co to znaczy splątamy? Rozważmy taki schemat:

blog it

Mamy dwa qbity (qb1, qb2), każdy z nich w jakimś stanie superpozycji jedynki i zera, uruchamiamy na tych qubitach pewną bramkę kwantową, która zmienia je ale w taki sposób, że stan każdego z nich po „transformacji” przez bramkę zależy od poprzedniego stanu ich obu. Czyli stan po qb1 zależy od stanu przed qb1 i qb2 i stan po qb2 zależy od stanu przed qb1 i qb2. Co ważne ta bramka kwantowa nie odczytuje stanu qubitów, żeby na nich wykonać operację i po wykonaniu operacji nie zapisuje jej wyniku do qbitów (jak się dzieje w zwykłych komputerach). Ta bramka działa na superpozycji stanów, przetwarzając tą superpozycję, czyli przetwarza prawdopodobieństwa a nie konkretny stan. W wyniku jej działania zmienia się superpozycja (a nie stan), w taki sposób, że po tej operacji dalej każdy z qubitów gdyby wykonać na nim pomiar zwróci wynik zgodny z prawdopodobieństwem swojej nowej superpozycji, ale wtedy (ważne) pomiar na drugim qubicie będzie „musiał” zwrócić wynik zgodny z operacją logiczną narzuconą przez bramkę kwantową użytą wcześniej do splatania. To jest wyłącznie konsekwencją tego, że ich stany zostały związane/splątane ze sobą poprzez wykonanie wcześniej operacji bramką kwantową. Cały ten proces może zaskakiwać, trudno sobie takie coś wyobrazić i zaakceptować, że tak może być, ale tak jest i można to doświadczalnie zweryfikować, co robi się od lat w laboratoriach fizyków doświadczalnych. Kolejną i w zasadzie najważniejszą konsekwencją splatania jest to, że o ile jeden qubit może przechowywać dwa stany/liczby (1 i 0) jednocześnie, to rejestr dwóch splątanych qubitów może przechować cztery (wszystkie) stany/liczby jednocześnie (00, 01, 10, 11). Analogicznie rejestr 16 qubitów splątanych potrafi przechować 65 536 stanów/liczb jednocześnie … uff. To znaczy, że można zapisać w takim rejestrze każdą z szesnastobitowych liczb, w dodatku mówić jak bardzo ma być ona obecna/zapisana, np. że 0000000000000001 jest obecna z amplitudą 0.0001 a  0000000000000010 z amplitudą 0.002, reszta liczb aż do 1111111111111110 ma amplitudę 0.000001 a liczba  1111111111111111 ma amplitudę 0.0005. Oczywiście te przykładowe wartości nie mają tu znaczenia jakiegoś konkretnego, ważne jest to, że taki rejestr może przechować je wszystkie naraz.

blog it

Załóżmy, że mamy taki splątany rejestr, co dalej? Tu dochodzimy do sedna, na takim rejestrze mogę wykonać jakąś operację, a ona wykona się jednocześnie na wszystkich stanach! Dla 16 qubitowego rejestru będzie to wykonanie 65 536 operacji a dla 50 qubitowego 1 125 899 906 842 624 operacji naraz w jednej jednostce czasu! No i to jest właśnie klu tematu. Właśnie dlatego warto się tak męczyć. Podsumowując:

Mamy szanse zbudować komputer,
który w jednej jednostce czasu wykona dowolną ilość operacji

Jest to bardzo ekscytująca możliwość. Ale co dalej? Jak „pisać” programy na taki komputer? Tu robi się grząsko. Postaram się to pokazać na przykładzie jednego z algorytmów opracowanego specjalnie dla komputera kwantowego. Jest to algorytm Grovera, który pozwala na bardzo szybkie znalezienie jednego określonego elementu w zbiorze/bazie danych. Przyjmijmy, że mamy zbiór zawierający N liczb (10, 1000, czy 100 milionów, dowolnie dużo) i chcemy znaleźć w nim pewną jedną konkretną liczbę (ustalić czy jest i na jakiej pozycji). Klasycznie będziemy robić to tak, że w pętli przeszukamy wszystkie elementy, aż w końcu znajdziemy szukany. Średnio zużyjemy do tego N/2 operacji (przebiegów pętli i porównań). W algorytmie Grovera na komputerze kwantowym potrzeba do tego kilka, kilkanaście, kilkadziesiąt operacji zależnie od rozmiaru zboru danych, co robi wrażenie (że tak mało) dopiero dla dużych zbiorów. Dość powiedzieć, że przeszukanie zbioru o rozmiarze równym ilości atomów w wszechświecie zajęło by tylko kilkaset operacji, uff, no to jest coś. Jak działa ten algorytm?

Aby go opisać powtórzmy sobie raz jeszcze podstawy:

Qbit – w odróżnieniu od klasycznych bitów może być 1 lub/i 0 jednocześnie. Co to znaczy jednocześnie? To nie znaczy, że np. qubit ma dwie kieszonki i w jednej jest 1 a w drugiej jest 0, to także nie znaczy, że jest jakąś liczbą pomiędzy 0 i 1, w zasadzie wszystkie intuicyjne nasze wyobrażenia o stanie qbitu są błędne. Pojęcie bycia w wielostanie, superpozycji, jest jednym z najtrudniejszych do zrozumienia w fizyce kwantowej. Kluczowa jest jednoczesność bycia w różnych stanach, oznaczająca realną, fizyczną, realizację wszystkich z nich. Te stany dzieją się obok siebie, jednocześnie, a co ważne, ich dalsze konsekwencje dzieją się także jednocześnie oba naraz. To tak jakby świat realizował dwie ścieżki rzeczywistości jednocześnie obok siebie (dwa wątki), no dobra, tu trzeba zdobyć się na odwagę, w zasadzie nie „tak jakby” ale tak po prostu się dzieje (sic!).

Rejestr Qbitów – o ile jeden qbit pozwala przechować jednocześnie dwa stany 1 i 0, rejestr splatanych qubitów pozwala na zapisanie wszystkich z 2^N stanów jednocześnie w tej samej chwili. Co to znaczy „zapisanie”? To znaczy, że jest możliwe zapisanie do tego rejestru każdej N bitowej liczby osobno, tak, że zapisane wcześniej liczby nie zostają utracone, a także można w pewnych warunkach odczytać z rejestru niektóre z liczb, w sensie sprawdzić czy tam są zapisane i jak „mocno” zapisane. Co to znaczy „mocno” ? Ta „mocność” zapisania, to w zasadzie dwie wartości amplituda i faza, które można przekształcić do jednej liczby. Po odczycie stan rejestru znika, zostaje bezpowrotnie utracony.

Algorytm Grovera

1. Tworzymy rejestr qubitów o odpowiedniej długości N, w którym na starcie każdy qbit ma wyłącznie zapisane 0.

2. Wykonujemy na tym rejestrze operację za pomocą bramki Hadamarda (pewien typ bramki kwantowej), bramka ta wprowadza każdy z qbitów w stan równowagi pomiędzy 1 i 0 (qubity są zerem i jedynką „po równo”) a cały rejestr przechodzi w stan superpozycji tak, że wszystkie liczby/kombinacje 2^N mają tą samą amplitudę i fazę (są tak samo mocno zapisane). Nasz rejestr dla wszystkich kombinacji qubitów zawiera dokładnie te same amplitudy i fazy, co rozumiemy tak, że na tą chwilę nie wiemy gdzie znajduje się szukana wartość (pod jakim indeksem), na tym etapie wiemy tylko, że może być wszędzie.

3. Tworzymy wyrocznię. Wyrocznia to taka funkcja/bramka która zwróci 1 tylko wtedy jak wartość spod indeksu (numeru pozycji w zbiorze/tablicy) jest wartością której szukamy. Zazwyczaj wyrocznia działa w dwóch krokach. W pierwszym musi odczytać wartość (z jakiejś struktury o cechach pamięci) dla zadanego indeksu, w drugim sprawdzić czy ta wartość to jest ta właśnie szukana.
Pierwszy krok można zrealizować klasycznie ale spowolni to proces, albo budując różne formy kwantowej pamięci odwzorowującej zawartość zbioru. Dość powiedzieć, że autor algorytmu zakłada, że zostawia ten problem, tym co będą go implementować (naprawdę … no … tak :))
Drugi krok realizujemy kwantowo, zazwyczaj w postaci układu kwantowych bramek logicznych. Dla uproszczenia, gdybyśmy szukali liczby 1011 to układ bramek mógłby wyglądać tak że pierwszy, drugi i czwarty bit zostawiamy bez zmian a trzeci przepuszczamy przez brankę NOT, co daje nam 1111, po czym bramkę AND i jedynkę na wyjściu tylko wtedy jak liczba będzie równa właśnie 1011.

blog it

4. Stosujemy Wyrocznię na rejestrze. Jest to operacja która odbywa się w jednym kroku (sic!). W jej efekcie amplituda prawdopodobieństwa indeksu tej jednej poszukiwanej wartości się nie zmienia ale faza obraca się na odwrotną. Pamiętamy, że wszystkie wartości miały równe amplitudy, bardzo małe, im więcej qubitów w rejestrze tym mniejsze, tak małe, że trudne do zmierzenia, praktycznie nie da się tego zrobić a w dodatku ta jedna jedyna szukana wartość ma teraz tylko i wyłącznie obróconą fazę.

5. Stosujemy na rejestrze bramkę „dyfuzji”. Bramka ta w jednym kroku, na wszystkich wartościach wykonuje operację odbicia ich amplitud względem ich łącznej wartości średniej (która jest kwantowo wyznaczona także w tym jednym kroku). Ponieważ szukany element miał ujemną amplitudę (w sensie odwróconej fazy) i był daleko poniżej średniej, po odbiciu jego amplituda staje się bardzo duża i dodatnia (faza wraca na pierwotną). Amplitudy wszystkich pozostałych elementów odrobinę maleją. W efekcie mamy trochę lepiej „widoczną” naszą szukaną wartość, ale wciąż jest to za mało aby ją odczytać.

6. Powtarzamy operacje 4 i 5 wielokrotnie. Ile razy? Niezbyt dużo, powiedzmy kilkanaście, kilkadziesiąt. Musimy zrobić to tyle razy aby amplituda szukanej wartości wzrosła na tyle aby nasz sprzęt pomiarowy umiał ją odczytać, ale nie za dużo, bo możemy stan rejestru popsuć.

7. Na samym końcu dokonujemy odczytu. Dzięki wcześniejszym wzmocnieniom, z prawdopodobieństwem bliskim 100% (nigdy równym 100% i zawsze zależnym od liczby iteracji), system „zapadnie” się do stanu reprezentującego indeks szukanego elementu a my go poznamy, odczytamy. I tak można wśród np. 1 125 899 906 842 624 liczb, odszukać tą jedną w kilkunastu lub kilkudziesięciu krokach. Uff.

Podsumowując komputer kwantowy działa wg schematu

blog it

Liczba 20 jest przykładową liczbą kroków, ważne że nie jest to N kroków jak w klasycznym komputerze. Teraz tak, czy ja rozumiem co napisałem? Raczej tak, ale bez specjalnego przekonania, że jestem wszystkiego pewien. Czy ktoś oprócz mnie to w całości przeczyta … ? Nie sądzę. Zakładam, że gdzieś przed połową większość da sobie spokój, popieram, to całkiem rozsądne podejście. Także z tego powodu, będę już kończył. Wyjaśnię tylko jeszcze cytat z samego początku, który wydaje się, że tu nie pasuje i dlatego przedstawię własną interpretację:

„Prawda o świecie jest tym czymś, czego szukam w „ciemnym daleku”, staram sobie je rozjaśnić, przybliżyć, redukując systematycznie obszary mojej niewiedzy. Patrzę w nowe mgliste rejony, z początku wydają się puste a z czasem z wyraźną trudnością dostrzegam w nich migotliwe okruchy prawdy”

Nie zaprzeczę, ta interpretacja jest lekko naciągana. Stanisław Staszewski jak to pisał, prawie na pewno miał na myśli ukochaną i boleśnie nieobecną osobę, prawie na 100% pisał o miłości a nie o prawdzie. Ale czy te dwa ideały, prawda i miłość, nie są ze sobą w naszym świecie powiązane na tyle, że mogłem tak zrobić, tak skojarzyć? Czy one w naszym kwantowym nieskończonym rejestrze zwanym rzeczywistością … nie są czasem odrobinę splątane?

Krzysztof Olszewski

Krzysztof Olszewski

Dyrektor Technologii i Architektury Oprogramowania

Krzysztof Olszewski

Krzysztof Olszewski

Dyrektor Technologii i Architektury Oprogramowania