量子计算机编程(三)——量子应用
量子计算机编程(一)——QPU编程
量子计算机编程(二)——QPU基础函数
量子计算机编程(三)——量子应用
量子编程一层层搭建,最后是应用层
都到应用了,肯定会涉及数据,本节内容主要包括,量子数据、量子搜索、量子超级采样、Shor算法、量子机器学习。
真实数据
和数据有关的讨论一般围绕在两个方面,存储和表示。
QRAM
本书没有讨论QRAM如何制造,只是提了用法。
和普通的QRAM有一个重要区别,地址也可以是叠加态。
表示
小数:我们可以借鉴经典的手法,就像经典里面如何表达浮点数的一样,我们也这样来表述量子的小数,\(Q_{n.m}\)n位的数据,其中m位是小数,(n-m)位是整数。
向量: [0,1,2,3]这个向量要怎么表示?
最基础的:
很容易理解,但是也很浪费空间,没有用到量子自身的特性。
amplitude encoding for vectors:
这个就利用了量子的性质,不过他也有自己的局限性:
- 量子叠加态基本就是 unREADable 的
- 因为概率需要归一化,所以他能表示的态也需要归一化
矩阵:
整体思路是用opertate来表示矩阵:
不过这里有两个限制:operator只能unitary的,矩阵不仅不一定是unitary,都不一定是hermitian的。解决方案如下:
不是hermitian的矩阵,可以构建成hermitian,通过 \(H=\left[\begin{array}{ll}0 & X \\ X^{\dagger} & 0\end{array}\right]\)
- Deconstruct \(H=H_{1}+\ldots H_{n}\) 把H分解成更容易模拟的hermitian(也就是更容易执行第二步)
- Simulate components \(U=\exp (-i H t)\) 操作只有unitary的操作,但是矩阵可以把他们联系到一起
- Reconstruction 把得到的U乘起来,因为H是在指数上分解的,所以这里直接乘起来就可以
量子搜索Quantum Search (QS)
Phase Logic ,我们不仅可以改变他们的0或者1,还可以通过01来改变量子态的相位,就像这样:
相位逻辑和其他逻辑最大的区别就是他把操作结果隐藏到了unreadable的相位里,通过改变叠加态里的相位,我们可以在一组寄存器里标记很多的态,并且还能通过AA之类的方法提取出来。
输入值还是那些量子态,输出值则被编码到了相对相位里。
那么这些是怎么完成的呢?简单的相位逻辑的组件:
所以这个有什么用?
围观一个小公主找国王爸爸要礼物的例子:
小公主想要一只小猫咪,爸爸就给了他两个盒子,盒子A说:至少有一个盒子有猫咪,盒子B说:另一只盒子有老虎。
爸爸又说,这两个盒子要么同时为真,要么同时为假。
于是我们的小公主殿下搞出了这么一个数字逻辑:
这样,跑把四种可能性都跑一遍,输出为1就满足了逻辑。
但是爸比就是很喜欢为难他的小可爱,他给公主提出一个要求,这个装置只能跑一次。
于是小公主就搞了一个量子版本:
首先,用量子的把实验跑一遍,相对相位上把答案翻转,然后做实验的逆操作(所有的量子操作都是可逆的),现在答案就写在\(|00\rangle,|01\rangle|10\rangle|11\rangle\)的相对相位里,再grover把他们找到。
实验在这里,https://oreilly-qc.github.io/?p=10-2
把答案翻转后的状态:
把答案 uncompute后:
Grover mirror 后:
量子超采样
超采样是什么?
简单的说,这是抗锯齿的一种方法,电脑显示的图片由像素组成,一条线如果不是完全水平或者竖直,那么表现出来就会有锯齿,超采样就是在像素内部的多个实例处(而不是像正常情况一样在中心处)获取颜色样本,然后计算平均颜色值。通过以比显示的图像高得多的分辨率渲染图像,然后使用多余的像素进行计算将其缩小到所需的大小,以此达到目的。
这项任务,我们执行并行处理(计算与场景交互的许多光线的结果),但最终仅需要结果的总和,而不是单个结果本身。(听起来就可以量子加速)
那么量子处理器在这里能做些什么吗?
不过首先,在应用QSS之前,我们要知道如何用量子寄存器来表示图像。
这样就拥有一张画布,我们可以通过相位翻转来改变他们的颜色,我们在上面施加的操作就是画笔。
如果想要画曲线怎么办:https://oreilly-qc.github.io/?p=11-2 这是一个画了曲线的例子。
现在我们来讨论超级采样,对于每个图块,我们要估计已被相位翻转的子像素的数量。在黑白子像素(为我们表示为翻转或非翻转相位)的情况下,这使我们能够为每个最终像素获取一个代表其原始组成子像素强度的值。
此问题与前面“多个翻转项”中的“量子和估计”问题完全相同。要使用量子和估计,我们仅将实现绘制指令的量子程序视为用于翻转子程序的幅度放大量子程序。将其与第7章中的量子傅立叶变换相结合,可以近似估算每个图块中翻转的子像素的总数。
不过这样得到值不是确定的翻转的数目,我们需要将这个值和look up table结合着来看。
如果还在考虑颜色问题,那就是RGB各来一张图就好。
Shor算法
因数分解究竟在做什么,大家可以看一眼这个 因数分解算法、周期查找算法(简化)
默认大家看完有了大概了解,现在来看一个具体例子:因数分解15=3*5
代码是简单的调用
var N = 15; // The number we're factoring
var precision_bits = 4; // See the text for a description of this
var coprime = 2; // For this QPU implementation, this must be 2
var result = Shor(N, precision_bits, coprime);
整个过程一共有八步,•Steps 1–4制备 \(a^x mod(N)\) 的叠加态,Steps 5–6 量子傅里叶找到周期 Steps 7–8 拿到周期后计算因数
- Step 1: Initialize QPU Registers
- Step 2: Expand into Quantum Superposition
前面两个步骤结束后就是红色箭头这里,现在量子态的状态如下:
- Step 3: Conditional Multiply-by-2
这一步是用来计算\(2^x\),任何的二进制寄存器都可通过简单的移位实现2的乘积(或者实际上是2的任何幂)。在我们的例子中,每个量子位都与下一个最高加权位置交换。需要注意的是我们将只使用精度寄存器的两个最低权重的量子位来表示x的值(这意味着x可以取值0、1、2、3),线路为图上iter0
- Step 4: Conditional Multipy-by-4
线路为图上iter1,目前我们已经得到了\(a^x\),对于我们考虑过的特定示例,我们的电路设法自动处理模数。
乘2和乘4后量子态的状态如下:
- Step 5: Quantum Fourier Transform
- Step 6: Read the Quantum Result
测量,我们测量的结果可能是0、4、8、12中的任意一个,他们是等概率25%
- Step 7: Digital Logic
function ShorLogic(N, repeat_period, coprime) { // Given the repeat period, find the actual factors
var ar2 = Math.pow(coprime, repeat_period / 2.0);
var factor1 = gcd(N, ar2 - 1);
var factor2 = gcd(N, ar2 + 1);
return [factor1, factor2];
}
把4丢到这里面去算,得到的结果是3,5
- Step 8: Check the Result
量子机器学习
在这里我们将要介绍三种QML应用:线性方程组的求解,量子主成分分析和量子支持向量机。
HHL解线性方程
线性方程很容易变成矩阵乘法的形式\(\overrightarrow{\mathbf{A}} \vec{x}=\vec{b}\) ,求解线性方程也就是\(\vec{x}=\mathbf{A}^{-1} \vec{b}\)
而HHL提供了一种比共轭梯度下降法更快地方式来找矩阵的逆。
Scratch register 也就是辅助比特包含由HHL中的各种基元使用的许多临时量子位,所有临时量子位均以“ 0”状态准备。因为HHL处理定点(或浮点)数据并且涉及非平凡的算术运算(例如取平方根),所以我们需要大量的临时qubit。即使最简单的情况,这也使得HHL难以仿真。
当然如果我们得到了叠加态\(|x\rangle\),也不是里面每一个数据都能读出来,但是在有的情况下,我们并不需要里面的每一个值,比如:
- 我们可能不需要\(|x\rangle\)的每个分量的值,而是他们平均值或者和
- 或者我们只想要比较一下看是否等于
- 或者\(|x\rangle\)只是程序下一部分的输入
这个算法的时间复杂度是\(O\left(x^{2} s^{2} \epsilon^{-1} \log n\right)\)
HHL算法适合于求解由稀疏,条件良好的矩阵表示的线性方程组。
那具体HHL又是怎么做的呢是怎么做到的?
HHL的灵感来自特征值分解来获得矩阵逆的信息,一个栗子:
A的特征向量为\(v_1 = [−0.7882,0.615]\) and \(v_2 = [−0.615, −0.788]\),对应的特征值为 λ1 = 0.438 and λ2 = 4.56, 那么,在特征基的表示下,我们可以把z改写成 [−0.788, −0.615],因为\(\vec{z}=-0.788 \vec{v}_{1}-0.615 \vec{v}_{2}\)
而A可以改写成:\(\Lambda=\left[\begin{array}{cc}0.438 & 0 \\ 0 & 4.56\end{array}\right]\)
现在求逆就很容易了,\(\mathbf{A}^{-1}=\left[\begin{array}{cc}\frac{1}{0.438} & 0 \\ 0 & \frac{1}{4.56}\end{array}\right]=\left[\begin{array}{cc}2.281 & 0 \\ 0 & 0.219\end{array}\right]\)
那么,\(\vec{x}=\left[\begin{array}{ccc}\frac{1}{\lambda_{1}} & - & 0 \\ \vdots & \ddots & \vdots \\ 0 & - & \frac{1}{\lambda_{n}}\end{array}\right]\left[\begin{array}{c}\dot{b}_{1} \\ \vdots \\ \tilde{b}_{n}\end{array}\right]=\left[\begin{array}{c}\frac{1}{\lambda_{1}} \dot{b}_{1} \\ \vdots \\ \frac{1}{\lambda_{n}} \dot{b}_{n}\end{array}\right]\)
- Quantum simulation, QRAM, and phase estimation
- Invert values
- Move inverted values into amplitudes
- Amplitude amplification
- Uncompute
量子主成分分析
在量子之前,先了解一下什么是PAC,PCA通常用作预处理步骤,可以将一组输入的特征转换为新的、不相关的集合。 PCA产生的不相关功能可以根据它们编码的数据差异量进行排序。通过仅保留其中一些新功能,PCA通常被用作降维技术,仅保留前几个主要成分,可以在尽可能保留差异的情况下减少所需处理的数据量。
一个简单例子:
我们一般通过找到该协方差矩阵\(\sigma=\frac{1}{n-1} \mathbf{X}^{T} \mathbf{X}\)的特征分解来给出主成分,特征向量对应于主成分方向,而每个关联的特征值均与沿该主成分的数据方差成比例。
其中PCA中计算上最复杂的步骤是执行协方差矩阵的特征分解。
既然又是特征分解,那么我们可能觉得以下行为是有帮助的:
- 将数据的协方差矩阵表示为QPU操作。
- 对此QPU操作执行相位估计,以确定其特征值。
但是这同样也有问题:
-
Quantum simulation with σ
协方差矩阵很少能满足量子模拟技术的稀疏性要求,因此我们需要一种不同的方法来找到σ的QPU运算表示。
-
Input for phase estimation
相位估计有两个输入寄存器,我们必须使用其中之一来指定要为其关联本征相位(并由此获得本征值)的本征态。但是知道σ的任何特征向量正是我们要使用QPCA解决的问题的一部分。(HHL中可以解决是因为我们有\(|b\rangle\))
解决方案:
- 用mini-SWAP来改变矩阵的稀疏性,具体见 https://arxiv.org/abs/1307.0401
- σ的密度算符表示正好是我们相位估计的输入,如果这样的话,输出就正好是编码了的特征值。
量子支持向量机
支持向量机的主要目的是找到一个超平面,把左右两类数据给隔开,并且尽可能的,让这个平面离两边数据都远远的。
通过对偶问题转换,我们可以把SVM问题变成最小二乘优化问题。
变成这个问题后,我们的问题就又一次变成如何把这个现有的问题塞到HHL的接替框架里面。