Пример квантового алгоритма, полезного для демонстрации языков

9

Я ищу квантовый алгоритм, который я могу использовать для демонстрации синтаксиса различных квантовых языков. Мой вопрос похож на это , однако для меня «хорошо» означает:

  • То, что он делает, может быть описано в 1-2 параграфах, и должно быть легко понять.
  • Следует использовать больше элементов «мира квантового программирования» (я имею в виду, что алгоритм должен использовать как можно больше классических констант, измерений, условий, регистров, операторов и т. Д.).
  • Алгоритм должен быть небольшим (максимум 15-25 псевдокодов).

Полезные алгоритмы часто бывают слишком длинными / сложными, но алгоритм Дойча не использует столько элементов. Может кто-нибудь предложить мне алгоритм «демо-версия»?

klenium
источник
Является ли ваше требование также, что это должен быть «алгоритм» с классическим вводом и классическим выводом и явной выгодой / отличием от способа, которым будет работать эквивалентный классический алгоритм?
DaftWullie
@DaftWullie Это не обязательно. Параметр оператора или классическая константа инициализации могут представлять для меня «входные данные», и я предоставлю выходной формат при необходимости. Это не нужно делать / быть особенным. Основное внимание уделяется синтаксису языков, описание предназначено только для проверки того, что коды на разных языках одинаковы. Смысл алгоритма не имеет значения.
Клениум
Добро пожаловать в Quantum Computing SE! Просто чтобы проверить, соответствуют ли ваши критерии хорошего ответа большинству элементов в самом коротком псевдокоде?
Mithrandir24601
1
@ Mithrandir24601 Спасибо! Да как-то так.
Клениум

Ответы:

3

Я предлагаю взглянуть на протоколы оценки собственного значения / собственного вектора. Существует большая гибкость, чтобы сделать задачу настолько простой или сложной, насколько вы хотите.

Начните с выбора двух параметров, n а также k, Вы хотите создатьn-кубит унитарный, U имеет собственные значения вида e2πiq/2k для целых чисел q, Убедитесь, что хотя бы одно из этих собственных значений уникально, и назовите егоω, Также убедитесь, что простое состояние продукта, скажем,|0n, имеет ненулевое перекрытие с собственным вектором собственного значения ω,

Цель состоит в том, чтобы реализовать алгоритм оценки фазы для этого, учитывая значение kи поручено вывести вектор |ψ это собственный вектор, соответствующий собственному значению ω, В общем, это будет состоять изn+k кубиты (если вам не нужны вспомогательные средства для реализацииU).

Это работает следующим образом:

  • установить два регистра, один из k кубиты, а другой nкубитов. ( использование квантовых регистров )

  • каждый кубит инициализируется в состоянии |0, ( инициализация квантовых регистров )

  • применить Адамара к каждому кубиту в первом регистре ( однобитные логические элементы )

  • с кубита r в первом регистре применитьU2rнацеливание на второй регистр ( многоквитные контролируемые ворота )

  • примените обратное преобразование Фурье к первому регистру и измерьте каждый кубит первого регистра в стандартном базисе. Их можно комбинировать, реализуя полуклассическое преобразование Фурье . ( измерение и обратная связь классических данных )

  • для правильного результата измерения второй регистр находится в желаемом состоянии |ψ,

Для простоты вы можете выбрать n=2, k=1так что тебе нужна 4×4 унитарная матрица с собственными значениями ±1, Я бы использовал что-то вроде

(U1U2)C(U1U2),
где Cобозначает контролируемое-НЕ. Существует только один собственный вектор с собственным значением -1, который|ψ=(U1U2)|1(|0|1)/2, и вы можете возиться с выбором U1 а также U2 изучить реализацию Uиспользуя разложение в терминах универсального набора ворот (я бы, вероятно, поставил это как предварительную проблему). ЗатемUлегко реализуется, просто заменив контролируемое-НЕ на контролируемое-контролируемое-НЕ (Toffoli). Наконец, обратное преобразование Фурье - это просто ворота Адамара.

Для чего-то более сложного, положите k=3и заменить C с квадратным корнем из ворот своп,

(1000012i200i21200001)
с ω=e±iπ/4 а также |ψ=(U1U2)(|01±|10)/2,
DaftWullie
источник
3

Похоже, вы хотите квантовый «Hello World». Наиболее простой квантовой версией этого было бы просто записать двоично-закодированную версию текста Hello Worldв регистр кубитов. Но это потребует ~ 100 кубитов и будет длиннее вашего верхнего предела длины кода.

Итак, давайте напишем более короткую часть текста. Давайте напишем ;), нам нужна строка битов длиной 16. В частности, используя кодировку ASCII

;)  =  00111011 00101001

Используя QISKit, вы сделаете это, используя следующий код.

from qiskit import QuantumProgram
import Qconfig

qp = QuantumProgram()
qp.set_api(Qconfig.APItoken, Qconfig.config["url"]) # set the APIToken and API url

# set up registers and program
qr = qp.create_quantum_register('qr', 16)
cr = qp.create_classical_register('cr', 16)
qc = qp.create_circuit('smiley_writer', [qr], [cr])

# rightmost eight (qu)bits have ')' = 00101001
qc.x(qr[0])
qc.x(qr[3])
qc.x(qr[5])

# second eight (qu)bits have 00111011
# these differ only on the rightmost two bits
qc.x(qr[9])
qc.x(qr[8])
qc.x(qr[11])
qc.x(qr[12])
qc.x(qr[13])

# measure
for j in range(16):
    qc.measure(qr[j], cr[j])

# run and get results
results = qp.execute(["smiley_writer"], backend='ibmqx5', shots=1024)
stats = results.get_counts("smiley_writer")

Конечно, это не очень квант. Таким образом, вы можете сделать суперпозицию из двух разных смайликов. Самый простой пример - наложение;) на 8), поскольку битовые строки для них отличаются только на кубитах 8 и 9.

;)  =  00111011 00101001
8)  =  00111000 00101001

Таким образом, вы можете просто заменить строки

qc.x(qr[9])
qc.x(qr[8])

из вышеизложенного с

qc.h(qr[9]) # create superposition on 9
qc.cx(qr[9],qr[8]) # spread it to 8 with a cnot

Адамар создает суперпозицию 0и 1, а узел превращает ее в суперпозицию 00и 11на два кубита. Это единственная обязательная суперпозиция для ;)и 8).

Если вы хотите увидеть реальную реализацию этого, это можно найти в руководстве по QISKit (полное раскрытие: оно было написано мной).

Джеймс Вуттон
источник
Я получаю 404 за эту ссылку. Вы переместили файл в другое место?
Клениум
Кажется, учебник был только что обновлен. Я изменил ссылку, так что теперь она должна работать.
Джеймс Вуттон
1

Я бы предложил (идеальный) 1-битный генератор случайных чисел. Это почти тривиально легко:

Вы начинаете с одного кубита в обычном начальном состоянии |0, Затем вы применяете ворота АдамараЧАС который производит равную суперпозицию |0 а также |1, Наконец, вы измеряете этот кубит, чтобы получить 0 или 1, каждый с вероятностью 50%.

пирамиды
источник