Изучение суперпозиции с помощью Q#
В предыдущих уроках вы узнали о суперпозиции и нотации Dirac. Это достаточно теории на данный момент! Давайте рассмотрим суперпозицию в Q#, написав код.
В этом уроке вы создадите квантовую суперпозицию и изучите вероятности с помощью DumpMachine
функции Q#. Функция DumpMachine
дампирует сведения о текущем состоянии квантовой системы в точке ее вызова.
Создание файла Q#
- Откройте Visual Studio Code.
- В Visual Studio Code выберите "Создать текстовый файл" > и сохраните файл в качестве Main.qs.
- Выберите представление —> палитра команд и тип Q#: задайте целевой профиль QIR Azure Quantum. Нажмите ВВОД.
- Выберите Q#: Неограниченно.
Начало работы с суперпозицией
Начнем с простой программы, которая создает случайный бит с помощью кубита в суперпозиции. Функция будет использоваться DumpMachine
для просмотра состояния кубита в разных точках программы.
Добавьте следующий код в файл Main.qs :
import Microsoft.Quantum.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; }
Здесь вы вызываете
DumpMachine
четыре раза:- После выделения кубита.
- После размещения кубита в суперпозиции.
- После измерения состояния кубита.
- После сброса кубита.
Вы разделили операцию
MResetZ
на две операции:M
иReset
. Это необходимо для проверки состояния после измерения.Чтобы запустить программу на встроенном симуляторе, нажмите кнопку "Выполнить над
Main
операцией" или нажмите клавиши CTRL+F5. Выходные данные будут отображаться в консоли отладки.Функция
DumpMachine
создает таблицу со сведениями, описывающими состояние регистра кубитов. В частности, она дает амплитуду вероятности, вероятность и фазу в радианах для каждого базисного состояния.После завершения работы программы в качестве результата вы получите
Zero
илиOne
. Давайте рассмотрим каждый этап.Инициализированная кубита: каждый кубит, выделенный с
use
помощью инструкции, начинается в состоянии $|0\rangle$. ПоэтомуDumpMachine
выдает сведения, соответствующие однокубитному регистру в состоянии $|0\rangle$.Initialized qubit: DumpMachine: 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: DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000 |1⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000
Кубит после измерения: после измерения и хранения результата, который может быть
Zero
илиOne
. Например, если итоговое состояниеOne
равно, состояние регистров свернуто до $|1\rangle$ и больше не находится в суперпозиции.Qubit after the measurement: DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |1⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000
Кубит после сброса: операция
Reset
сбрасывает кубит в состояние $|0\rangle$. Помните, что для любой операции Q# вам всегда нужно оставлять кубит в состоянии $|0\rangle$, чтобы его можно было использовать в других операциях.Qubit after resetting: DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000
Примечание.
Выходные данные могут отличаться, так как генератор случайных чисел является вероятностным. Вероятности результатов не детерминируются.
Изучение других типов состояний суперпозиции
Теперь, когда вы знаете, как проверить состояние регистра, вы увидите больше операций, которые изменяют состояние кубитов и помещают их в суперпозицию.
Текущий генератор случайных чисел с вероятностью 50 % создает состояние Zero
либо One
. Рассмотрим второй пример, в котором случайные числа создаются с разной вероятностью.
Асимметричный генератор случайных битов
Предположим, вы хотите создать случайный генератор битов, который сложен, то есть вероятность получения Zero
отличается от вероятности получения One
.
Например, вы хотите получить результат Zero
с вероятностью $P$ и результатом One
с вероятностью $1-P$. Ниже приведено допустимое состояние кубита, которое создает такой случайный генератор битов:
$$|\psi\rangle=\sqrt{P}|0\rangle+\sqrt{1-P}|1\rangle$$
Здесь $\alpha=\sqrt{P}$ и $\beta=\sqrt{1-P}$ являются амплитудами базовых состояний $|0\rangle$ и $|1\rangle$, соответственно.
Это состояние можно получить путем последовательного применения оператора $R_y(2\arccos\sqrt{P})$ к кубите в состоянии $|0\rangle.$ Вы можете достичь этого результата в Q# с помощью операции Ry в стандартной библиотеке.
Совет
Чтобы узнать больше о математических операциях с одним кубитом, ознакомьтесь с руководством по однокубитным шлюзам в Quantum Katas.
Измените Main.qs , как в следующем примере, и сохраните файл. В этом примере выбирается $\alpha$ значение $\frac13$.
import Microsoft.Quantum.Diagnostics.*; import Microsoft.Quantum.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."); Message(""); DumpMachine(); // Dump the state of the qubit Message(""); Message("Your skewed random bit is:"); let skewedrandomBit = M(q); Reset(q); return skewedrandomBit; }
Чтобы запустить программу на встроенном симуляторе, нажмите кнопку "Выполнить над
Main
операцией" или нажмите клавиши CTRL+F5. Выходные данные будут отображаться в консоли отладки.Вы можете увидеть, как функция
DumpMachine
отображает ожидаемое состояние после применения операций, а также отображает связанные вероятности. Обратите внимание, что вероятность полученияZero
составляет около 33,33%, а вероятность полученияOne
составляет около 66,67%. Таким образом, генератор случайных битов искажен.The qubit is in the desired state. DumpMachine: 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: Result: "One"
Примечание.
Выходные данные могут отличаться, так как генератор случайных чисел является вероятностным. Вероятности результатов не детерминируются.
Суперпозиция нескольких кубитов
Теперь давайте рассмотрим суперпозицию регистра, включающего несколько кубитов. Например, если регистр состоит из трех кубитов, то возможны восемь базисных состояний:
$$|000\rangle,|001\rangle,|010\rangle,|011\rangle,|100\rangle,|101\rangle, |110\rangle,|111\rangle $$
Так что можно выразить произвольное состояние трех кубитов в виде:
$$|\psi\rangle=\alpha_0|000\rangle+\alpha_1|001\rangle+\alpha_2|010\rangle+\alpha_3|011\rangle+\alpha_4|100\rangle+\alpha_5|101\rangle+\alpha_6 |110\rangle+\alpha_7|111\rangle$$
Здесь $\alpha_i$ — это сложные числа, удовлетворяющие $\sum|\alpha_i|^2=1$.
Например, кубиты можно поместить в однородную суперпозицию, применяя H
к каждому кубите. Вы можете использовать равномерную суперпозицию для создания разных версий квантового генератора случайных чисел, который генерирует трехбитовые числа путем измерения трех кубитов в суперпозиции вместо измерения одного кубита трижды.
База | Число |
---|---|
$\ket{000}$ | 0 |
$\ket{001}$ | 1 |
$\ket{010}$ | 2 |
$\ket{011}$ | 3 |
$\ket{100}$ | 4 |
$\ket{101}$ | 5 |
$\ket{110}$ | 6 |
$\ket{111}$ | 7 |
Измените Main.qs , как в следующем примере, и сохраните файл.
import Microsoft.Quantum.Diagnostics.*; import Microsoft.Quantum.Math.*; import Microsoft.Quantum.Convert.*; import Microsoft.Quantum.Arrays.*; operation Main() : Int { use qubits = Qubit[3]; ApplyToEach(H, qubits); Message("The qubit register in a uniform superposition: "); DumpMachine(); let result = ForEach(M, qubits); Message("Measuring the qubits collapses the superposition to a basis state."); DumpMachine(); ResetAll(qubits); return BoolArrayAsInt(ResultArrayAsBoolArray(result)); }
Здесь вы увидите три понятия:
- Переменная
qubits
представляет массивQubit
длиной 3. - Операции
ApplyToEach
и полезны для измерения иForEach
действия на нескольких кубитах, и они используют меньше кода. Библиотеки Q# предлагают множество видов операций и функций, которые повышают эффективность написания квантовых программ. - Функции
BoolArrayAsInt
изMicrosoft.Quantum.Convert
библиотеки преобразуют двоичныйResult
массив, возвращаемый целым числомForEach(M, qubits)
ResultArrayAsBoolArray
.
- Переменная
Чтобы запустить программу, нажмите кнопку "Выполнить над операцией" или нажмите клавиши CTRL+F5
Main
. Выходные данные будут отображаться в консоли отладки.С помощью функции
DumpMachine
вы можете посмотреть, как при измерении трех кубитов состояние регистра вырождается до одного из восьми возможных базисных состояний. Например, если вы получите результат3
, это означает, что состояние регистра свернуто до $|110\rangle$.The qubit register in a uniform superposition: DumpMachine: 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. DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |110⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000 Result: "3"
Примечание.
Выходные данные могут отличаться, так как генератор случайных чисел является вероятностным. Вероятности результатов не детерминируются.
Операция
ForEach(M, qubit)
измеряет каждый кубит поочередно, пошагово приходя к вырожденному состоянию. Вы также можете дампа промежуточных состояний после каждого измерения. Для этого измените Main.qs , как в следующем примере, и сохраните файл.import Microsoft.Quantum.Diagnostics.*; import Microsoft.Quantum.Measurement.*; import Microsoft.Quantum.Math.*; import Microsoft.Quantum.Convert.*; operation Main() : Int { use qubits = Qubit[3]; ApplyToEach(H, qubits); Message("The qubit register in a uniform superposition: "); DumpMachine(); mutable results = []; for q in qubits { Message(" "); set results += [M(q)]; DumpMachine(); } Message(" "); Message("Your random number is: "); ResetAll(qubits); return BoolArrayAsInt(ResultArrayAsBoolArray(results)); }
Здесь цикл
for
используется для последовательного воздействия на каждый кубит. Q# имеет классические возможности управления потоками, такие какfor
циклы иif
операторы, которые можно использовать для управления потоком программы.Чтобы запустить программу, нажмите кнопку "Выполнить " из списка команд над
Main
операцией или нажмите клавиши CTRL+F5.Вы можете увидеть, как последовательные измерения изменяют квантовое состояние и, следовательно, вероятность получения каждого результата. Например, если результат равен 5, вы получите следующие выходные данные. Давайте вкратце рассмотрим каждый этап.
Подготовка состояния. После применения
H
к каждому кубиту регистра мы получаем равномерную суперпозицию.The qubit register in a uniform superposition: DumpMachine: 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
. Таким образом, все амплитуды состояний, крайний правый кубит которых содержалZero
, отсутствуют. Это амплитуды $|0\rangle=|000\rangle, |2\rangle=|010\rangle, |4\rangle=|100\rangle$ и $|6\rangle= |110\rangle$. Остальные амплитуды увеличиваются, чтобы удовлетворять условию нормализации.DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |001⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000 |011⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000 |101⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000 |111⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000
Второе измерение. При втором измерении был получен результат
Zero
. Таким образом, все амплитуды состояний, у которых второй крайний правый (средний) кубит равенOne
, обращаются в нуль. Это амплитуды $|3\rangle=|011\rangle$ и $|7\rangle=|111\rangle$. Остальные амплитуды увеличиваются, чтобы удовлетворять условию нормализации.DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |001⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000 |101⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000
Третье измерение. При третьем измерении был получен результат
One
. Таким образом, все амплитуды состояний, слеваZero
от которых ясно. Единственное совместимое состояние — $|5\rangle=|101\rangle$. Это состояние возвращает вероятность амплитуды $1$.DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |101⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000 Your random number is: Result: "5"
Примечание.
Выходные данные могут отличаться, так как генератор случайных чисел является вероятностным. Вероятности результатов не детерминируются.