走进量子计算的大门——使用量桨PaddleQuantum创建单量子比特门

参考资料:

一、量子计算概述

我们现在广泛使用的计算机是冯·诺依曼在1945年提出的,现代电子计算机采用的都是“冯· 诺依曼结构”;而量子计算/量子计算机的概念是著名物理学家费曼于1981年首先提出的。

  • 一个经典的二进制存储器只能存一个数,要么存 0,要么存 1,但一个二进制量子存储器却可以同时存储 0 和 1 这两个数。
  • 两个经典二进制存储器只能存储以下四个数中的一个数: 00 ,01 ,10 或 11 ,倘若使用两个二进制量子存储器,则以上四个数可以同时被存储下来。
  • 按此规律,一个 N 个物理比特的存储器,若它是经典存储器,则它只能存储 2 N 2^N 2N个可能数据当中的任一个,若它是量子存储器,则它可以同时存储 2 N 2^N 2N个数

由此可见,量子存储器的存储能力是呈指数增长的,它与经典存储器相比,具有更强大的存储数据的能力,尤其是当 n 很大时 ( 如 n=250 ) ,量子存储器能够存储的数据量比宇宙中所有原子的数目还要多。

量子计算机在实施一次的运算中可以同时对 2 N 2^N 2N个输入数进行数学运算。其效果相当于经典计算机要重复实施 2 N 2^N 2N次操作,或者采用 2 N 2^N 2N个不同处理器实行并行操作。可见,量子计算机可以节省大量的运算资源(如时间、记忆单元等)。

量子计算机为什么能同时存储0和1?

一个“经典比特”,对应一位二进制数,信息容量空间为1比特(只能容纳两个可能的情况中的一个,因为, log ⁡ 2 2 = 1 \log_2 2=1 log22=1,谓之1比特。)。只有当这1比特信息容量空间,被0(或者1)填充、有确定值时,两个可能的情况中的一个情况被排除(不确定性得以消减),才意味着“信息”被写入了1比特信息容量空间;读取这1比特信息容量空间所写入的内容,就获得了1比特信息量;

两个“经典比特”,对应两位二进制数,信息容量空间为2比特(只能容纳四个可能的情况中的一个,因为, log ⁡ 2 4 = 2 \log_2 4=2 log24=2,谓之2比特。)。只有当这2比特信息容量空间,被00(或者01,10,11之一)填充、有确定值时,四个可能的情况中的三个情况被排除(不确定性得以消减),才意味着“信息”被写入了2比特信息容量空间;读取这2比特信息容量空间所写入的内容,就获得了2比特信息量;(更多“经典比特”的情况,照此类推)。

如果说经典比特是“开关”,只有开和关两个状态(0和1),那么量子比特就是“旋钮”,就像收音机上调频的旋钮那样,有无穷多个状态。

一个量子比特可以同时表示0和1,也就是说,有一定的概率是0,有一定的概率是1,但是概率和是1,回想一下物理中波函数的概念。量子位没有被测量的时候,值是不定的,可能是0和1,如果用设备测量,测量本身会对量子位造成影响,使得量子位的确切地变成0或者1。测量一个量子位若干次,大概会出现50%几率是1,50%几率是0,机会均等,测量次数越多,概率越稳定。

量子力学涉及随机性。例如,如果我们首先在垂直方向测量电子的自旋,然后在水平方向测量,并记录第二个测量装置的测量结果,我们会得到由N或S组成的一串字符串。这个自旋序列是完全随机的,例如,它可能看起来像NSSNNNSS…。

抛一枚均匀硬币是一个经典实验,它可以产生两个符号的随机序列,且每个符号出现的概率为二分之一。如果我们抛一个均匀的硬币,可能会得到序列HTTHHHTT…。尽管这两个例子产生了相似的结果,但在这两个理论中,对随机性的解释有很大的不同。

抛硬币是经典力学描述的事情,可以用微积分来建模。要计算硬币是正面朝上还是反面朝上,首先需要仔细测量初始条件:硬币的重量、离地高度、拇指对硬币的撞击力、拇指撞击硬币的准确位置、硬币的位置等。考虑到所有这些值,这个理论会告诉我们硬币是正面还是反面朝上。这没有包含真随机性。抛硬币似乎是随机的,因为每次抛硬币的初始条件都略有不同。这些微小的变化可以将结果由正面变为反面,反之亦然。

在经典力学中没有真随机性,只有对初始条件的敏感依赖——输入的微小变化可以被放大,并产生完全不同的结果。量子力学中关于随机性的基本观点是不同的:随机性就是真随机性。

正如我们看到的,从两个方向的自旋测量中得到的序列NSSNNNSS…,其被认为是真随机的。抛硬币得到的序列HTTHHHTT…,这看起来是随机的,但是物理的经典定律是确定的,如果我们能以无限的精度进行测量,这种明显的随机性就会消失。

在这个阶段,人们自然会对此提出质疑。爱因斯坦当然不喜欢这样的解释,他有句名言:上帝不会掷骰子。难道就没有更深层次的理论吗?如果我们知道更多关于电子初始构型的信息,难道最终的结果不是随机的而是完全确定的?难道不存在隐变量吗?一旦我们知道了这些变量的值,明显的随机性就会消失吗?

科学家们描述了一个巧妙的实验来区分隐变量和真随机性假设,结果表明,量子力学里的随机性是真随机的,没有简单的隐变量理论可以消除它。

这就说明了量子计算机的计算结果里带有概率的原因。概率其实在我们日常生活中也已经深入人心,它是反映随机事件出现的可能性大小。

如何测量量子计算的结果

对于一个两分类的量子态,比如电子的自旋(Spin),可以自旋向上。这时我们规定该电子处于 ∣ 0 ⟩ \lvert {0}\rangle 0态。当然电子也可以自旋向下,这时我们规定它处于 ∣ 1 ⟩ \lvert {1}\rangle 1 态。

神奇的是,电子等微观粒子在被观测之前可以同时处于自旋向上和自旋向下的叠加态 ∣ ψ ⟩ = α ∣ 0 ⟩ + β ∣ 1 ⟩ \lvert {\psi}\rangle =\alpha \lvert {0}\rangle + \beta \lvert {1}\rangle ψ=α0+β1。那么这个奇怪的叠加态到底指的是什么呢?

答案很简单,我们可以去测量一下这个处于"叠加态"的电子。值得注意的是,量子力学中的测量通常指的是一个统计结果而不是单次测量。这是由于测量本身的特性会使得观察后的量子态塌缩。就拿我们前面提到的处于 ∣ ψ ⟩ \lvert {\psi}\rangle ψ 态的这个电子来举例,如果我们测量这一个电子的自旋,我们会有 ∣ α ∣ 2 |\alpha|^2 α2 的概率观测到自旋向上并且观测后量子态塌缩成 ∣ 0 ⟩ \lvert {0}\rangle 0。同样的,我们也有 ∣ β ∣ 2 |\beta|^2 β2 的概率测量得到自旋向下 ∣ 1 ⟩ \lvert {1}\rangle 1。那么想要精确的得到 α \alpha α 的数值,一次实验显然是不够的。我们需要拜托物理学家朋友准备了好多好多处于叠加态 α ∣ 0 ⟩ + β ∣ 1 ⟩ \alpha \lvert {0}\rangle + \beta \lvert {1}\rangle α0+β1 的电子,把每一个电子的自旋都测量了一下再统计频率。

测量在量子力学中地位比较特殊,如果读者觉得难理解。请参阅 维基百科-量子力学中的测量 获取更多知识。

量子计算背后的哲学原理

好的过程也可能会偶尔失利,但从长远来看,好的过程总体上必然导致好的结果。中国有句老话,做事情要“尽人事,听天命”即是这个道理。下图是不吸烟与吸烟的人寿龄数据正态分布:

虽然不吸烟(尽人事)的人群中有寿龄短(听天命)的人,吸烟的人群中也有寿龄高的人,但总体来说,尽人事使天命的分布变得更好(曲线的中轴向好的方向偏移)。换句话说,无论一个人是否吸烟,均可能过早去世(分布的左侧尾巴:差尾巴),也可能活到高寿(分布的右侧尾巴:好尾巴)

对于吸烟问题,虽然选择健康的生活方式“不吸烟”,我们会进入更好分布的寿龄曲线(中心轴在75岁的分布),但依旧无法知道我们会处于该曲线的好尾巴(长寿),还是坏尾巴(夭折)。那么,既然“天命”对寿龄影响这么大,是否我们可以不注意健康呢?也不可以,如果不尽人事,我们会跌落到更差的寿龄曲线上去(中心轴在70岁的分布)。“人事”决定了我们处于哪个分布曲线,“天命”决定了我们处于该分布曲线的哪个尾巴,这就是对“尽人事、听天命”的统计学理解。

人事决定哪个分布,天命决定哪边尾巴!

任何事情均是由可控的因素和不可控的因素构成,即使把可控的因素做到最好,只能保证我们进入一个比较理想的正态分布,还需要借一定的“东风”才能成事。当然,我们也可以选择懈怠生活,同样有一定概率处于差分布的好尾巴(如某天中了双色球彩票),可能物质生活也很不错,但这仅仅是极小概率的事件。

希望上面这个案例能让你对量子计算有更深的理解。

二、量子计算的数学基础

1.量子比特

比特是经典计算中信息的基本对象,用bit表示;而量子比特是量子计算中信息的基本对象,用qubit表示。

在经典力学系统中,一个比特的状态是唯一的,而量子力学允许量子比特是同一时刻两个状态的叠加,这是量子计算的基本性质。从物理上来说量子比特就是量子态

2.量子态

在量子力学中,量子态是由一组量子数所确定的微观状态。量子态又分纯态和混态。

纯态

纯态可以用定义在希尔伯特空间H上的一个复矢量 ∣ ψ ⟩ \lvert {\psi}\rangle ψ表示,希尔伯特空间H的维度由量子系统的维度决定。如对于一个量子比特(维度为2)量子态可以表示为

∣ ψ ⟩ = α ∣ 0 ⟩ + β ∣ 1 ⟩ : = [ α β ] ,   α , β ∈ C \lvert {\psi}\rangle = \alpha \lvert {0}\rangle + \beta \lvert {1}\rangle := \begin{bmatrix} \alpha \\ \beta \end{bmatrix},\,\alpha, \beta \in \mathbb{C} ψ=α0+β1:=[αβ],α,βC

其中 α \alpha α β \beta β 可以是复数,他们表示概率振幅。这意味着当我们测量这个量子比特时,根据波恩法则,测量得到量子比特处于 ∣ 0 ⟩ \lvert {0}\rangle 0 状态的概率是 ∣ α ∣ 2 |\alpha|^2 α2;而测量得到 ∣ 1 ⟩ \lvert {1}\rangle 1的概率是 ∣ β ∣ 2 |\beta|^2 β2。由于概率相加等于1,我们必须要加入如下的限制条件:

∣ α ∣ 2 + ∣ β ∣ 2 = 1 |\alpha|^2 + |\beta|^2 = 1 α2+β2=1

混态

对于一个具有多量子比特的系统来说,它的单量子比特子系统将不再处于纯态 (pure state),而是演变成混合态 (mixed state)。混合态可以看成不同纯态的按照一定概率的混合,可以用密度矩阵来表示。

3.计算基

在量子力学中,一个微观粒子的量子态可以表示为由两个正规正交基线性组合得到的向量,这些基向量一般可以写为:

∣ 0 ⟩ : = [ 1 0 ] , ∣ 1 ⟩ : = [ 0 1 ] \lvert {0}\rangle := \begin{bmatrix} 1 \\ 0 \end{bmatrix}, \quad \lvert {1}\rangle := \begin{bmatrix} 0 \\ 1 \end{bmatrix} 0:=[10],1:=[01]

这里向量的表示方法采用了量子物理上传统的狄拉克表示 (bra-ket)。这两个单位正交向量 { ∣ 0 ⟩ , ∣ 1 ⟩ } \{\lvert {0}\rangle, \lvert {1}\rangle \} {0,1},一般被称为计算基 (computational basis)。

物理中可以认为 ∣ 0 ⟩ \lvert {0}\rangle 0 ∣ 1 ⟩ \lvert {1}\rangle 1 分别对应一个原子的能量基态和激发态或者其他一些二分类状态。

4.希尔伯特空间

对线性空间而言,主要研究集合的描述,直观地说就是如何清楚地告诉地别人这个集合是什么样子。为了描述清楚,就引入了基(相当于三维空间中的坐标系)的概念,所以对于一个线性空间来说,只要知道其基即可,集合中的元素只要知道其在给定基下的坐标即可。但线性空间中的元素没有“长度”(相当于三维空间中线段的长度),为了量化线性空间中的元素,所以又在线性空间引入特殊的“长度”,即范数。赋予了范数的线性空间即称为赋犯线性空间。但赋范线性空间中两个元素之间没有角度的概念,为了解决该问题,所以在线性空间中又引入了内积的概念。因为有度量,所以可以在度量空间、赋范线性空间以及内积空间中引入极限,但抽象空间中的极限与实数上的极限有一个很大的不同就是,极限点可能不在原来给定的集合中,所以又引入了完备的概念,完备的内积空间就称为希尔伯特空间。

一个抽象的希尔伯特空间中的元素往往被称为向量。在实际应用中,它可能代表了一列复数或是一个函数。例如在量子力学中,一个物理系统可以被一个复希尔伯特空间所表示,其中的向量是描述系统可能状态的波函数。

一个量子比特所有可能的态可以看作是二维希尔伯特空间中所有的归一化向量,这个希尔伯特空间的一组正规正交基正是 { ∣ 0 ⟩ , ∣ 1 ⟩ } \{\lvert {0}\rangle, \lvert {1}\rangle \} {0,1}。而更多的量子比特系统也同样可以由高维度的希尔伯特空间中的的单位向量表示,而这个高维希尔伯特空间的正交基就是 { ∣ 0 ⟩ , ∣ 1 ⟩ } \{\lvert {0}\rangle, \lvert {1}\rangle \} {0,1}的张量积。

5.张量积

符号 ⊗ \otimes 是张量积运算符号。其工作原理大概如下:
给定两个矩阵 A m × n A_{m\times n} Am×n 还有 B p × q B_{p \times q} Bp×q,那么 A , B A,B A,B的张量积为

A ⊗ B = [ a 11 B ⋯ a 1 n B ⋮ ⋱ ⋮ a m 1 B ⋯ a m n B ] ( m p ) × ( n q ) A \otimes B = \begin{bmatrix} a_{11}B & \cdots & a_{1 n}B\\ \vdots & \ddots & \vdots \\ a_{m1}B & \cdots & a_{m n}B \end{bmatrix}_{(mp)\times (nq)} AB=a11Bam1Ba1nBamnB(mp)×(nq)

比如,一个两量子比特 (2-qubit)系统可以被一个4维的希尔伯特空间里的单位复数向量表示,而这个希尔伯特空间的正规正交基是:

∣ 00 ⟩ = ∣ 0 ⟩ ⊗ ∣ 0 ⟩ : = [ 1 0 0 0 ] , ∣ 01 ⟩ = ∣ 0 ⟩ ⊗ ∣ 1 ⟩ : = [ 0 1 0 0 ] , ∣ 10 ⟩ = ∣ 1 ⟩ ⊗ ∣ 0 ⟩ : = [ 0 0 1 0 ] , ∣ 11 ⟩ = ∣ 1 ⟩ ⊗ ∣ 0 ⟩ : = [ 0 0 0 1 ] \lvert {00}\rangle = \lvert {0}\rangle\otimes \lvert {0}\rangle := \begin{bmatrix} 1 \\ 0 \\ 0 \\ 0 \end{bmatrix}, \quad \lvert {01}\rangle = \lvert {0}\rangle\otimes \lvert {1}\rangle := \begin{bmatrix} 0 \\ 1 \\ 0 \\ 0 \end{bmatrix}, \quad \lvert {10}\rangle = \lvert {1}\rangle\otimes \lvert {0}\rangle := \begin{bmatrix} 0 \\ 0 \\ 1 \\ 0 \end{bmatrix}, \quad \lvert {11}\rangle = \lvert {1}\rangle\otimes \lvert {0}\rangle := \begin{bmatrix} 0 \\ 0 \\ 0 \\ 1 \end{bmatrix} 00=00:=1000,01=01:=0100,10=10:=0010,11=10:=0001

我们默认最左边的位置代表第一个量子比特,依此类推。

6.布洛赫球面

我们用一个球面上的点来表示一个量子比特可能处于的量子态,这个球面被称为布洛赫球面

∣ ψ ⟩ = α ∣ 0 ⟩ + β ∣ 1 ⟩ = cos ⁡ ( θ 2 ) ∣ 0 ⟩ + e i φ sin ⁡ ( θ 2 ) ∣ 1 ⟩ \lvert {\psi}\rangle = \alpha \lvert {0}\rangle + \beta \lvert {1}\rangle = \cos\bigg(\frac{\theta}{2}\bigg) \lvert {0}\rangle + e^{i\varphi}\sin\bigg(\frac{\theta}{2}\bigg) \lvert {1}\rangle ψ=α0+β1=cos(2θ)0+eiφsin(2θ)1

多个量子系统的状态就无法用布洛赫球面来表示。如果是一个经典比特的话,那么它只有两个状态0和1,也就是布洛赫球面的北极和南极。这两个位置恰好对应着 ∣ 0 ⟩ \lvert {0}\rangle 0 ∣ 1 ⟩ \lvert {1}\rangle 1而一个量子比特不光可以处于两极,它可以在球面上任意一点,这样一种叠加的状态是经典比特做不到的。举例来说,量子态 1 2 ( ∣ 0 ⟩ + i ∣ 1 ⟩ ) \frac{1}{\sqrt{2}}\big(\lvert {0}\rangle + i\lvert {1}\rangle\big) 2 1(0+i1)就处于球面赤道和 y-正半轴的交界处。

三、走进量子计算的大门——量子门

在经典计算机中,我们可以在经典比特上施加基本的逻辑运算( 非门 NOT, 与非门 NAND, 异或门 XOR, 与门 AND, 或门 OR)并组合成更复杂的运算。而量子计算则有完全不同的一套逻辑运算,它们被称为量子门 (quantum gate)。我们并不能在一个量子计算机上编译现有的Python程序。因为经典计算机和量子计算机有不同的逻辑门构造,所以量子算法是需要利用这些量子门的特殊性来构造的

1.酉矩阵

量子门在数学上可以被表示成酉矩阵 (unitary matrix)。酉矩阵操作可以保证向量的长度不变,这是个很好的性质。不然我们对一个纯态量子比特进行操作,会让它劣化成混合态导致其无法接着使用。下式的 U U U就是酉矩阵:

U † U = U U † = I ,   ∥ ∣ ψ ⟩ ∥ = ∥ U ∣ ψ ⟩ ∥ = 1 U^{\dagger}U = UU^{\dagger} = I,\, \Vert \lvert {\psi}\rangle \Vert = \Vert U\lvert {\psi}\rangle\Vert = 1 UU=UU=I,ψ=Uψ=1

其中 U † U^{\dagger} U U U U的埃尔米特转置, I I I 表示单位矩阵。但是酉矩阵作为量子门的物理意义是什么?这意味着所有的量子门都必须是可逆的。对于任何一个量子门运算,都可以找到一个与其对应的反向运算。除此之外,酉矩阵必须是个方阵。因为量子门的输入和输出要求有同样数量的量子比特。一个作用在 n n n 量子比特的量子门可以写成一个 2 n × 2 n 2^n \times 2^n 2n×2n 的酉矩阵。最常见的(也是物理上最容易实现的)量子门作用在一个或两个量子比特上,就像经典逻辑门那样。

2.非门

有一个对于经典或量子计算都很重要的门是 非门 (NOT gate),其可以表示成如下酉矩阵:

X : = [ 0 1 1 0 ] X := \begin{bmatrix} 0 &1 \\ 1 &0 \end{bmatrix} X:=[0110]

这个量子门(酉矩阵)作用在单量子比特(一个复向量)上本质上的运算是矩阵乘以向量

X ∣ 0 ⟩ : = [ 0 1 1 0 ] [ 1 0 ] = [ 0 1 ] = ∣ 1 ⟩ and X ∣ 1 ⟩ : = [ 0 1 1 0 ] [ 0 1 ] = [ 1 0 ] = ∣ 0 ⟩ X \lvert {0}\rangle := \begin{bmatrix} 0 &1 \\ 1 &0 \end{bmatrix} \begin{bmatrix} 1 \\0 \end{bmatrix} =\begin{bmatrix} 0 \\1 \end{bmatrix} = \lvert {1}\rangle \quad \text{and} \quad X \lvert {1}\rangle := \begin{bmatrix} 0 &1 \\ 1 &0 \end{bmatrix} \begin{bmatrix} 0 \\1 \end{bmatrix} =\begin{bmatrix} 1 \\0 \end{bmatrix}=\lvert {0}\rangle X0:=[0110][10]=[01]=1andX1:=[0110][01]=[10]=0

3.泡利矩阵

在数学和数学物理中,泡利矩阵是一组三个2×2的幺正厄米复矩阵,一般都以希腊字母σ来表示,如泡利矩阵 { σ x , σ y , σ z } \{\sigma_x, \sigma_y, \sigma_z\} {σx,σy,σz},也可以用 { X , Y , Z } \{X, Y, Z\} {X,Y,Z} 表示。

刚刚的非门其实也可以表示为泡利矩阵 X X X ,这里也给出另外两个泡利矩阵 Y Y Y Z Z Z的定义:

X : = [ 0 1 1 0 ] , Y : = [ 0 − i i 0 ] , Z : = [ 1 0 0 − 1 ] X := \begin{bmatrix} 0 &1 \\ 1 &0 \end{bmatrix} ,\quad Y := \begin{bmatrix} 0 &-i \\ i &0 \end{bmatrix} ,\quad Z := \begin{bmatrix} 1 &0 \\ 0 &-1 \end{bmatrix} X:=[0110],Y:=[0ii0],Z:=[1001]

回忆起前面的布洛赫球面表示,这个矩阵 X X X 作用在一个量子比特(布洛赫球面上的一点)就相当于关于布洛赫球的X轴旋转角度 π \pi π。这就是为什么
X X X 可以表示成 R x ( π ) R_x(\pi) Rx(π)(只相差了一个无关紧要的全局相位 e − i π / 2 = − i e^{-i\pi/2} = -i eiπ/2=i )。其他两个泡利矩阵 Y Y Y Z Z Z 在这一点上也非常相似 (代表绕 Y和 Z轴旋转 π \pi π运算 )

4.单比特旋转门

一般来说,任何一个在布洛赫球关于相应的轴旋转 θ \theta θ 角度的量子门可以表示为 { R x , R y , R z } \{R_x, R_y, R_z\} {Rx,Ry,Rz}

R x ( θ ) : = [ cos ⁡ θ 2 − i sin ⁡ θ 2 − i sin ⁡ θ 2 cos ⁡ θ 2 ] , R y ( θ ) : = [ cos ⁡ θ 2 − sin ⁡ θ 2 sin ⁡ θ 2 cos ⁡ θ 2 ] , R z ( θ ) : = [ e − i θ 2 0 0 e i θ 2 ] R_x(\theta) := \begin{bmatrix} \cos \frac{\theta}{2} &-i\sin \frac{\theta}{2} \\ -i\sin \frac{\theta}{2} &\cos \frac{\theta}{2} \end{bmatrix} ,\quad R_y(\theta) := \begin{bmatrix} \cos \frac{\theta}{2} &-\sin \frac{\theta}{2} \\ \sin \frac{\theta}{2} &\cos \frac{\theta}{2} \end{bmatrix} ,\quad R_z(\theta) := \begin{bmatrix} e^{-i\frac{\theta}{2}} & 0 \\ 0 & e^{i\frac{\theta}{2}} \end{bmatrix} Rx(θ):=[cos2θisin2θisin2θcos2θ],Ry(θ):=[cos2θsin2θsin2θcos2θ],Rz(θ):=[ei2θ00ei2θ]

5.哈达玛门

除了旋转门之外,最重要的单比特门就是哈达玛门 H H H了。对应的布洛赫球面解释是两个旋转组成的,先是按Z轴旋转 π \pi π,然后按Y轴旋转 π / 2 \pi/2 π/2。它的矩阵表示是:

H : = 1 2 [ 1 1 1 − 1 ] H := \frac{1}{\sqrt{2}}\begin{bmatrix} 1 &1 \\ 1 &-1 \end{bmatrix} H:=2 1[1111]

以上就是比较简单的量子世界里的常见单量子比特门。

四、安装量桨PaddleQuantum

1.安装飞桨PaddlePaddle

# 使用pip安装飞桨PaddlePaddle
#!pip install paddlepaddle

在安装完成后,请通过以下代码段来检验是否成功安装 Paddle。本环境已默认安装飞桨,所以上面的命令无需运行。

from paddle import fluid

# 检查飞桨Paddle是否成功安装
fluid.install_check.run_check()
Running Verify Fluid Program ... 
Your Paddle Fluid works well on SINGLE GPU or CPU.
Your Paddle Fluid works well on MUTIPLE GPU or CPU.
Your Paddle Fluid is installed successfully! Let's start deep Learning with Paddle Fluid now

2.Git指令下载PaddleQuantum

接着我们安装 Paddle Quantum包,目前量桨还不支持通过 pip安装。需要用户在 Terminal 界面通过 git指令 git clone http://github.com/PaddlePaddle/quantum 下载文件,然后输入 cd quantumpip install -e . 完成安装。

接着在 Terminal 界面输入pip list查看是否在正确的环境中安装完成。关于 git的使用和安装,请参考这篇 教程。此外,如果你需要更多的关于安装Paddle-Quantum 的帮助,可以参考Github链接 或者通过 Github Issues联系量桨的开发团队。

# !git clone http://github.com/PaddlePaddle/quantum
Cloning into 'quantum'...
remote: Enumerating objects: 254, done.[K
remote: Counting objects: 100% (254/254), done.[K
remote: Compressing objects: 100% (193/193), done.[K
^Cceiving objects:  20% (98/473), 2.66 MiB | 5.00 KiB/s       

我已经提前下载好了,直接解压也可以:

# !unzip -oq /home/aistudio/work/quantum.zip

安装量桨:

%cd quantum
!pip install -e .
Successfully built interval progressbar
Installing collected packages: paddlepaddle, matplotlib, interval, progressbar, paddle-quantum
  Found existing installation: matplotlib 2.2.3
    Uninstalling matplotlib-2.2.3:
      Successfully uninstalled matplotlib-2.2.3
  Running setup.py develop for paddle-quantum
Successfully installed interval-1.0.0 matplotlib-3.3.4 paddle-quantum paddlepaddle-2.0.1 progressbar-2.5

检查是否安装成功:

import numpy as np
from paddle import fluid
from paddle.complex import matmul, transpose, trace
from paddle_quantum.circuit import UAnsatz
from paddle_quantum.utils import dagger, random_pauli_str_generator, pauli_str_to_matrix
from paddle_quantum.state import vec, vec_random, density_op, density_op_random
2021-03-08 10:35:43,516-INFO: Generating new fontManager, this may take some time...

以上的几个代码块没有任何报错的话,恭喜你!接着就可以顺利使用量桨了!

五、使用量桨创建单量子比特门

非门/泡利矩阵X

注意: 所有的单比特旋转门都按如下规定建立:

R x ( θ ) : = [ cos ⁡ θ 2 − i sin ⁡ θ 2 − i sin ⁡ θ 2 cos ⁡ θ 2 ] , R y ( θ ) : = [ cos ⁡ θ 2 − sin ⁡ θ 2 sin ⁡ θ 2 cos ⁡ θ 2 ] , R z ( θ ) : = [ e − i θ 2 0 0 e i θ 2 ] R_x(\theta) := \begin{bmatrix} \cos \frac{\theta}{2} &-i\sin \frac{\theta}{2} \\ -i\sin \frac{\theta}{2} &\cos \frac{\theta}{2} \end{bmatrix} ,\quad R_y(\theta) := \begin{bmatrix} \cos \frac{\theta}{2} &-\sin \frac{\theta}{2} \\ \sin \frac{\theta}{2} &\cos \frac{\theta}{2} \end{bmatrix} ,\quad R_z(\theta) := \begin{bmatrix} e^{-i\frac{\theta}{2}} & 0 \\ 0 & e^{i\frac{\theta}{2}} \end{bmatrix} Rx(θ):=[cos2θisin2θisin2θcos2θ],Ry(θ):=[cos2θsin2θsin2θcos2θ],Rz(θ):=[ei2θ00ei2θ]

再回顾一下非门或者说泡利矩阵:
X : = [ 0 1 1 0 ] , Y : = [ 0 − i i 0 ] , Z : = [ 1 0 0 − 1 ] X := \begin{bmatrix} 0 &1 \\ 1 &0 \end{bmatrix} ,\quad Y := \begin{bmatrix} 0 &-i \\ i &0 \end{bmatrix} ,\quad Z := \begin{bmatrix} 1 &0 \\ 0 &-1 \end{bmatrix} X:=[0110],Y:=[0ii0],Z:=[1001]

因此,我们不难看出 X X X 门可以表示为 R x ( π ) R_x(\pi) Rx(π)。以下是代码展示:

# 设置角度参数 theta = pi
theta = np.array([np.pi])

# 启动 Paddle 动态图模式
with fluid.dygraph.guard():
    
    # 我们需要将 Numpy array 转换成 Paddle 动态图模式中支持的 variable
    theta = fluid.dygraph.to_variable(theta)
    
    # 设置计算所需的量子比特数量
    num_qubits = 1
    
    # 初始化我们的单比特量子电路
    cir = UAnsatz(num_qubits)
    
    # 在第一个量子比特(第0号量子比特)的位置上施加一个 Rx 旋转门, 角度为 pi
    which_qubit = 0
    cir.rx(theta, which_qubit)
    
    # 打印出这个量子门
    # 转换成 numpy 
    print('量子门的矩阵表达式为:')
    print(cir.U.numpy())
量子门的矩阵表达式为:
[[ 6.123234e-17+0.j -6.123234e-17-1.j]
 [ 6.123234e-17-1.j  6.123234e-17+0.j]]

结果和 X ( N O T ) X (NOT) X(NOT)门只相差一个全局相位 − i -i i

output = [ 0 − i − i 0 ] = − i [ 0 1 1 0 ] = − i X \text{output} = \begin{bmatrix} 0 &-i \\ -i &0 \end{bmatrix} = -i\begin{bmatrix} 0 &1 \\ 1 &0 \end{bmatrix} = -i X output=[0ii0]=i[0110]=iX

但是在量子计算中,全局相位并不重要

当然,为了严谨,也可以直接使用下面的方法创建X门:

# 启动 Paddle 动态图模式
with fluid.dygraph.guard():
    # 设置计算所需的量子比特数量
    num_qubits = 1
    
    # 初始化我们的单比特量子电路
    cir = UAnsatz(num_qubits)
    
    # 在第一个量子比特(第0号量子比特)的位置上施加一个 哈达玛门
    which_qubit = 0
    cir.x(which_qubit)
    
    # 打印出这个量子门
    # 转换成 numpy 
    print('量子门的矩阵表达式为:')
    print(cir.U.numpy())
量子门的矩阵表达式为:
[[0.+0.j 1.+0.j]
 [1.+0.j 0.+0.j]]

泡利矩阵Y

按照以上的例子依葫芦画瓢,创建一个 Y Y Y

Y : = [ 0 − i i 0 ] Y := \begin{bmatrix} 0 &-i \\ i &0 \end{bmatrix} Y:=[0ii0]

# 设置角度参数 theta = pi
theta = np.array([np.pi])

# 启动 Paddle 动态图模式
with fluid.dygraph.guard():
    
    # 我们需要将 Numpy array 转换成 Paddle 动态图模式中支持的 variable
    theta = fluid.dygraph.to_variable(theta)
    
    # 设置计算所需的量子比特数量
    num_qubits = 1
    
    # 初始化我们的单比特量子电路
    cir = UAnsatz(num_qubits)
    
    # 在第一个量子比特(第0号量子比特)的位置上施加一个 Ry 旋转门, 角度为 pi
    which_qubit = 0
    cir.ry(theta, which_qubit)
    
    # 打印出这个量子门
    # 转换成 numpy 
    print('量子门的矩阵表达式为:')
    print(cir.U.numpy())
量子门的矩阵表达式为:
[[ 6.123234e-17+0.j -1.000000e+00+0.j]
 [ 1.000000e+00+0.j  6.123234e-17+0.j]]

和原来一样,结果还是多了一个全局相位

output = [ 0 − 1 1 0 ] = − i [ 0 − i i 0 ] = − i Y \text{output} = \begin{bmatrix} 0 &-1 \\ 1 &0 \end{bmatrix} = -i\begin{bmatrix} 0 &-i \\ i &0 \end{bmatrix} = -i Y output=[0110]=i[0ii0]=iY

也可以不用近似的方法直接创建Y门:

# 启动 Paddle 动态图模式
with fluid.dygraph.guard():
    # 设置计算所需的量子比特数量
    num_qubits = 1
    
    # 初始化我们的单比特量子电路
    cir = UAnsatz(num_qubits)
    
    # 在第一个量子比特(第0号量子比特)的位置上施加一个 哈达玛门
    which_qubit = 0
    cir.y(which_qubit)
    
    # 打印出这个量子门
    # 转换成 numpy 
    print('量子门的矩阵表达式为:')
    print(cir.U.numpy())
量子门的矩阵表达式为:
[[0.+0.j 0.-1.j]
 [0.+1.j 0.+0.j]]

通过上面这两个例子,相信你现在应该能把泡利矩阵Z也实现了吧。下面我们来看一下怎么实现哈达玛门。

哈达玛门

哈达玛门的矩阵表示如下所示:

H : = 1 2 [ 1 1 1 − 1 ] H := \frac{1}{\sqrt{2}}\begin{bmatrix} 1 &1 \\ 1 &-1 \end{bmatrix} H:=2 1[1111]

# 启动 Paddle 动态图模式
with fluid.dygraph.guard():
    # 设置计算所需的量子比特数量
    num_qubits = 1
    
    # 初始化我们的单比特量子电路
    cir = UAnsatz(num_qubits)
    
    # 在第一个量子比特(第0号量子比特)的位置上施加一个 哈达玛门
    which_qubit = 0
    cir.h(which_qubit)
    
    # 打印出这个量子门
    # 转换成 numpy 
    print('量子门的矩阵表达式为:')
    print(cir.U.numpy())
量子门的矩阵表达式为:
[[ 0.70710678+0.j  0.70710678+0.j]
 [ 0.70710678+0.j -0.70710678+0.j]]

单量子比特门近似

加深难度,寻找合适的参数 θ \theta θ,使用单比特旋转门 R y ( θ ) R_y(\theta) Ry(θ)来近似单量子比特门 U
U : = 1 2 [ 1 − 1 1 1 ] U:=\frac{1}{\sqrt{2}}\begin{bmatrix} 1 & -1 \\ 1 & 1\end{bmatrix} U:=2 1[1111]

老方法:

# 设置角度参数 theta = pi
theta = np.array([np.pi/2])

# 启动 Paddle 动态图模式
with fluid.dygraph.guard():
    
    # 我们需要将 Numpy array 转换成 Paddle 动态图模式中支持的 variable
    theta = fluid.dygraph.to_variable(theta)
    
    # 设置计算所需的量子比特数量
    num_qubits = 1
    
    # 初始化我们的单比特量子电路
    cir = UAnsatz(num_qubits)
    
    # 在第一个量子比特(第0号量子比特)的位置上施加一个 Ry 旋转门, 角度为 pi
    which_qubit = 0
    cir.ry(theta, which_qubit)
    
    # 打印出这个量子门
    # 转换成 numpy 
    print('量子门的矩阵表达式为:')
i
    which_qubit = 0
    cir.ry(theta, which_qubit)
    
    # 打印出这个量子门
    # 转换成 numpy 
    print('量子门的矩阵表达式为:')
    print(cir.U.numpy())
量子门的矩阵表达式为:
[[ 0.70710678+0.j -0.70710678+0.j]
 [ 0.70710678+0.j  0.70710678+0.j]]

具体推导过程可以参考这篇文章:AI Studio常规赛:量子电路合成之单量子比特门近似(参考题解)

六、总结与升华

量子力学的奠基人波尔曾说:

“如果你第一次学量子力学认为自己懂了,那说明你还没懂。”

我刚开始接触量子计算时,看到它的数学原理,我不禁想到,这不就是线性代数吗?随着深入学习,我越来越感觉到量子计算的奇妙之处,也感觉到自己可能并没有真正领会量子计算的“奥义”,就像量子力学的奠基人波尔说的那样,如果你第一次学量子力学认为自己懂了,那说明你还没懂。

但不管怎么说,量子计算给我们带来了无限的遐想空间,相信在不久的将来,量子计算会给我们的生活带来新的变化。

个人简介

北京联合大学 机器人学院 自动化专业 2018级 本科生 郑博培
百度飞桨开发者技术专家 PPDE
百度飞桨官方帮帮团、答疑团成员
深圳柴火创客空间 认证会员
百度大脑 智能对话训练师

我在AI Studio上获得至尊等级,点亮9个徽章,来互关呀!!!
https://aistudio.baidu.com/aistudio/personalcenter/thirdview/147378

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页