使用Q#初探量子计算
LI Rui

本篇文章不保证知识权威,仅为个人理解。

很高兴能够带来量子计算的分享,当了解到Azure推出了世界上第一个开放的量子计算服务时(目前仍为预览版本),我马上进行了了解,并接触了微软推出的量子开发套件QDK及其包含的Q#语言。本编文章将介绍如何使用Q#语言来写一个量子随机数生成器。

需要注意,我们在电脑上跑Q#程序所产生的结果仍为伪随机结果,因为我们这是在模拟器中运行。但是通过模拟器验证结果之后,我们可以在量子计算机上运行相同的程序以获取真正的随机结果。

安装 QDK for Visual Studio Code

请确保继续进行前电脑已安装Visual Studio Code.NET Core 3.1 SDK

我们首先在Visual Studio Code中安装名为 Microsoft Quantum Development Kit for Visual Studio Code 的插件,你可以在市场中找到或在VS Code中按下Quick Open快捷键(通常为Ctrl+P)后运行下面的命令:

1
ext install quantum.quantum-devkit-vscode

为了验证安装没有出错,我们来运行一个名为 Quantum Hello 的程序。创建项目的步骤如下:

  1. 在 View - Command Palette 中选择 Q#: Create new project… 。
  2. 选择 Standard console application 。
  3. 命名新的项目为 QuantumHello ,并打开项目。

我们可以看到项目文件夹中包含两个文件Progeam.qsQuantumHello.csproj,第一个文件保存了我们的代码,第二个文件保存了项目的相关信息。

1
2
3
4
5
6
7
8
9
10
namespace QuantumHello {
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;


@EntryPoint()
operation SayHello() : Unit {
Message("Hello quantum world!");
}
}

我们打开一个终端执行上面的默认代码:

1
dotnet run

在终端中我们应该可以看到Hello quantum world!这样的输出,首次执行的时间可能会较长,因为会下载一些依赖。

编写随机数生成器

关于量子位和传统计算中的位

我们知道在传统计算中,位有0和1两种状态。而量子位中0和1状态是同时存在的叠加组合,在度量量子位时,量子位的状态会被更改。

这次我们会用到一个H操作,即一种将量子位置于偶态叠加中的方法,使得量子位被度量为0和1的概率均为50%。

Q#语言的结构

我们可以看到程序运行在一个命名空间(Name space)中,并且我们通过open来引入了需要的库。类似于函数的概念,Q#中我们称之为操作(Operation)。Q#支持我们使用一些经典计算中的操作。

更多关于Q#的信息,可以阅读文档:Microsoft Quantum Documentation

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace QuantumRandomNumber {
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.Math;
open Microsoft.Quantum.Convert;

operation GenerateRandomBit() : Result {
using (q = Qubit()) {
H(q);
return MResetZ(q);
}
}

@EntryPoint()
operation GenerrateRandomNumber() : Int {
let MAXN = 1000;
mutable res = 0;
repeat {
mutable bits = new Result[0];
for (idxBit in 1..BitSizeI(MAXN)) {
set bits += [GenerateRandomBit()];
}
set res = ResultArrayAsInt(bits);
} until (res <= MAXN);
return res;
}
}

我们通过度量H操作后的量子位对每一个二进制位进行生成,MResetZ操作会返回度量结果并将量子位的状态置为0。

控制台中我们第一次运行需要输入dotnet run,之后我们可以添加参数--no-build来跳过生成阶段。每次运行你应该都可以获得0到1000的随机数结果,但因为我们在模拟器中,这仍为伪随机数。

总结

因为量子的叠加态、计算中的干涉和牵连等特性,量子计算在解决特定问题的时候比传统计算机要快很多,但也有些时候也需要使用到经典计算。深究量子计算需要一定的数学功底和物理知识,这次我们只做了初步的探索,更多相关的知识欢迎大家去自行研究。

单单从这次的例子来看,利用量子的特性,我们能够得到真正的不可预测的随机数,除此以外我们能够利用量子计算在加密和解决一些算法问题上得到优势。最后也希望未来我国的量子技术蓬勃发展。

  • 本文标题:使用Q#初探量子计算
  • 本文作者:LI Rui
  • 创建时间:2021-01-13 00:26:27
  • 本文链接:https://www.lirui.tech/post/2021/c6a00c0273cf.html
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-SA 许可协议。转载请注明出处!