Перейти до вмісту

Квантове програмування

Матеріал з Вікіпедії — вільної енциклопедії.

Квантове програмування є набором комп'ютерних мов програмування, які дозволяють запис квантового алгоритму з використанням конструкцій високого рівня[1]. Завдання квантових мов не полягає у тому, щоб надати інструмент для програмістів, а в тому, щоб надати інструменти для дослідників, щоб зрозуміти краще, як працюють квантові обчислення і як формально доводити коректність квантових алгоритмів.

Можна виділити дві основні групи квантових мов програмування: імперативні квантові мови програмування і функціональні квантові мови програмування. Найбільш відомими представниками першої групи є QCL[2] і LanQ.[3] Ведеться робота з розробки функціональних мов програмування для квантових обчислень. Приклади включають QPL Селінджера,[4] і Haskell-подібну мову QML, розроблену Алтенкірчом і Ґретажем.[5][6] Квантові мови програмування високого рівня, засновані на лямбда-численні, були запропоновані ван Тондером,[7] Селінджером і Валіроном[8] Аріґі і Довеком[9].

Оглядова стаття Саймона Ґея[10] надає інформацію про стан досліджень і всеосяжну бібліографію ресурсів про квантове програмування станом на 2007 рік.

Імперативні квантові мови програмування

[ред. | ред. код]

Квантовий псевдокод

[ред. | ред. код]

Квантовий псевдокод, запропонований Е. Кнілом, є першою формалізованою мовою для опису квантових алгоритмів. Він був введений, і, крім того, був тісно пов'язаний з моделлю квантової машини під назвою квантова машина з довільним доступом. Квантова машина з довільним доступом є віртуальною моделлю апаратних засобів для обчислень, і може виявитися корисною для інтерпретації квантових мов програмування. Моделі таких машин дозволяють вільно чергувати унітарне перетворення і вимірювання за допомогою квантового пристрою під керуванням класичного комп'ютера. Квантовий пристрій міститиме велике, але скінченне число індивідуально адресованих квантових бітів, так само, як класичний чип пам'яті RAM містить велику кількість бітів. Обчисленнями управлятиме класичний комп'ютер посилаючи послідовність команд, що мають форму "застосувати" унітарне перетворення U до кубітів I і J або "виміряти" кубіт I. Квантовий пристрій виконує ці інструкції і надає доступ до результатів вимірювань.

Квантова мова обчислень

[ред. | ред. код]

Квантова мова обчислень (англ. Quantum Computation Language) — одна з перших реалізованих квантових мов програмування.[11] Її синтаксис нагадує синтаксис мови програмування C, а її класичні типи даних схожі на примітивні типи даних в C. Можна поєднувати класичний код і квантовий код в тій же програмі.

Базовим вбудованим квантовим типом даних в QCL є квантовий регістр куреґ (англ. qureg). Його можна інтерпретувати як масив кубітів (квантових бітів).

   qureg x1[2]; // 2-кубітний квантовий регістр x1
   qureg x2[2]; // 2-кубітний квантовий регістр x2
   H(x1); // Операція Адамара на x1
   H(x2[1]); // Операція Адамара на першому кубіті регістру x2

Оскільки інтерпретатор QCL використовує бібліотеку qlib для моделювання, за внутрішнім станом квантової машини під час виконання квантової програми можна спостерігати.

   qcl> dump
   : STATE: 4 / 32 кубіт зайнято, 28 / 32 qubits вільно
   0.35355 |0> + 0.35355 |1> + 0.35355 |2> + 0.35355 |3>
   + 0.35355 |8> + 0.35355 |9> + 0.35355 |10> + 0.35355 |11>

Операція дампу відрізняється від вимірювання, оскільки вона не впливає на стан квантової машини і може бути реалізована тільки за допомогою імітатора.

Стандартна бібліотека QCL надає стандартні квантові оператори, які використовуються в квантових алгоритмах, такі як:

  • Контрольоване "ні" з великою кількістю цільових кубітів,
  • Операція Адамара на багатьох кубітах,
  • Синтаксичний аналіз і контрольована фаза.

Найважливішою особливістю QCL є підтримка визначених користувачем операторів і функцій. Як і в сучасних мовах програмування, можна визначити нові операції, які можуть бути використані для маніпулювання квантовими даними. Наприклад:

   operator diffuse (qureg q) {
     H(q);                 // перетворення Адамара
     Not(q);               // інвертувати q
     CPhase(pi, q);        // Обертати якщо q=1111..
     !Not(q);              // скасувати інверсію
     !H(q);                // скасувати перетворення Адамара
   }

визначає оператор інверсії щодо середнього значення, що використовується в алгоритмі Ґровера. Це дозволяє визначати алгоритми на вищому рівні абстракції і розширити бібліотеку функцій, доступних для програмістів.

Синтаксис

[ред. | ред. код]
  • Типи даних
    • Квантові - qureg, quvoid, Const, quscratch, qucond
    • Класичні - int (цілий), real (дійсний), complex (комплексний), boolean (логічний), string (рядковий), vector (масив-вектор), matrix (матриця), tensor (тензор)
  • Типи функцій
    • Куфункти - псевдо-класичні оператори. Можна тільки змінити перестановку базисних станів.
    • Оператори - загальні унітарні оператори. Можна змінити амплітуду.
    • Процедури - всередині цієї функції можна викликати вимірювання, вивід інформації та дамп (скидання). Процедури не є зворотними.
  • Вбудовані функції
    • Квантові
      • Куфункти - Fanout, Swap, Perm2, Perm4, Perm8, Not, CNot
      • Оператори - матриця 2х2, матриця 4x4, матриця 8x8, Rot, Mix, H, CPhase, SqrtNot, X, Y, Z, S, T
      • Процедури - вимірювання, дамп, скидання стану
    • Класичні
      • Арифметика - sin (синус), cos (косинус), tan (тангенс), log (логарифм), sqrt (корінь квадратний), ...
      • Комплексні - Re (взяття дійсної частини), Im (взяття уявної частини), conj (операція спряження).

Мова Q

[ред. | ред. код]

Мова Q [12] — це друга реалізована імперативна квантова мова програмування.

Мова Q була реалізована як розширення мови програмування C++. Вона надає класи для основних квантових операцій, таких як QHadamard, QFourier, QNot і QSwap, які є похідними від базового класу QOP. Нові оператори можуть бути визначені за допомогою класового механізму C++.

Квантова пам'ять представлена класом Qreg.

   Qreg x1; // однокубітний квантовий регістр з початковим значенням 0
   Qreg x2(2,0); // двокубітний квантовий регістр з початковим значенням 0

Процес обчислення виконується за допомогою вбудованого імітатора. Дисперсне середовище може бути змодельоване з використанням параметрів імітатора.

Квантова Мова Обачних Команд

[ред. | ред. код]

Квантова Мова Обачних Команд (qGCL, англ. Quantum Guarded Command Language) була означена П. Зуліані в його кандидатській дисертації. Вона базується на мові обачних команд[en], створеній Едсґером Дейкстрою.

Її можна охарактеризувати як «мову опису квантових програм».

У вересні 2017 року на конференції Ignite компанія Microsoft представила квантову мову програмування власної розробки. На той час мова не мала назви. Окрім мови програмування компанія запропонувала і дві версії симулятора квантового комп'ютера: один працюватиме на локальному комп'ютері, інший — в хмарі Microsoft Azure. Мова та симулятор будуть доступні в наступних випусках Microsoft Visual Studio[13].

Функційні квантові мови програмування

[ред. | ред. код]

За останні кілька років була запропонована низка квантових мов програмування на основі парадигми функційного програмування. Функційні мови програмування добре підходять для доведення коректності програм.

QFC і QPL

[ред. | ред. код]

QFC і QPL — дві тісно пов'язані квантові мови програмування означені Пітером Селінджером. Вони відрізняються лише в їхньому синтаксисі: QFC використовує синтаксис блок-схем, в той час як QPL використовує текстовий синтаксис. Ці мови мають класичну систему керування, але можуть працювати на квантових або класичних даних. Селінджер дає денотаційну семантику для цих мов у категорії супероператорів[en].

QML[14] — це Haskell-подібна квантова мова програмування, створена Алтенкірчом і Ґретажом.[5] На відміну від мови Селінджера QPL ця мова виконує дублювання, а не викидання, квантової інформації як примітивну операцію. Під дублюванням у даному контексті розуміється операція, яка перетворює у , і її не слід плутати з неможливою операцією клонування; автори стверджують, що це схоже на те, як спільне використання моделюється в класичних мовах. QML також вводить як класичні, так і квантові оператори керування, тоді як більшість інших мов покладаються на класичне керування.

Операційна семантика для QML дається в термінах квантових схем, тоді як денотаційна семантика представлена ​​в термінах супероператорів[en]. Доведено, що вони узгоджуються. Обидві операційні і денотаційні семантики були реалізовані (класично) на мові Haskell[15].

Квантові лямбда-числення

[ред. | ред. код]

Квантові лямбда-числення є доповненням до класичного лямбда-числення, введеним Алонзо Черчом і Кліні в 1930-х роках. Мета квантових лямбда-числень — розширення квантових мов програмування теорією функцій вищого порядку.

Перша спроба визначити квантове лямбда-числення була зроблена Філіпом Мейміном у 1996 році[16] Його лямбда-q-числення досить потужне, щоб виразити будь-які квантові обчислення. Проте, ця мова може ефективно розв'язувати NP-повні задачі, і, тому виглядає суворо строгішою, ніж стандартні квантові обчислювальні моделі (наприклад, квантова машина Тюрінґа або модель квантових схем). Тому лямбда-q-числення Мейміна, швидше за все, неможливо буде реалізувати на фізичному пристрої.

У 2003 році Андре ван Тондер означив розширення лямбда-числення, що підходить для доведення коректності квантових програм. Він також надав реалізацію на мові програмування Scheme.[17]


У 2004 році Селінджер і Валірон означили строго типізоване лямбда-числення для квантових обчислень із системою типів, заснованою на лінійній логіці[en].

Мова Quipper[18] була опублікована в 2013 році.[19] Її реалізовано у вигляді вбудованої мови, використовуючи Haskell як мову-господаря.[20] З цієї причини квантові програми, написані на Quipper, записуються в Haskell, використовуючи надані бібліотеки. Наприклад, цей код реалізує підготовку суперпозиції

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

Квантові набори розробки програмного забезпечення

[ред. | ред. код]
Докладніше: Qiskit

Проект з відкритим кодом, розроблений IBM.[21] Створення та маніпуляція квантовими схемами здійснюється за допомогою Python, Swift або JavaScript. Результати отримують або за допомогою симуляторів, що працюють на власному пристрої користувача, симуляторів, що надаються IBM, або прототипів квантових пристроїв, що надаються IBM. Окрім можливості створювати програми з використанням базових квантових операцій, в пакеті Qiskit Aqua доступні алгоритми вищого рівня.[22] Qiskit базується на стандарті OpenQASM для представлення квантових ланцюгів і підтримуватиме контроль на рівні імпульсів квантових систем, як це визначено стандартом OpenPulse.[23]

Див також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. Jarosław Adam Miszczak. High-level Structures in Quantum Computing. Процитовано 12 грудня 2015.
  2. Bernhard Omer. Мова програмування QCL. Архів оригіналу за 8 Жовтня 2003. Процитовано 16 Квітня 2016.
  3. Hynek Mlnařík. LanQ – квантова імперативна мова програмування. Архів оригіналу за 20 Травня 2016. Процитовано 16 Квітня 2016.
  4. Пітер Селінджер, "На шляху до квантової мови програмування" [Архівовано 30 Квітня 2016 у Wayback Machine.], Mathematical Structures in Computer Science(Математичні структури в інформатиці) 14(4):527-586, 2004.
  5. а б Джонатан Ґретаж Дослідження QBL. Архів оригіналу за 31 Березня 2008. Процитовано 16 Квітня 2016.
  6. T. Altenkirch, V. Belavkin, J. Grattage, A. Green, A. Sabry, J. K. Vizzotto, QML: Функціональна мова програмування Quantum [Архівовано 10 липня 2006 у Wayback Machine.]
  7. Андре ван Тондер, "Лямбда-числення для квантових обчислень", SIAM J. Comput., 33(5), 1109–1135. (27 стор.), 2004. Також доступна за посиланням arXiv:quant-ph/0307150 [Архівовано 20 Грудня 2015 у Wayback Machine.]
  8. Peter Selinger and Benoît Valiron, "A lambda calculus for quantum computation with classical control" [Архівовано 22 Квітня 2016 у Wayback Machine.], Mathematical Structures in Computer Science 16(3):527-552, 2006.
  9. Pablo Arrighi, Gilles Dowek, "Лінійно-алгебраїчне лямбда-числення. високий порядок, кодування і збіжність" [Архівовано 19 Березня 2017 у Wayback Machine.], 2006
  10. Огляд квантових мов програмування. Архів оригіналу за 22 Квітня 2016. Процитовано 16 Квітня 2016.
  11. QCL. Архів оригіналу за 8 Жовтня 2003. Процитовано 16 Квітня 2016.
  12. Мова Q. Архів оригіналу за 20 червня 2009. Процитовано 16 квітня 2016.
  13. Microsoft Is Launching A New “Programming Language for Quantum Computers”. FossBytes. 25 вересня 2017. Архів оригіналу за 27 Вересня 2017. Процитовано 27 Вересня 2017.
  14. QML. Архів оригіналу за 26 вересня 2007. Процитовано 16 квітня 2016.
  15. Джонатан Ґретаж (англ. Jonathan Grattage), QML: Компілятор функціональної квантової мови програмування — англ. A Functional Quantum Programming Language (compiler) [Архівовано 5 березня 2016 у Wayback Machine.], 2005—2008
  16. Філіп Меймін (англ. Philip Maymin), [[https://web.archive.org/web/20170319035706/https://arxiv.org/abs/quant-ph/9612052 Архівовано 19 березня 2017 у Wayback Machine.] [Архівовано 19 березня 2017 у Wayback Machine.] [Архівовано 19 Березня 2017 у Wayback Machine.] Розширення лямбда-числення для вираження рандомізованих і квантомізованих алгоритмів (англ. "Extending the Lambda Calculus to Express Randomized and Quantumized Algorithms")], 1996
  17. André van Tonder. A lambda calculus for quantum computation (website). Архів оригіналу за 5 Березня 2016. Процитовано 16 Квітня 2016.
  18. Quipper. Архів оригіналу за 30 Квітня 2016. Процитовано 16 Квітня 2016.
  19. Alexander S. Green, Peter LeFanu Lumsdaine, Neil J. Ross, Peter Selinger, Benoît Valiron. The Quipper Language (website). Архів оригіналу за 30 Квітня 2016. Процитовано 16 Квітня 2016.
  20. Alexander S. Green, Peter LeFanu Lumsdaine, Neil J. Ross, Peter Selinger, Benoît Valiron (2013). An Introduction to Quantum Programming in Quipper. Архів оригіналу за 15 Лютого 2017. Процитовано 16 Квітня 2016.
  21. Qiskit homepage. Архів оригіналу за 21 Січня 2021. Процитовано 15 Січня 2021.
  22. Qiskit Aqua homepage. Архів оригіналу за 10 жовтня 2019. Процитовано 18 вересня 2018.
  23. McKay, David C.; Alexander, Thomas; Bello, Luciano; Biercuk, Michael J.; Bishop, Lev; Chen, Jiayin; Chow, Jerry M.; Córcoles, Antonio D.; Egger, Daniel; Filipp, Stefan; Gomez, Juan; Hush, Michael; Javadi-Abhari, Ali; Moreda, Diego; Nation, Paul; Paulovicks, Brent; Winston, Erick; Wood, Christopher J.; Wootton, James; Gambetta, Jay M. (2018). Qiskit Backend Specifications for OpenQASM and OpenPulse Experiments. arXiv:1809.03452 [quant-ph].

Посилання

[ред. | ред. код]