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

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

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

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

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

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

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

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

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

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

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

   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, Шаблон:Lang-en) була означена П. Зуліані в його кандидатській дисертації. Вона базується на Шаблон:Нп, створеній Едсґером Дейкстрою.

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

Інші

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

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

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

QFC і QPL

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

QML

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

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

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

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

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

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


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

Quipper

Мова 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

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

Див також

Примітки

Шаблон:Reflist

Посилання

Шаблон:Compu-stub Шаблон:Квантовий комп'ютер Шаблон:Мови програмування Шаблон:Перспективні технології

Шаблон:ВП-портали

  1. Шаблон:Cite web
  2. Шаблон:Cite web
  3. Шаблон:Cite web
  4. Пітер Селінджер, "На шляху до квантової мови програмування" Шаблон:Webarchive, Mathematical Structures in Computer Science(Математичні структури в інформатиці) 14(4):527-586, 2004.
  5. 5,0 5,1 Шаблон:Cite web
  6. T. Altenkirch, V. Belavkin, J. Grattage, A. Green, A. Sabry, J. K. Vizzotto, QML: Функціональна мова програмування Quantum Шаблон:Webarchive
  7. Андре ван Тондер, "Лямбда-числення для квантових обчислень", SIAM J. Comput., 33(5), 1109–1135. (27 стор.), 2004. Також доступна за посиланням arXiv:quant-ph/0307150 Шаблон:Webarchive
  8. Peter Selinger and Benoît Valiron, "A lambda calculus for quantum computation with classical control" Шаблон:Webarchive, Mathematical Structures in Computer Science 16(3):527-552, 2006.
  9. Pablo Arrighi, Gilles Dowek, "Лінійно-алгебраїчне лямбда-числення. високий порядок, кодування і збіжність" Шаблон:Webarchive, 2006
  10. Шаблон:Cite web
  11. Шаблон:Cite web
  12. Шаблон:Cite web
  13. Шаблон:Cite web
  14. Шаблон:Cite web
  15. Джонатан Ґретаж (Шаблон:Lang-en), QML: Компілятор функціональної квантової мови програмування — Шаблон:Lang-en Шаблон:Webarchive, 2005—2008
  16. Філіп Меймін (Шаблон:Lang-en), Шаблон:Webarchive Шаблон:Webarchive Шаблон:Webarchive Розширення лямбда-числення для вираження рандомізованих і квантомізованих алгоритмів (Шаблон:Lang-en), 1996
  17. Шаблон:Cite web
  18. Шаблон:Cite web
  19. Шаблон:Cite web
  20. Шаблон:Cite web
  21. Шаблон:Cite web
  22. Шаблон:Cite web
  23. Шаблон:Cite arxiv