. #13 (251)
. March 2019
57 Computer Science Так как функция
hadamard() возвращает матрицу состоящую только из 1 и -1, то для получения матрицы много-
кубитового гейта Адамара необходимо полученную из этой функции матрицу умножить на коэффициент
1
√𝑁𝑁
, где N —
количество базисных состояний регистра. Блок этого кода выглядит как на листинге ниже.
Результат расчета матрицы многокубитного гейта Адамара присвоен переменной
hadamardGate , а рассчитанное
количество состояний регистра — переменной
statesCount. Вычисление матрицы оракула.
Результатом расчета является переменная
oracle , содержащая квадратную матрицу N x N с единицами по всем
столбцам главной диагонали за исключением столбца, представляющего собой искомое состояние; в нем установлена
-1. Расчет такой матрицы в соответствии с формулами расчета выглядит следующим образом:
В результате работы этого блока кода значение переменной oracle будет иметь вид, как на примере для 2-х кубитов
и искомого 3-его состояния (
|10
⟩
):
|00
⟩
|01
⟩
|10
⟩
|11
⟩
𝑈𝑈
=
�
1 0
0 1
0 0
0 0
0 0
0 0
−
1 0
0
1
�
.
Расчет матрицы условного фазового сдвига.
Каждое базисное состояние, за исключением
|0… 0
𝑁𝑁
⟩
в регистре приобретает фазовый сдвиг -1 в соответствии
с выражением ниже:
𝑃𝑃
𝑠𝑠
:
�𝑥𝑥⟩ →
(
−
1)
𝑓𝑓
(
𝑥𝑥
)
�𝑥𝑥⟩
=
�−
|
𝑥𝑥⟩
,
|
𝑥𝑥⟩
,
𝑥𝑥
=
𝑥𝑥
𝑠𝑠
𝑥𝑥 ≠ 𝑥𝑥
𝑠𝑠
В переменной
faseShift сохранен результат расчета матрицы условного фазового сдвига в соответствии с формулой
расчета.
Вычисление количества итераций.
Количество итераций Гровера вычисляется по формуле:
𝐼𝐼
=
𝜋𝜋
4
√𝑁𝑁
где N — количество базисных состояний регистра.
Листинг кода, в котором реализован этот подсчет:
Использование встроенной функции
fix() объясняется необходимостью взять от результата вычисления только
целую часть.
Применение преобразования Адамара.
Приготовление равновероятной (с равными амплитудами) суперпозиции состояний кубитов с помощью рассчитан-
ной в шаге 2 многокубитовой матрицы Адамара:
|
ѱ
1
⟩
= |
𝑥𝑥⟩
=
1
√𝑁𝑁
|00. .00
⟩
+
1
√𝑁𝑁
|00. .01
⟩
+
1
√𝑁𝑁
|00. .10
⟩
…
1
√𝑁𝑁
|11. .11
⟩
.
В коде пользовательской функции
Grover это преобразование применяется к переменной с инициализированным
регистром
registerState :
Итерации Гровера.
Итерация Гровера (оператор Гровера) состоит из последовательно применяемых оракула, преобразования Адама-
ра, условного сдвига фазы и ещё одного преобразования Адамара. Его состав наглядно показан на схеме 1.
Блок кода, реализующий логику работы этого оператора представлен листинге 7.
Используемый цикл
for…end предназначен для выполнения оператора Гровера количество раз, равное значению
переменной
iterationsCount . Значение этой переменной было вычислено на шаге 5.
Здесь можно видеть как последовательно применяются преобразования к квантовому регистру, состояния которо-
го представлены переменными с префиксом ‘
state ..’ в наименовании.
Вывод результата.
Результатом работы функции является вектор-столбец, состоящий из амплитуд вероятности и график распределе-
ния вероятности по базисным состояниям. Возврат значения функцией
Grover осуществляется строкой кода, пред-
ставленной ниже.
𝐼𝐼
=
𝜋𝜋
4
√𝑁𝑁
где N — количество базисных состояний регистра.
Листинг кода, в котором реализован этот подсчет:
Использование встроенной функции
fix() объясняется необходимостью взять от результата вычисления только
целую часть.
Применение преобразования Адамара.
Приготовление равновероятной (с равными амплитудами) суперпозиции состояний кубитов с помощью рассчитан-
ной в шаге 2 многокубитовой матрицы Адамара:
|
ѱ
1
⟩
= |
𝑥𝑥⟩
=
1
√𝑁𝑁
|00. .00
⟩
+
1
√𝑁𝑁
|00. .01
⟩
+
1
√𝑁𝑁
|00. .10
⟩
…
1
√𝑁𝑁
|11. .11
⟩
.
В коде пользовательской функции
Grover это преобразование применяется к переменной с инициализированным
регистром
registerState :
Итерации Гровера.
Итерация Гровера (оператор Гровера) состоит из последовательно применяемых оракула, преобразования Адама-
ра, условного сдвига фазы и ещё одного преобразования Адамара. Его состав наглядно показан на схеме 1.
Блок кода, реализующий логику работы этого оператора представлен листинге 7.
Используемый цикл
for…end предназначен для выполнения оператора Гровера количество раз, равное значению
переменной
iterationsCount . Значение этой переменной было вычислено на шаге 5.
Здесь можно видеть как последовательно применяются преобразования к квантовому регистру, состояния которо-
го представлены переменными с префиксом ‘
state ..’ в наименовании.
Вывод результата.
Результатом работы функции является вектор-столбец, состоящий из амплитуд вероятности и график распределе-
ния вероятности по базисным состояниям. Возврат значения функцией