![cb5d5435299971f155127e8e5f35b8d5.png](https://i-blog.csdnimg.cn/blog_migrate/df57e94cb5111fde9085a272a8a21eca.png)
〇〇Q#(三):随机数
本文Github地址。由于Github渲染Jupyter里的公式有些问题,建议下载下来查看,这样的话,下面的代码也可以直接运行。
目录:
jks-liu/quantumgithub.com![154cba92bb49918c6d96ac25a093c115.png](https://i-blog.csdnimg.cn/blog_migrate/7b38031399f5e56c871b9a34d4a7246b.png)
这篇文章中,你会学到以下内容
关于量子算法
- 随机数生成算法
- 量子的两个基本状态
- 初始化一个量子比特
- 测量一个量子比特
- 复位一个量子比特
关于数学
- 向量/矩阵的共轭转置,
- 向量的内积,
- 向量的范数(Norm),
关于Q#
- Q#的
operation
结构 - 使用
Message
打印Debug信息 - 分支(
if
)语句 - 注释
//
随机数算法的实现
operation random_number(): Unit {
using (q=Qubit()) {
// Q#中会自动将新申请的量子比特初始化为Zero
H(q);
if (M(q) == Zero) {
Message("随机数是Zero");
} else {
// M(q)是One
Message("随机数是One");
}
Reset(q);
}
}
- random_number
量子算法解析
首先,量子比特(qubit)有两个基本状态,一个是Zero
,一个是One
。这两个都是Q#的关键字。
算法核心有以下三步:
- 初始化qubit 使用
q=Qubit()
向系统申请一个qubit,并将其状态初始化为Zero
; - 叠加态 使用
H(q)
将qubit置于叠加态; - 测量 使用
M(q)
测量qubit。测量处于叠加态的qubit,会有一半的概率得到Zero
,一半的概率得到One
。
数学描述
数学上,Zero
和One
分别对应一个向量,在量子力学语境中,一般称其为态矢(State Vector)。
$
下面我们来复习一下数学知识。
共轭转置(Adjoint,Hermitian(Conjugate) transpose)
我们用
对于矩阵
$
$
共轭转置这个定义和大家熟悉的转置有区别,我们用
向量的内积与范数(Norm)
若无特殊说明,向量默认为列向量。
对于内积大家应该对这个概论比较熟悉。我这里拿出来强调的原因是,好像大部分人只接触过实数域的情况,复数域上有些需要注意的地方。
在实数域上,向量
在复数域上,向量
不追求严谨的话,范数可以理解为绝对值,或向量的模。显然向量
量子比特
下面我们回到态矢。态矢也是一个复数域的向量,所以以后若无特殊说明,向量都是复数域上的。
对于单个量子比特q,记其态矢为
- 当我们测量q(判断它是
Zero
还是One
)时,有的概率是
Zero
,有的概率是
One
; - 显然,考虑概率的和必为1,
量子算法再解析
前面我们说过,本算法有三步:
- 初始化qubit
- 叠加态
- 测量
量子比特q的态矢变化如下
初始化会将其态矢设为Zero
,即
$
为了得到叠加态,我们会用到一个矩阵
$
上面出现的矩阵乘法就当大家都是会的,我就不细说了。
显然,根据上面讲的,当测量这个qubit时,各有一半的概率获得Zero
或One
。
以下为运行上面算法的可能结果之一:
%simulate random_number
随机数是One
()
Q#语法
上面的代码很简单,相信大家肯定没问题的。就强调几个
- 以分号结尾;
- 变量
q
的作用域只在using
词法块里; - 语句
H(q)
就直接改变了q
的状态,无须写成q=H(q)
之类的赋值语法。当然了,你想写也写不了; - 注释以
//
开头。