你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
快速入门:创建第一个 Q# 程序
了解如何编写一个演示纠缠的基本 Q# 程序,这是量子计算的关键概念。
当两个或多个 量子比特 纠缠时,它们共享量子信息,这意味着一个量子比特发生的情况也会发生在另一个量子比特身上。 在本快速入门中,你将创建一个名为 Bell 对的特定双量子位纠缠状态。 在 Bell 对中,如果在状态中 $\ket{0}$ 测量了一个量子位,则你知道另一个量子位也处于 $\ket{0}$ 状态而不测量它。 有关详细信息,请参阅 Quantum 纠缠。
在本快速入门中,请执行以下操作:
- 创建 Q# 文件。
- 分配一对量子比特。
- 纠缠量子比特。
先决条件
- 最新版本的 Visual Studio Code。
- Azure Quantum 开发工具包 (QDK) 扩展。 有关安装详细信息,请参阅 设置 Quantum 开发工具包。
创建 Q# 文件
- 打开 Visual Studio Code。
- 选择“文件>新建文本文件”。
- 将文件另存为
Entanglement.qs
。 .qs 扩展表示 Q# 程序。
Q#编写代码
Entanglement.qs
在文件中,按照以下步骤纠缠并测量一对量子比特。
定义一个命名空间
每个 Q# 程序都以用户定义的命名空间开头,这有助于组织相关功能。 对于本快速入门,命名空间为 BellPair
:
namespace BellPair {
// Your code goes here.
}
打开量子库
QDK 包括 Q# 标准库,其中包含量子程序的预定义函数和操作。 若要使用它们,必须先打开相关库。
BellPair
在命名空间中,使用open
语句导入Microsoft.Quantum.Diagnostics
库。 这使你可以访问其所有函数和操作,包括 DumpMachine()
稍后用于显示纠缠状态。
open Microsoft.Quantum.Diagnostics;
定义操作
打开相关库后,定义量子操作及其输入和输出值。 在本快速入门中,操作为 EntangleQubits
. 这是你将编写剩余 Q# 代码来分配、操作和测量两个量子比特的位置。
EntangleQubits
不采用任何参数并返回两 Result
个值, Zero
或者 One
,表示量子比特度量的结果:
operation EntangleQubits() : (Result, Result) {
// Your entanglement code goes here.
}
分配两个量子位
该 EntangleQubits
操作当前为空,因此下一步是分配两个量子比特, q1
以及 q2
。 在中 Q#,使用 use
关键字分配量子比特:
// Allocate two qubits, q1 and q2, in the 0 state.
use (q1, q2) = (Qubit(), Qubit());
注意
在中 Q#,量子比特始终以 $\ket{0}$ 状态分配。
将一个量子位放入叠加
量子比特 q1
并 q2
处于 $\ket{0}$ 状态。 若要为纠缠准备量子比特,必须将其中一个量子位置于均匀叠加中,其中 50% 的机会被测量为 $\ket{0}$ 或 $\ket{1}$。
通过应用 Hadamard, H
操作将量子位置于叠加中:
// Put q1 into an even superposition.
H(q1);
生成的状态q1
为{1}{\sqrt{2}}$\frac{ (\ket{{0}+\ket{1}),$这是甚至叠加$\ket{0}$和 $\ket{{1}$。
纠缠量子比特
现在,你已准备好使用受控的 NOT 操作 CNOT
纠缠量子比特。 CNOT
是一个控制操作,它采用两个量子比特,一个作为控件,另一个作为目标。
在本快速入门中,你将设置为 q1
控制量子比特和 q2
目标量子比特。 这意味着 CNOT
翻转处于状态时的状态 q2
q1
$\ket{1}$。
// Entangle q1 and q2, making q2 depend on q1.
CNOT(q1, q2);
这两个量子比特的结果状态是 Bell 对 $\frac{{1}{\sqrt{2}}(\ket{00}+\ket{{11})$ 。
提示
如果要了解 Hadamard 和 CNOT 操作如何转换量子比特的状态,请参阅 使用量子运算创建纠缠。
显示纠缠状态
在测量量子比特之前,请务必验证以前的代码是否成功纠缠它们。 可以使用 DumpMachine
该操作(库的 Microsoft.Quantum.Diagnostics
一部分)输出程序的当前状态 Q# :
// Show the entangled state of the qubits.
DumpMachine();
测量量子比特
验证量子比特纠缠后,可以使用 M
该操作来测量它们。 测量q1
和q2
折叠其量子状态甚至Zero
One
概率。
在中 Q#,使用 let
关键字声明新变量。 若要存储和 q2
的q1
度量结果,请分别声明变量m1
和m2
:
// Measure q1 and q2 and store the results in m1 and m2.
let (m1, m2) = (M(q1), M(q2));
重置量子比特
在每个程序结束时 Q# 发布之前,量子比特必须处于 $\ket{0}$ 状态。 使用 Reset
操作执行此操作:
// Reset q1 and q2 to the 0 state.
Reset(q1);
Reset(q2);
返回度量结果
最后,若要完成EntangleQubits
操作并观察纠缠状态,请返回度量结果和m1
m2
:
// Return the measurement results.
return (m1, m2);
提示
若要了解有关函数或操作的详细信息 Q# ,请将鼠标悬停在函数或操作上。
Q#运行代码
祝贺你! 你编写了一个纠缠两个 Q# 量子比特并创建一个 Bell 对的程序。 在运行程序之前,请使用 @EntryPoint()
属性告知 Q# 编译器开始执行程序的位置。 每个 Q# 程序必须包含一个 @EntryPoint()
。 在本例中EntangleQubits
,放在@EntryPoint()
操作之前。
最终 Q# 程序应如下所示:
namespace BellPair {
open Microsoft.Quantum.Diagnostics;
@EntryPoint()
operation EntangleQubits() : (Result, Result) {
// Allocate two qubits, q1 and q2, in the 0 state.
use (q1, q2) = (Qubit(), Qubit());
// Put q1 into an even superposition.
// It now has a 50% chance of being measured as 0 or 1.
H(q1);
// Entangle q1 and q2, making q2 depend on q1.
CNOT(q1, q2);
// Show the entangled state of the qubits.
DumpMachine();
// Measure q1 and q2 and store the results in m1 and m2.
let (m1, m2) = (M(q1), M(q2));
// Reset q1 and q2 to the 0 state.
Reset(q1);
Reset(q2);
// Return the measurement results.
return (m1, m2);
}
}
若要运行程序并查看这两个量子比特的结果,请选择“运行”或按 Ctrl+F5:@EntryPoint()
可以多次运行程序,每个程序在调试控制台中都有不同的结果。 这演示了量子测量的概率性质和量子比特的纠缠。
例如,如果结果是 Zero
,调试控制台应如下所示:
DumpMachine:
Basis | Amplitude | Probability | Phase
-----------------------------------------------
|00⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000
|11⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000
Result: "(Zero, Zero)"
下一步
若要了解有关量子纠缠 Q#的详细信息,请参阅 教程:使用 探索量子纠缠 Q#。 本教程扩展了本快速入门中介绍的概念,并帮助你编写更高级的纠缠程序。