Programowanie kwantowe - Quantum programming

Programowanie kwantowe to proces składania sekwencji instrukcji, zwanych programami kwantowymi, które mogą działać na komputerze kwantowym . Języki programowania kwantowego pomagają wyrażać algorytmy kwantowe za pomocą konstrukcji wysokiego poziomu.

Zestawy instrukcji kwantowych

Zestawy instrukcji kwantowych służą do przekształcania algorytmów wyższego poziomu w instrukcje fizyczne, które można wykonać na procesorach kwantowych. Czasami instrukcje te są specyficzne dla danej platformy sprzętowej, np. pułapki jonowe lub kubity nadprzewodzące .

cQASM

cQASM, znany również jako wspólny QASM, jest sprzętowo niezależnym QASM, który gwarantuje interoperacyjność między wszystkimi narzędziami do kompilacji i symulacji kwantowych. Został wprowadzony przez QCA Lab w TUDelft .

Quil

Quil to architektura zestawu instrukcji do obliczeń kwantowych, która jako pierwsza wprowadziła współdzielony kwantowy/klasyczny model pamięci. Został wprowadzony przez Roberta Smitha, Michaela Curtisa i Williama Zenga w Praktycznej architekturze zestawu instrukcji kwantowych . Wiele algorytm kwantowy (w tym teleportacji kwantowej , kwantowej korekcji błędów , symulacji i optymalizacji algorytmów) wymagają wspólną architekturę pamięci.

OpenQASM

OpenQASM to pośrednia reprezentacja wprowadzona przez IBM do użytku z Qiskit i IBM Q Experience .

Kos

Blackbird to zestaw instrukcji kwantowych i pośrednia reprezentacja używana przez Xanadu Quantum Technologies i Strawberry Fields. Został zaprojektowany do reprezentowania programów kwantowych o zmiennej ciągłej , które mogą działać na fotonicznym sprzęcie kwantowym.

Zestawy do tworzenia oprogramowania kwantowego

Zestawy deweloperskie oprogramowania kwantowego zapewniają kolekcje narzędzi do tworzenia programów kwantowych i manipulowania nimi. Zapewniają również środki do symulacji programów kwantowych lub przygotowania ich do uruchomienia za pomocą urządzeń kwantowych opartych na chmurze .

SDK z dostępem do procesorów kwantowych

Do uruchamiania obwodów kwantowych na prototypowych urządzeniach kwantowych, a także na symulatorach można wykorzystać następujące zestawy programistyczne .

Ocean

Pakiet narzędzi Open Source opracowany przez D-Wave. Napisany głównie w języku programowania Python, umożliwia użytkownikom formułowanie problemów w formatach Ising Model i Quadratic Unconstrained Binary Optimization (QUBO). Wyniki można uzyskać przesyłając je do komputera kwantowego online w Leap, Quantum Application Environment D-Wave w czasie rzeczywistym, na maszynach należących do klientów lub klasycznych próbnikach.

Przykładowy kod używający projectq z Pythonem

ProjektQ

Projekt Open Source opracowany w Instytucie Fizyki Teoretycznej przy ETH , który wykorzystuje język programowania Python do tworzenia i manipulowania obwodami kwantowymi. Wyniki uzyskuje się za pomocą symulatora lub wysyłając zadania do urządzeń kwantowych IBM.

Qiskit

Projekt Open Source opracowany przez IBM . Obwody kwantowe są tworzone i manipulowane za pomocą Pythona . Wyniki uzyskuje się za pomocą symulatorów działających na własnym urządzeniu użytkownika, symulatorów dostarczonych przez IBM lub prototypowych urządzeń kwantowych dostarczonych przez IBM. Oprócz możliwości tworzenia programów z wykorzystaniem podstawowych operacji kwantowych, w ramach wyspecjalizowanych pakietów dostępne są narzędzia wyższego poziomu do algorytmów i benchmarkingu. Qiskit jest oparty na standardzie OpenQASM do reprezentowania obwodów kwantowych. Obsługuje również kontrolę poziomu impulsów systemów kwantowych za pomocą standardu QiskitPulse.

Las

Projekt Open Source opracowany przez Rigetti , który wykorzystuje język programowania Python do tworzenia i manipulowania obwodami kwantowymi. Wyniki uzyskuje się za pomocą symulatorów lub prototypowych urządzeń kwantowych dostarczonych przez Rigetti. Oprócz możliwości tworzenia programów przy użyciu podstawowych operacji kwantowych, w pakiecie Grove dostępne są algorytmy wyższego poziomu. Forest jest oparty na zestawie instrukcji Quil .

t|ket>

Środowisko programowania kwantowego i kompilator optymalizujący opracowane przez Cambridge Quantum Computing , przeznaczone dla symulatorów i kilku zapleczy sprzętu kwantowego, wydane w grudniu 2018 r.

pola truskawek

Open-source Python library opracowana przez Xanadu Quantum Technologies do projektowania, symulacji i optymalizacji zmienną ciągłą (CV) optyczne kwantowych układów. Dostępne są trzy symulatory - jeden oparty na bazie Fock , jeden wykorzystujący sformułowanie Gaussa optyki kwantowej i jeden wykorzystujący bibliotekę uczenia maszynowego TensorFlow . Strawberry Fields to także biblioteka do wykonywania programów na kwantowym sprzęcie fotonicznym Xanadu.

PennyLane

Open-source Python library opracowana przez Xanadu Quantum Technologies dla różniczkowalnej programowania komputerów kwantowych. PennyLane zapewnia użytkownikom możliwość tworzenia modeli za pomocą TensorFlow , NumPy lub PyTorch i łączenia ich z backendami komputerów kwantowych dostępnych w IBMQ , Google Quantum , Rigetti , Honeywell i Alpine Quantum Technologies.

SDK oparte na symulatorach

Publiczny dostęp do urządzeń kwantowych jest obecnie planowany w następujących pakietach SDK, ale nie został jeszcze wdrożony.

Zestaw do rozwoju kwantowego

Projekt opracowany przez Microsoft w ramach .NET Framework . Programy Quantum można pisać i uruchamiać w Visual Studio i VSCode .

Cirq

Projekt Open Source opracowany przez Google , który wykorzystuje język programowania Python do tworzenia i manipulowania obwodami kwantowymi. Wyniki uzyskuje się za pomocą symulatorów działających na własnym urządzeniu użytkownika.

Kwantowe języki programowania

Istnieją dwie główne grupy języków programowania kwantowego: imperatywne języki programowania kwantowego i funkcjonalne języki programowania kwantowego.

Języki imperatywne

Najwybitniejszymi przedstawicielami języków imperatywnych są QCL, LanQ i Q|SI>.

QCL

Język obliczeń kwantowych (QCL) jest jednym z pierwszych wdrożonych języków programowania kwantowego . Najważniejszą cechą QCL jest obsługa operatorów i funkcji zdefiniowanych przez użytkownika. Jego składnia przypomina składnię języka programowania C, a klasyczne typy danych są podobne do prymitywnych typów danych w C. W jednym programie można połączyć kod klasyczny i kod kwantowy.

Pseudokod kwantowy

Pseudokod kwantowy zaproponowany przez E. Knill jest pierwszym sformalizowanym językiem opisu algorytmów kwantowych . Został on wprowadzony, a ponadto był ściśle powiązany z modelem maszyny kwantowej o nazwie Quantum Random Access Machine (QRAM).

Q#

Język opracowany przez firmę Microsoft do użytku z zestawem Quantum Development Kit .

Q|SI>

Q|SI> to platforma osadzona w języku .Net wspierająca programowanie kwantowe w kwantowym rozszerzeniu while-language. Platforma ta obejmuje kompilator kwantowego języka while i łańcuch narzędzi do symulacji obliczeń kwantowych, optymalizacji obwodów kwantowych, analizy zakończenia programów kwantowych i weryfikacji programów kwantowych.

Język Q

Język Q jest drugim zaimplementowanym imperatywnym językiem programowania kwantowego. Język Q został zaimplementowany jako rozszerzenie języka programowania C++. Udostępnia klasy dla podstawowych operacji kwantowych, takich jak QHadamard, QFourier, QNot i QSwap, które wywodzą się z klasy bazowej Qop. Nowe operatory można definiować za pomocą mechanizmu klas C++.

Pamięć kwantowa jest reprezentowana przez klasę Qreg.

Qreg x1; // 1-qubit quantum register with initial value 0
Qreg x2(2,0); // 2-qubit quantum register with initial value 0

Proces obliczeniowy realizowany jest za pomocą dostarczonego symulatora. Zaszumione środowiska można symulować za pomocą parametrów symulatora.

qGCL

Quantum Guarded Command Language (qGCL) został zdefiniowany przez P. Zulianiego w swojej pracy doktorskiej. Opiera się na Guarded Command Language stworzonym przez Edsgera Dijkstrę .

Można go opisać jako język specyfikacji programów kwantowych.

QMASM

Quantum Macro Assembler (QMASM) to język niskiego poziomu specyficzny dla annealerów kwantowych, takich jak D-Wave.

Szafot

Scaffold jest językiem podobnym do C, który kompiluje się do QASM i OpenQASM. Jest zbudowany na infrastrukturze kompilatora LLVM, aby przeprowadzać optymalizacje kodu Scaffold przed wygenerowaniem określonego zestawu instrukcji.

Silq

Silq jest językiem programowania wysokiego poziomu do obliczeń kwantowych z silnym statycznym systemem typów, opracowanym w ETH Zürich .

Języki funkcjonalne

Trwają prace nad stworzeniem funkcjonalnych języków programowania do obliczeń kwantowych . Funkcjonalne języki programowania dobrze nadają się do wnioskowania o programach. Przykłady obejmują QPL Selingera i język podobny do Haskella QML autorstwa Altenkirch i Grattage. Kwantowe języki programowania wyższego rzędu, oparte na rachunku lambda , zaproponowali van Tonder, Selinger i Valiron oraz Arrighi i Dwek.

QFC i QPL

QFC i QPL to dwa ściśle powiązane języki programowania kwantowego zdefiniowane przez Petera Selingera. Różnią się tylko składnią: QFC używa składni schematu blokowego, podczas gdy QPL używa składni tekstowej. Języki te mają klasyczny przepływ sterowania, ale mogą operować na danych kwantowych lub klasycznych. Selinger podaje semantykę denotacyjną dla tych języków w kategorii superoperatorów .

QML

QML to podobny do Haskella język programowania kwantowego autorstwa Altenkirch i Grattage. W przeciwieństwie do QPL Selingera, język ten traktuje powielanie, a nie odrzucanie, informacji kwantowych jako prymitywną operację. Powielanie w tym kontekście rozumie się działanie, które odwzorowuje się , i nie należy mylić z niemożliwej operacji klonowania ; autorzy twierdzą, że jest to podobne do modelowania udostępniania w językach klasycznych. QML wprowadza również zarówno klasyczne, jak i kwantowe operatory sterowania, podczas gdy większość innych języków opiera się na klasycznej kontroli.

An semantyka operacyjne dla QML podano w kategoriach układów kwantowych , natomiast denotational semantyka jest przedstawiane w kategoriach superoperators , a te są pokazane zgodzić. Zarówno semantyka operacyjna, jak i denotacyjna została zaimplementowana (klasycznie) w Haskell.

LIQUIi|>

LIQUi|> (wymawiane jako ciecz ) to rozszerzenie symulacji kwantowej w języku programowania F# . Obecnie jest rozwijany przez Quantum Architectures and Computation Group (QuArC) w ramach projektu StationQ w Microsoft Research. LIQUi|> ma na celu umożliwienie teoretykom eksperymentowania z projektowaniem algorytmów kwantowych, zanim fizyczne komputery kwantowe będą dostępne do użytku.

Obejmuje język programowania, algorytmy optymalizacji i harmonogramowania oraz symulatory kwantowe. LIQUi|> może służyć do tłumaczenia algorytmu kwantowego zapisanego w postaci programu wysokopoziomowego na niskopoziomowe instrukcje maszynowe dla urządzenia kwantowego.

Obliczenia kwantowe lambda

Kwantowe rachunki lambda są rozszerzeniem klasycznego rachunku lambda wprowadzonego przez Alonzo Churcha i Stephena Cole Kleene w latach 30. XX wieku. Celem kwantowych rachunków lambda jest rozszerzenie języków programowania kwantowego o teorię funkcji wyższego rzędu .

Pierwszą próbę zdefiniowania kwantowego rachunku lambda podjął Philip Maymin w 1996 roku. Jego rachunek lambda-q jest wystarczająco potężny, aby wyrazić dowolne obliczenia kwantowe. Jednak język ten może skutecznie rozwiązywać problemy NP-zupełne i dlatego wydaje się być ściślej silniejszy niż standardowe kwantowe modele obliczeniowe (takie jak kwantowa maszyna Turinga lub model obwodu kwantowego ). Dlatego też rachunek lambda-q Maymina prawdopodobnie nie jest możliwy do zaimplementowania na urządzeniu fizycznym.

W 2003 roku André van Tonder zdefiniował rozszerzenie rachunku lambda odpowiednie do udowodnienia poprawności programów kwantowych. Dostarczył również implementację w języku programowania Scheme .

W 2004 roku Selinger i Valiron zdefiniowali silnie typizowany rachunek lambda do obliczeń kwantowych z systemem typów opartym na logice liniowej .

Quipper

Quipper został opublikowany w 2013 roku. Jest zaimplementowany jako język osadzony, wykorzystując Haskell jako język hosta. Z tego powodu programy kwantowe napisane w Quipper są pisane w Haskell przy użyciu dostarczonych bibliotek. Na przykład poniższy kod implementuje przygotowanie superpozycji

import Quipper

spos :: Bool -> Circ Qubit
spos b = do q <- qinit b
            r <- hadamard q
            return r

zabawaQ

Grupa studentów studiów licencjackich z Chalmers University of Technology opracowała funkcjonalny język programowania kwantowego w 2021 roku. Jest on inspirowany kwantowym typowaniem rachunku lambda autorstwa Selingera i Valirona. Bazowy symulator kwantowy jest częścią biblioteki Haskell o tej samej nazwie. Poniższy kod implementuje superpozycję w funQ

spos : !(Bit -o QBit)
spos b = H (new b)

Ten sam przykład w bibliotece Haskella byłby:

import FunQ

spos :: Bit -> QM QBit
spos b = hadamard =<< new b

Bibliografia

Dalsza lektura

Zewnętrzne linki