Microsoft Quantum Computing Fundamentals (MS QCF)​读书笔记

 


一. 创建一个Q#程序

1. 学习目标

  • 准备开发环境,以便在 Q# 中编写量子程序。
  • 了解 Q# 程序的结构。
  • 使用量子比特和叠加来构建量子随机数生成器。

2.准备工作

3.创建Azure量子工作区

  1. 使用 Azure 订阅的凭据登录到 Azure 门户

  2. 选择“创建资源”,然后搜索“Azure 量子”。在结果页上,应会看到 Azure 量子服务的磁贴。

  3. 选择“Azure 量子”,然后选择“创建”。将打开用于创建工作区的窗体。

  4. 选择要与新工作区关联的订阅。

  5. 选择快速创建或高级创建:

    选择描述
    快速创建 快速创建选项是创建工作区的最简单途径。它会自动创建必要的资源组和存储帐户,添加 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 四次:

  1. 分配量子位后
  2. 将量子位置于叠加中之后
  3. 测量量子位的状态之后
  4. 重置量子位后

将运算 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 ]
复制代码

 

posted @   李琦贝尔蒙特  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示