Упражнение. Создание различных состояний суперпозиции с помощью Q#
В предыдущих уроках вы узнали о суперпозиции и нотации Dirac. Это достаточно теории на данный момент! Давайте напишем код для изучения суперпозиции в Q#.
В этом уроке вы создадите состояния квантовой суперпозиции в Q# и изучите роль вероятности в результатах измерения. Вы также используете функцию DumpMachine в Q# для изучения состояния системы во время квантовых вычислений.
Создание файла Q#
- Откройте Visual Studio Code (VS Code).
- Откройте меню "Файл " и выберите "Создать текстовый файл ", чтобы создать новый файл.
- Сохраните файл как Main.qs.
Начало работы с суперпозицией
Начнем с простой программы Q#, которая использует кубит в состоянии суперпозиции для создания случайного битового значения, 0 или 1. В нашем коде мы используем DumpMachine функцию для просмотра состояния кубита в разных точках программы.
Скопируйте и вставьте следующий код в файл Main.qs :
import Std.Diagnostics.*; operation Main() : Result { use q = Qubit(); Message("Initialized qubit:"); DumpMachine(); // First dump Message(" "); H(q); Message("Qubit after applying H:"); DumpMachine(); // Second dump Message(" "); let randomBit = M(q); Message("Qubit after the measurement:"); DumpMachine(); // Third dump Message(" "); Reset(q); Message("Qubit after resetting:"); DumpMachine(); // Fourth dump Message(" "); return randomBit; }Чтобы запустить программу на встроенном симуляторе, выберите Линзу запуска над
Mainоперацией или нажмите Ctrl + F5. Выходные данные отображаются в консоли отладки.Проверьте консоль отладки, чтобы найти результат измерения либо
ZeroилиOne.
Функция DumpMachine создает таблицу сведений, описывающую состояние квантовой системы, которая в данном случае является одним кубитом. Информация из DumpMachine включает амплитуду вероятности, вероятность результата измерения и фазу в радианах для каждого состояния базы.
Код вызывает функцию DumpMachine четыре раза:
- После выделения кубита
- После того как вы поместите кубит в состояние суперпозиции
- После того как вы измерите состояние кубита
- После сброса кубита
Давайте рассмотрим выходные данные каждого вызова DumpMachine:
Инициализированный кубит: При выделении кубита с
useоператором, кубит всегда начинается в состоянии $|0\rangle$.Initialized qubit: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000Кубит после применения H: После применения
Hоперации кубит находится в равновероятном состоянии суперпозиции, $|\psi\rangle=\frac1{\sqrt2} |0\rangle + \frac1{\sqrt2} |1\rangle$.Qubit after applying H: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000 |1⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000Кубит после измерения: После измерения кубита результат либо
ZeroилиOne, и кубит полностью находится в состоянии, которое вы измеряли.Qubit after the measurement: Basis | Amplitude | Probability | Phase ----------------------------------------------- |1⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000Примечание.
Выходные данные от
DumpMachineпосле измерения могут отличаться от примера выходных данных, так как у вас есть 50% вероятность измерить каждое состояние. Вероятности исходов детерминированы, но результат отдельного измерения не является детерминированным.Кубит после сброса: Операция
Resetсбрасывает кубит в состояние $|0\rangle$, чтобы его можно было переподготовить для будущих вычислений.Qubit after resetting: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000
Изучение других состояний суперпозиции
Теперь, когда вы знаете, как проверить состояние системы кубита с помощью DumpMachine, давайте рассмотрим другие операции, которые помещают систему в различные виды суперпозиций.
Текущий генератор случайных битов с вероятностью 50% создает либо Zero, либо One. В следующем примере вероятности не равны.
Асимметричный генератор случайных битов
Предположим, вы хотите создать случайный генератор битов, который сложен, что означает, что вероятность получения Zero отличается от вероятности получения One.
Например, вы хотите, чтобы был исход Zero с вероятностью $P$ и исход One с вероятностью $1 - P$. Ниже приведено допустимое состояние кубита, которое создает такой случайный генератор битов:
$$|\psi\rangle=\sqrt{P}|0\rangle+\sqrt{1 - P}|1\rangle$$
Для этого состояния $|\psi\rangle$, $\alpha=\sqrt{P}$ и $\beta=\sqrt{1 - P}$ являются амплитудами вероятности базовых состояний $|0\rangle$ и $|1\rangle$, соответственно.
Чтобы получить это состояние, можно последовательно применить оператор $R_y(2\cos^{-1}\sqrt{P})$ к кубиту, который изначально находится в состоянии $|0\rangle$. Для достижения этого результата в Q#используйте стандартную библиотеку Ry .
Совет
Чтобы узнать больше о математических основах операций с одним кубитом, ознакомьтесь с руководством по элементамSingle-Qubit в Quantum Katas.
Чтобы создать состояние сложенной суперпозиции в Q#, выполните следующие действия:
Замените весь код в Main.qs следующим примером, а затем сохраните файл. В этом примере $\alpha$ устанавливается примерно как $\frac{1}{3}$.
import Std.Diagnostics.*; import Std.Math.*; operation Main() : Result { use q = Qubit(); let P = 0.333333; // P is 1/3 Ry(2.0 * ArcCos(Sqrt(P)), q); Message("The qubit is in the desired state."); DumpMachine(); // Dump the state of the qubit Message("Your skewed random bit is:"); let skewedrandomBit = M(q); Reset(q); return skewedrandomBit; }Чтобы запустить программу на встроенном симуляторе, выберите Линзу запуска над
Mainоперацией или нажмите Ctrl + F5. Выходные данные отображаются в консоли отладки.Изучите выходные данные
DumpMachineи результат измерения. Например, выходные данные похожи на следующие:The qubit is in the desired state. Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 0.5773+0.0000𝑖 | 33.3333% | 0.0000 |1⟩ | 0.8165+0.0000𝑖 | 66.6667% | 0.0000 Your skewed random bit is: One
Обратите внимание, что вероятность Zero результата измерения составляет около 33,33%, а вероятность One результата составляет около 66,67%. Этот случайный генератор битов склонен в сторону One.
Примечание.
Результат измерения может отличаться от примера выходных данных, так как генератор случайных битов является вероятностным. Вероятности исходов детерминированы, но результат отдельного измерения не является детерминированным.
Суперпозиция нескольких кубитов
До сих пор мы рассмотрели только однокубитные системы. Но хороший квантовый компьютер нуждается в много кубитов для выполнения полезных вычислений. Как работают квантовые состояния и суперпозиции, когда наша система имеет более одного кубита?
Например, рассмотрим систему из трех кубитов. Каждый кубит может иметь значение 0 или 1 при их измерении, поэтому есть восемь возможных состояний, в которых можно найти систему:
$$|000\rугол,|001\rугол,|010\rугол,|011\rугол,|100\rугол,|101\rугол, |110\rугол,|111\rугол $$
Существует восемь возможных состояний для этой системы, так как каждый кубит может независимо находиться в состоянии 0 или 1 при измерении. Как правило, количество возможных состояний равно $2^n$, где $n$ — это количество кубитов.
Точно так же, как и с одним кубитом, произвольное состояние суперпозиции для 3-кубитовой системы представляется взвешенной суммой этих восьми состояний, где весы являются амплитудами вероятности:
$$|\psi\rangle=\alpha_0|000\rугол+\alpha_1|001\rугол+\alpha_2|010\rугол+\alpha_3|011\rугол+\alpha_4|100\rугол+\alpha_5|101\rугол+\alpha_6 |110\rугол+\alpha_7|111\r$$
Еще раз амплитуды $\alpha_i$ являются сложными числами, удовлетворяющими условию $\sum\limits_{i=0}^{i=7}|\alpha_i|^2=1$.
Например, кубиты можно поместить в однородную суперпозицию, применяя H к каждому кубите. Затем можно использовать эту единую суперпозицию для создания генератора квантовых случайных чисел, который создает три битовые числа вместо однобитных чисел:
| Состояние основы | Число |
|---|---|
| $\ket{000}$ | 0 |
| $\ket{001}$ | 4 |
| $\ket{010}$ | 2 |
| $\ket{011}$ | 6 |
| $\ket{100}$ | 1 |
| $\ket{101}$ | 5 |
| $\ket{110}$ | 3 |
| $\ket{111}$ | 7 |
Примечание.
Стандартный способ записи битовых строк — иметь наименьшую цифру справа и самую большую цифру слева, как и обычные десятичные числа. В Q# (и многих других языках квантового программирования) порядок перевернут таким образом, чтобы наименьшая цифра была слева, и самая большая цифра находится справа.
DumpMachine Поскольку функция отображает квантовые состояния в стандартном порядке, десятичные целые числа, которые соответствуют состояниям, не упорядочены последовательно от 0 до $n-1$.
Чтобы создать генератор случайных чисел, выполните следующие действия.
Замените код в Main.qs следующим примером, а затем сохраните файл:
import Std.Diagnostics.*; import Std.Convert.*; operation Main() : Int { use qubits = Qubit[3]; ApplyToEach(H, qubits); Message("The qubit register in a uniform superposition: "); DumpMachine(); let result = MeasureEachZ(qubits); Message("Measuring the qubits collapses the superposition to a basis state."); DumpMachine(); ResetAll(qubits); return ResultArrayAsInt(result); }Чтобы запустить программу на встроенном симуляторе, выберите команду Запуск над
Mainоперацией или нажмите клавиши Ctrl + F5. Выходные данные отображаются в консоли отладки.Изучите выходные данные
DumpMachineи результат измерения. Например, выходные данные похожи на следующие:The qubit register in a uniform superposition: Basis | Amplitude | Probability | Phase ----------------------------------------------- |000⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |001⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |010⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |011⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |100⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |101⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |110⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |111⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 Measuring the qubits collapses the superposition to a basis state. Basis | Amplitude | Probability | Phase ----------------------------------------------- |011⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000 6Примечание.
Результат выходных данных, вероятно, отличается от примера выходных данных, так как генератор случайных чисел является вероятностным. Вероятности исходов детерминированы, но результат отдельного измерения не является детерминированным.
Для работы с несколькими кубитами код Q# имеет следующие изменения:
- Переменная
qubitsпредставляет массивQubitдлиной 3. - Операции
ApplyToEachиMeasureEachZприменяют квантовые операции к нескольким кубитам всего одной строкой кода. Библиотеки Q# предлагают множество функций и операций, упрощающих квантовое программирование. - Функция
ResultArrayAsIntизStd.Convertбиблиотеки преобразует двоичныйResultмассив в десятичное целое число.
Выходные данные DumpMachine показывают, что акт измерения сворачивает состояние суперпозиции в одно из восьми возможных состояний основы, как и с одним кубитом. Например, если вы получите результат 6, то это означает, что состояние системы свернуто до $|011\rangle$.
Теперь давайте глубже рассмотрим, как система изменяется при измерении каждого кубита. Предыдущий MeasureEachZ код использовал операцию для измерения всех трех кубитов одновременно. Вместо этого давайте будем использовать for цикл для измерения кубитов по одному за раз, а DumpMachine также для просмотра состояния системы после каждого измерения.
Замените код в Main.qs следующим примером, а затем сохраните файл:
import Std.Diagnostics.*; import Std.Convert.*; operation Main() : Int { use qubits = Qubit[3]; ApplyToEach(H, qubits); Message("The qubit register is in a uniform superposition: "); DumpMachine(); mutable results = []; for q in qubits { Message(" "); results += [M(q)]; DumpMachine(); } ResetAll(qubits); Message("Your random number is: "); return ResultArrayAsInt(results); }Чтобы запустить программу на встроенном симуляторе, выберите Линзу запуска над
Mainоперацией или нажмите Ctrl + F5. Выходные данные отображаются в консоли отладки.Изучите выходные данные
DumpMachineи результат измерения.
В выходных данных показано, как каждое последовательное измерение изменяет квантовое состояние и, следовательно, вероятности для получения каждого результата. Например, давайте рассмотрим каждую часть выходных данных в случае, если результатом является 5:
Подготовка состояния: система находится в равном состоянии суперпозиции после применения
Hк каждому кубите.The qubit register is in a uniform superposition: Basis | Amplitude | Probability | Phase ----------------------------------------------- |000⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |001⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |010⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |011⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |100⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |101⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |110⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |111⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000Первое измерение: результатом является
One, поэтому теперь единственные возможные состояния, в которых система может оказаться, — это состояния, где крайний левый бит равен 1. Амплитуды состояний, где самый левый кубит равен 0, исчезли, и вероятности оставшихся возможных состояний увеличиваются с 12,5% до 25,0%, чтобы сумма вероятностей оставалась 100%.Basis | Amplitude | Probability | Phase ----------------------------------------------- |100⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000 |101⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000 |110⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000 |111⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000Второе измерение: результат для второго измерения -
Zero, поэтому теперь единственные возможные состояния, в которых система может оказаться, это состояния, где два левых бита имеют значение 10. Теперь мы остаемся только с двумя возможными результатами, когда мы измеряем третий кубит, с вероятностью 50% для каждого результата.Basis | Amplitude | Probability | Phase ----------------------------------------------- |100⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000 |101⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000Третье измерение: в третьем измерении, результат
One. Система полностью измеряется и, следовательно, больше не находится в состоянии суперпозиции, как ожидалось.Basis | Amplitude | Probability | Phase ----------------------------------------------- |101⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000 Your random number is: 5
С помощью Q#можно создать систему кубитов, поместить кубиты в состояние суперпозиции и проверить, как система изменяется при применении квантовых операций или измерениях.