python

Programuj komputery kwantowe w Pythonie

Komputery kwantowe Python

Python stale znajduje się w ogniu krytyki dotyczącej jego niewielkiej szybkości. A gdyby tak w Pythonie programować komputery kwantowe?

Nie, to nie jest żart. Za pomocą Pythona możemy programować kwantowo i wykonywać nasz kod na prawdziwym komputerze kwantowym.

UWAGA! Poniżej przedstawię wstęp teoretyczny do mechaniki kwantowej. Proszę nie zrażaj się nim i potraktuj to w ramach ciekawostki 🙂 Co więcej, poniższy wstęp teoretyczny jest bardzo dużym uproszczeniem, nie mam kompetencji aby tłumaczyć zasady mechaniki kwantowej 😉

Jak działają komputery kwantowe?

Właściwie to sam chciałbym znać odpowiedź na powyższe pytanie 😉 Wykorzystuje on bowiem zasady mechaniki kwantowej, która w porównaniu z fizyką klasyczną wydaje się nielogiczna i „nienaturalna”.

Klasyczny komputer, na którym czytasz ten wpis, operuje na bitach. Każdy bit może być w jednym ze stanów:

  • stan wysoki – 1
  • stan niski – 0

Wszystkie operacje wykonywane w komputerze „pod spodem” operują właśnie na zerach i jedynkach.

Tym co odróżnia komputer kwantowy od zwykłego jest to, że operuje na bitach kwantowych czyli kubitach(qubit – quantum bit).

Kubit, w przeciwieństwie do bitu, może być zarówno zerem jak i jedynką.

Ale jak to?! Jest to superpozycja.

Superpozycja

Według zasad mechaniki kwantowej obiekt kwantowy może znajdować się w stanie superpozycji (stanie mieszanym), czyli równocześnie w każdym możliwym stanie.

Żywy i martwy kot Schrödingera

Do zobrazowania tej teorii posłuży mi najpopularniejszy eksperyment myślowy dotyczący mechaniki kwantowej nazwany kotem Schrödingera.

Eksperyment polega na zamknięciu kota w pojemniku razem z atomem promieniotwórczego, nietrwałego pierwiastka, licznikiem Geigera-Mullera (wykrywającym promieniowanie) i mechanizmem uwalniającym truciznę gdy promieniowanie wzrośnie. Następnie odczekujemy aż upłynie czas połowicznego rozpadu pierwiastka.

Jeżeli atom uległ rozpadowi, promieniowanie wzrosło, trucizna została wydzielona, a kot jest martwy. Jeżeli nie, kot nadal żyje.

W takim razie zgodnie z zasadami mechaniki kwantowej kot jest jednocześnie żywy i martwy dopóki nie otworzymy pojemnika (nie dokonamy obserwacji).

paradoks schrodingera

PS. powyższy eksperyment jest tylko myślowy, żaden kotek przy nim nie ucierpiał 🙂

Przewaga komputera kwantowego

Ale wróćmy już do komputerów. To że kubity mogą być w każdym możliwym stanie daje nam ogromne możliwości obliczeniowe.

W przypadku 2 kubitów wszystkich możliwych równoczesnych kombinacji jest 2^2 czyli 4. Przy trzech kubitach kombinacji jest 8, przy czterech – 16.

Liczba ta rośnie w sposób wykładniczy, a nie liniowy, jak dzieje się to w przypadku zwykłych komputerów.

Programuj kwantowo w Pythonie

Koszt komputera kwantowego szacuje się w dziesiątkach milionów dolarów. Co więcej, do sprawnego działania muszą być utrzymywane w temperaturze możliwie najbliższej zera bezwzględnego (-273 stopni Celsjusza).

Mimo wszystko, jeden z właścicieli takiego komputera – firma IBM postanowiła udostępnić go do testów. Każdemu. Za darmo.

Służy do tego narzędzie Qiskit. Za jego pomocą siedząc we własnym pokoju, przy własnym komputerze możemy wykonywać nasz kod na prawdziwym komputerze kwantowym, którego fizyczne podstawy nie były znane ludzkości jeszcze 100 lat temu.

W zaskakujących czasach przyszło nam żyć 🙂

Programowanie niskopoziomowe

Jak już wcześniej pisałem – komputery kwantowe operują na bitach kwantowych. Niestety, w tym momencie nasz kod również musi operować bezpośrednio na bitach.

I tutaj stykamy się z pewną ironią, bowiem w Pythonie, który jest bardzo wysokopoziomowym językiem, operujemy na zerach i jedynkach 🙂 Chyba trudniej o bardziej nienaturalną rzecz dla Pythonowca 😉

Mimo wszystko, Qiskit wykorzystuje składnie Pythona. Do wykonywania tego kodu szczególnie zalecam Ci użycie JupyterLaba (JupyterNotebooka).

Zacznijmy od zaimportowania pakietu.

import qiskit as q

Następnie musimy utworzyć obwód:

circuit = q.QuantumCircuit(2, 2)

Powyższa klasa w konstruktorze przyjmuje dwa parametry: liczbę kubitów oraz liczbę bitów klasycznych. Możemy teraz zobaczyć utworzony obwód za pomocą metody draw:

pusty obwód kwantowy
Pusty obwód

Wykonajmy teraz podstawowe operacje na bitach. Możemy tego dokonać za pomocą bramek.

Użyjemy tutaj bramki NOT, która zmienia wartość bitu z 0 na 1 i odwrotnie.

Wykorzystam również bramkę cx. Pełni ona funkcję instrukcji warunkowej.

circuit.x(0)  # NOT
# 0,0 --> 1,0
circuit.cx(0, 1)  # neguje 2 kubit gdy pierwszy jest równy 1  
# 1,0 --> 1,1 (wynik)

Dodajmy teraz pomiar wartości:

circuit.measure([0, 1], [0, 1])

i narysujmy obwód:

Podstawy obwodów kwantowych

Do narysowania obwodu możesz użyć również bardziej graficznej wersji stworzonej w matplotlib (używając parametru output jak powyżej)

Uruchamianie kodu kwantowego

Teraz możemy przejść do procesu uruchomienia napisanego kodu.

Na początku musimy utworzyć konto IBM Q. Po zalogowaniu możesz kliknąć w ikonkę profilu i wybrać zakładkę „My account”. Nastepnie możecie pobrać swój token:

qiskit-token

Skopiowany token wrzuć do pythonowej zmiennej. Ja wczytam go z pliku. W moim artykule możesz poczytać o tym jak czytać pliki w Pythonie.

with open('token', 'r') as f:
    token = f.read()

Teraz możesz zapisać token i wczytać zapisane konto.

q.IBMQ.save_account(token)
q.IBMQ.load_account()
# <AccountProvider for IBMQ(hub='ibm-q', group='open', project='main')

Przy następnych uruchomieniach wystarczy wczytać konto.
Zaimportujmy przydatne funkcje

from qiskit.tools.monitor import job_monitor
from qiskit.visualization import plot_histogram

Następnie musimy wczytać providera usługi:

provider = IBMQ.get_provider("ibm-q")

W tym momencie powinniśmy wybrać backend. Wybór backendu określa system kwantowy. Na stronie quantum computing IBM możemy zobaczyć listę backendów:

dostępne backendy dla komputerów kwantowych

Pierwszy widoczny na zdjęciu backend to symulator. Używając go nasz kod nie zostanie wykonany na komputerze kwantowym, lecz jego działanie zostanie zasymulowane.

Wybierając backend zwróć uwage na liczbę zakolejkowaych zadań – im jest ich mniej, tym szybciej wykona się Twój kod.

Zaczijmy od uruchomienia kodu na symulatorze.

backend = provider.get_backend("ibmq_qasm_simulator")
job = q.execute(circuit, backend=backend, shots=1024)
job_monitor(job)

Uruchamiając zadanie skorzystałem z metody execute podając nasz obwód, backend oraz wskazałem, że kod ma być wykonany 1024 razy.

Po wyświetleniu komunikatu „Job Status: job has successfully run” możemy zwizualizować wynik:

result = job.result()
counts = result.get_counts(circuit)
plot_histogram([counts])
wynik

Jak widać 100% prób zakończyło się rezultatem składającym się z dwóch jedynek, co jest wynikiem prawidłowym.

Nasz kod zadziałał na symulatorze, odpalmy go więc na prawdziwym komputerze kwantowym 🙂

uruchamianie kodu kwantowego

Jak widać, wykonany przeze mnie kod jest dopiero 19 w kolejce (a wybrałem najmniej obciążony system), więc trzeba będzie trochę poczekać. Komputery kwantowe IBM już teraz cieszą się niezła popularnością 🙂

Po skończonej pracy możemy zwizualizować wynik:

result = job.result()
counts = result.get_counts(circuit)
plot_histogram([counts])
wynik działania kodu na komputerze kwantowym
Wynik działania na komputerze kwantowym

Dane dotyczące wykonywanych przez nas operacji możemy również zobaczyć na stronie IBM.

Dane ze strony IBM
dane dotyczące wykonania
obwód kwantowy ze strony IBM
używany obwód
wykres z wynikiem ze strony IBM
wykres z wynikiem

Wiemy, że wynikiem powinno być „11”, jednak nie wszystkie wykonania kodu przyniosły taki rezulat. Dlaczego?

Szum kwantowy

Odpowiedzialnym za to zjawiskiem jest występowanie szumu kwantowego, czyli przypadkowych wyników wynikających z zewnętrznego oddziaływania.

Niestety komputery kwantowe są bardzo podatne na zewnętrzne oddziaływanie, co jest ich ogromną wadą.

Przyszłość i komputery kwantowe

Trudno w tym momencie przewidzieć przyszłość omawianych maszyn. Aktualnie z powodu ich podatności na oddziaływanie zewnętrzne i bardzo trudne do utrzymania warunki (zero bezwzględne) bardzo trudno uznać wyższość komputerów kwantowych.

Cały czas jednak trwają pracę i badania, których wyniki mogą pośłużyć do wysnucia wniosków na ich temat.

Stabilna wersji biblioteki Qiskit została wydana w czerwcu tego roku (2019), zobaczymy jakie efekty przyniesie wystawienie komputerów IBMu na pomysłowość i chęć do przeprowadzania testów społeczności.

PS. Teraz możesz pochwalić się, że programowałeś już komputery kwantowe 😉

Jeśli chcesz być na bieżąco z najnowszymi materiałami, polub nasz fanpage na Facebooku:

https://www.facebook.com/kamil.kwapisz.python

Dodatkowe informacje i źródła

PS. Jeśli jeszcze tego nie zrobiłeś to wchodząc na stronę główną, klikając w okładkę ebooka i zapisując się na newsletter możesz pobrać darmowego ebooka 🙂

20 przydatnych bibliotek w Pythonie

10 thoughts on “Programuj komputery kwantowe w Pythonie

  1. Temat bardzo ciekawy ale dość teoretyczny i bardziej w formie symulacji.
    Co prawda świetnie się sprawdza jako chwyt marketingowy. Google już zapowiada kilkuset qubitowy komputer co też na ten moment można uznać za spekulacje przy dostępnych możliwościach technicznych.
    Komputer kwantowy tego typu pozwala na stabilną pracę przez milionowe części sekundy. 🙂

    Poczekamy dobre dziesiątki lat aby zacząć faktycznie programować na komputerach kwantowych.

    1. Dzięki za komentarz Mateusz! 😉 Zgadzam się z Tobą w pełni 🙂 Chociaż moim zdaniem taka akcja marketingowa dotykająca technologii kwantowych ma szanse przyczynić się do przyspieszenia tego rozwoju, w końcu dzięki temu coraz więcej osób może poznać chociaż te podstawy komputerów kwantowych i może zapalić się do zgłębienia tematu 🙂

      Pozdrawiam Cię! 😉

      1. Oczywiście, że tak. 😉 komputery kwantowe wykorzystane w dobry sposób podniosą miejmy nadzieje nasz poziom życia na jeszcze wyższy level!

        Tak czy inaczej podoba mi się sposób w jaki to omówiłeś. 🙂

        Pozdrawiam, Mateusz.

  2. Od razu zaznaczam, że nie doczytałem do końca. Jednak od początku irytuje mnie stosownie słowa „qubit”, całość artykułu zdaje się być napisana w języku polskim, jednak jedno słowo jest ciągle powtarzane po angielsku i to w dodatku te kluczowe. Jest normalna, polska wersja tego słowa, czyli kubit. Przepraszam, nie chcę być niemiły zwracając na to uwagę, mnie to po prostu irytytowało, jeśli uważasz, że to tylko jednostkowy przypadek, to może nie trzeba tego zmieniać, no ale mi się, oczywiście, wydaje, że pewnie jakąś część czytelników, będzie mnie w tym popierała. Wydaje mi się, że z regułu artykuły powinno pisać się w jednym języku.

    1. Dzięki za komentarz 😉

      Robiąc research pod ten wpis korzystałem jedynie z anglojęzycznych źródeł i jakoś tak ten „qubit” został w głowie 😉
      Co do jednego języka – zgadzam się z Tobą, staram się to robić, jednak czasami w przypadku tematyki programistycznej to po prostu niezbyt pasuje, według mnie słabo byłoby tłumaczyć np „commity” 😉

      Pozdrawiam! 😉

        1. Udostępnione w ten sposób zasoby komputerów kwantowych, wraz z symulatorem są chyba najlepszym aktualnie dostępnym sposobem na research w tym temacie 🙂

  3. Na pierwszy rzut oka trudne :)) a czy w ogólnej wiedzy pythona jest to poziom basic?? Bo mam zamiar isc na studia a wiem ze python to podstawa tam.

    1. Samo programowanie kwantowe w Pythonie niewiele przypomina zwykłego programowania w Pythonie 🙂 To, że qiskit jest biblioteką pythonową to najprawdopodobniej sprawa świetnych bibliotek do wizualizacji danych jakie ma Python 🙂

      A tak z ciekawości, na jakich studiach Python to podstawa? 🙂

Comments are closed.