Microsoft Quantum Computing Fundamentals (MS QCF)读书笔记
一. 创建一个Q#程序
1. 学习目标
- 准备开发环境,以便在 Q# 中编写量子程序。
- 了解 Q# 程序的结构。
- 使用量子比特和叠加来构建量子随机数生成器。
2.准备工作
- .NET Core 3.1
- Visual Studio Code
- Install the latest version of .NET SDK 6.0.
- Quantum Development Kit for Visual Studio Code
3.创建Azure量子工作区
-
使用 Azure 订阅的凭据登录到 Azure 门户。
-
选择“创建资源”,然后搜索“Azure 量子”。在结果页上,应会看到 Azure 量子服务的磁贴。
-
选择“Azure 量子”,然后选择“创建”。将打开用于创建工作区的窗体。
-
选择要与新工作区关联的订阅。
-
选择快速创建或高级创建:
选择 描述 快速创建 快速创建选项是创建工作区的最简单途径。它会自动创建必要的资源组和存储帐户,添加 Quantinuum、IonQ 和 Microsoft QIO 提供程序,并包括用于 Quantinuum 和 IonQ 硬件的免费 Azure Quantum Credits(每个 500 美元)。如果需要,创建后仍可自定义工作区。 高级创建 使用高级创建选项手动配置资源组和存储帐户,为提供商选择其他支付选项,并设置标记以对资源进行分类。默认情况下,高级创建选项还会添加 Quantinuum、IonQ 和 Microsoft QIO 提供程序,并包括用于 Quantinuum 和 IonQ 硬件的免费 Azure Quantum Credits(每个 500 美元)。
4. 练习
5. 使用VS Code 创建Q#项目
1. 在查看View菜单中,点击命令面板Command Palette。
2. 输入Q#: Create new project.
3. 在弹出的下拉选项中选择Standalone console application。在VS刚打开的时候可能不会弹出这个选项,多试几次。
4. 选择目录,输入项目名称(示例QuantumHello),确认创建项目。
5. 创建成功后右下角会弹出通知,点击打开新建项目Open new project..
6. 在查看View菜单下,选择资源管理器Explorer,可以看到两个文件:QuantumHello.csproj 和 Program.qs。csproj文件定义了项目设置。Program.qs文件包含了基本的Q#程序。
namespace QuantumHello { open Microsoft.Quantum.Canon; open Microsoft.Quantum.Intrinsic; @EntryPoint() operation HelloQ() : Unit { Message("Hello quantum world!"); } }
6.运行程序
1. 查看View菜单下打开终端Terminal。
2. 输入 dotnet run
3. 程序会打印Hello quantum world!
7. 创建一个量子随机数生成器
1. 定义随机数生成逻辑。首先,列出我们的随机数生成器所需要的一些逻辑:
- 一个量子比特会随机的返回1或者0,且两者的概率相等各50%
- 定义一个我们想要的最大数max
- 定义需要生成的随机位数。这是通过计算需要多少位来完成的,nBits,我们需要将整数表示到最大值。
- 生成一个长度为nBits的随机位串。
- 如果生成的数字比最大数max还要大,那就回到上一步。
- 否则,程序结束,把这个字符串作为int返回。
举个例子,设置最大数max为12,我们可以使用 ⌊ln(12)/ln(2)+1⌋来计算出需要4位二进制数可以涵盖0-12这个范围,如果生成的二进制字符串为1101,也就是十进制的13,因为它比12大,所以我们要重新生成。
下一次,生成的二进制字符串位0110,也就是6,符合规则那么程序结束。
3. 添加需要的类库引用: Microsoft.Quantum.Math
和 Microsoft.Quantum.Convert。并新建一个量子比特,代码如下:
namespace QuantumRNG { open Microsoft.Quantum.Canon; open Microsoft.Quantum.Intrinsic; open Microsoft.Quantum.Measurement; open Microsoft.Quantum.Math; open Microsoft.Quantum.Convert; @EntryPoint() operation GenerateRandomBit() : Result { // Allocate a qubit. use q = Qubit(); // Put the qubit to superposition. H(q); // It now has a 50% chance of being measured 0 or 1. // Measure the qubit value. return M(q); } }
4. 定义操作Operation。也就是写一个新的方法:SampleRandomNumberInRange
namespace QuantumRNG { open Microsoft.Quantum.Canon; open Microsoft.Quantum.Intrinsic; open Microsoft.Quantum.Measurement; open Microsoft.Quantum.Math; open Microsoft.Quantum.Convert; operation GenerateRandomBit() : Result { // Allocate a qubit. use q = Qubit(); // Put the qubit to superposition. H(q); // It now has a 50% chance of being measured 0 or 1. // Measure the qubit value. return M(q); } operation SampleRandomNumberInRange(max : Int) : Int { mutable output = 0; repeat { mutable bits = []; for idxBit in 1..BitSizeI(max) { set bits += [GenerateRandomBit()]; } //The ResultArrayAsInt function comes from the Microsoft.Quantum.Convert library. This function converts the bit string to a positive integer set output = ResultArrayAsInt(bits); } until (output <= max); return output; } }
5. 定义程序入口点entry point。修改程序Program.qs如下:
namespace QuantumRNG { open Microsoft.Quantum.Canon; open Microsoft.Quantum.Intrinsic; open Microsoft.Quantum.Measurement; open Microsoft.Quantum.Math; open Microsoft.Quantum.Convert; operation GenerateRandomBit() : Result { // Allocate a qubit. use q = Qubit(); // Put the qubit to superposition. H(q); // It now has a 50% chance of being measured 0 or 1. // Measure the qubit value. return M(q); } operation SampleRandomNumberInRange(max : Int) : Int { mutable output = 0; repeat { mutable bits = []; for idxBit in 1..BitSizeI(max) { set bits += [GenerateRandomBit()]; } set output = ResultArrayAsInt(bits); } until (output <= max); return output; } @EntryPoint() operation SampleRandomNumber() : Int { let max = 50; Message($"Sampling a random number between 0 and {max}: "); return SampleRandomNumberInRange(max); } }
程序中,let指令声明了在计算过程中不会改变的变量。出于学习目的,这里我们将最大值定义为50。
6. 使用dotnet run命令运行程序,就可以得到输出
Sampling a random number between 0 and 50: 42
成功一次之后,如果没有更改代码,那么可以使用dotnet run --no-build来直接运行
8. 练习
二. 使用Q#探索量子计算主要概念
1. 学习目标
- 了解叠加、干涉和纠缠等概念
- 在模拟量子计算机上运行代码时检查量子态
- 估算运行程序时所需的量子资源
- 探索使用量子属性来超越传统算法的算法
2. 准备条件
- .NET SDK 6.0
- Visual Studio Code
- 量子开发工具包
- Azure Quantum 工作区
3. 量子计算机中的叠加
我们如何描述量子态?
狄拉克符号表示法是用于表示量子态的一种便利表示法。 在此表示法中,我们使用称为 kets |⟩|⟩ 的符号来描述量子系统的可能状态。
例如,|0⟩和 |1⟩ 分别表示 0 个和 1 个量子态。 它们是一个量子比特的两个可能状态。 如果量子位的状态为 |ψ⟩=|0⟩,则表示在测量量子位时观察到 Zero
的概率为 100%。 同样,如果量子位处于 |ψ⟩=|1⟩ 状态,当我们进行测量时,它产生 One的概率是100%
。
什么是线性运算符?
我们可以对量子态进行度量,但也可以对其进行更改。 例如,我们可以将 |0⟩|0⟩ 状态转换为 |1⟩|1⟩ 状态。
运算符是对量子系统状态进行操作并将其转换为另一种状态的函数。线性是量子力学的基本属性,因此也是量子计算的基本属性。
传统计算机和量子计算机之间的根本区别在于,量子计算机中的程序本质上是概率性质的,而传统计算机通常是确定性的。 量子算法包括应用于量子位寄存器的线性运算,用于将状态修改为所有可能的特定叠加。 每个可能的状态都具有关联的概率振幅。 在进行测量时,将获得一个具有一定概率的可能状态。 该情况与传统计算相反,在传统计算中,一个位只能是确定的 0 或 1。这些特征意味着,有时必须多次运行该算法,以确保输出中出现最高概率的结果。 这种重复操作看似效率低下。 但在许多情况下,相比以传统方式解决任务,多次运行量子算法效率更高。
4.使用Q#探索叠加态
首先,创建一个Q#程序,输入以下代码:
namespace ExploringSuperposition { open Microsoft.Quantum.Canon; open Microsoft.Quantum.Intrinsic; open Microsoft.Quantum.Diagnostics; open Microsoft.Quantum.Measurement; @EntryPoint() operation GenerateRandomBit() : Result { use q = Qubit(); Message("Initialized qubit:"); DumpMachine(); Message(" "); H(q); Message("Qubit after applying H:"); DumpMachine(); Message(" "); let randomBit = M(q); Message("Qubit after the measurement:"); DumpMachine(); Message(" "); Reset(q); Message("Qubit after resetting:"); DumpMachine(); Message(" "); return randomBit; } }
DumpMachine()函数创建一个表,其中包含描述量子位寄存器状态的信息。 具体而言,它为每个基础状态提供概率振幅、概率和相位(以弧度为单位)。 让我们看看每个步骤。
此处,调用 DumpMachine
四次:
- 分配量子位后
- 将量子位置于叠加中之后
- 测量量子位的状态之后
- 重置量子位后
将运算 MResetZ
拆分为两个运算:M
和 Reset
。 这样做是因为要在测量之后检查状态。
运行后,如果获得结果为One,你将看到以下输出:
Initialized qubit: # wave function for qubits with ids (least to most significant): 0 |0⟩: 1.000000 + 0.000000 i == ******************** [ 1.000000 ] --- [ 0.00000 rad ] |1⟩: 0.000000 + 0.000000 i == [ 0.000000 ] Qubit after applying H: # wave function for qubits with ids (least to most significant): 0 |0⟩: 0.707107 + 0.000000 i == *********** [ 0.500000 ] --- [ 0.00000 rad ] |1⟩: 0.707107 + 0.000000 i == *********** [ 0.500000 ] --- [ 0.00000 rad ] Qubit after the measurement: # wave function for qubits with ids (least to most significant): 0 |0⟩: 0.000000 + 0.000000 i == [ 0.000000 ] |1⟩: 1.000000 + 0.000000 i == ******************** [ 1.000000 ] --- [ 0.00000 rad ] Qubit after resetting: # wave function for qubits with ids (least to most significant): 0 |0⟩: 1.000000 + 0.000000 i == ******************** [ 1.000000 ] --- [ 0.00000 rad ] |1⟩: 0.000000 + 0.000000 i == [ 0.000000 ]
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战