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).
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:
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:
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:
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:
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])
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 🙂
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])
Dane dotyczące wykonywanych przez nas operacji możemy również zobaczyć na stronie IBM.
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 😉
Dodatkowe informacje i źródła
- Jak działa komputer kwantowy?
- Oficjalny wideotutorial Qiskit
- https://www.sztucznainteligencja.org.pl/znikajacy-komputer-kwantowy-googlea/
- https://youtu.be/aPCZcv-5qfA
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 🙂