量子计算机编程(一)——QPU编程
量子计算机编程(二)——QPU基础函数
量子计算机编程(三)——量子应用html
量子编程一层层搭建,最后是应用层git
都到应用了,确定会涉及数据,本节内容主要包括,量子数据、量子搜索、量子超级采样、Shor算法、量子机器学习。github
和数据有关的讨论通常围绕在两个方面,存储和表示。算法
本书没有讨论QRAM如何制造,只是提了用法。
编程
和普通的QRAM有一个重要区别,地址也能够是叠加态。框架
小数:咱们能够借鉴经典的手法,就像经典里面如何表达浮点数的同样,咱们也这样来表述量子的小数,\(Q_{n.m}\)n位的数据,其中m位是小数,(n-m)位是整数。机器学习
向量: [0,1,2,3]这个向量要怎么表示?函数
最基础的:
很容易理解,可是也很浪费空间,没有用到量子自身的特性。学习
amplitude encoding for vectors:
优化
这个就利用了量子的性质,不过他也有本身的局限性:
矩阵:
总体思路是用opertate来表示矩阵:
不过这里有两个限制:operator只能unitary的,矩阵不只不必定是unitary,都不必定是hermitian的。解决方案以下:
不是hermitian的矩阵,能够构建成hermitian,经过 \(H=\left[\begin{array}{ll}0 & X \\ X^{\dagger} & 0\end{array}\right]\)
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各来一张图就好。
因数分解究竟在作什么,你们能够看一眼这个 因数分解算法、周期查找算法(简化)
默认你们看完有了大概了解,如今来看一个具体例子:因数分解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 拿到周期后计算因数
前面两个步骤结束后就是红色箭头这里,如今量子态的状态以下:
这一步是用来计算\(2^x\),任何的二进制寄存器均可经过简单的移位实现2的乘积(或者其实是2的任何幂)。在咱们的例子中,每一个量子位都与下一个最高加权位置交换。须要注意的是咱们将只使用精度寄存器的两个最低权重的量子位来表示x的值(这意味着x能够取值0、一、二、3),线路为图上iter0
线路为图上iter1,目前咱们已经获得了\(a^x\),对于咱们考虑过的特定示例,咱们的电路设法自动处理模数。
乘2和乘4后量子态的状态以下:
测量,咱们测量的结果多是0、四、八、12中的任意一个,他们是等几率25%
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
在这里咱们将要介绍三种QML应用:线性方程组的求解,量子主成分分析和量子支持向量机。
线性方程很容易变成矩阵乘法的形式\(\overrightarrow{\mathbf{A}} \vec{x}=\vec{b}\) ,求解线性方程也就是\(\vec{x}=\mathbf{A}^{-1} \vec{b}\)
而HHL提供了一种比共轭梯度降低法更快地方式来找矩阵的逆。
Scratch register 也就是辅助比特包含由HHL中的各类基元使用的许多临时量子位,全部临时量子位均以“ 0”状态准备。由于HHL处理定点(或浮点)数据而且涉及非平凡的算术运算(例如取平方根),因此咱们须要大量的临时qubit。即便最简单的状况,这也使得HHL难以仿真。
固然若是咱们获得了叠加态\(|x\rangle\),也不是里面每个数据都能读出来,可是在有的状况下,咱们并不须要里面的每个值,好比:
这个算法的时间复杂度是\(O\left(x^{2} s^{2} \epsilon^{-1} \log n\right)\)
HHL算法适合于求解由稀疏,条件良好的矩阵表示的线性方程组。
那具体HHL又是怎么作的呢是怎么作到的?
HHL的灵感来自特征值分解来得到矩阵逆的信息,一个栗子:
\[A=\left|\begin{array}{ll} 2 & 2 \\ 2 & 3 \end{array}\right|, \quad \vec{z}=\left|\begin{array}{l} 1 \\ 0 \end{array}\right|\]
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]\)
在量子以前,先了解一下什么是PAC,PCA一般用做预处理步骤,能够将一组输入的特征转换为新的、不相关的集合。 PCA产生的不相关功能能够根据它们编码的数据差别量进行排序。经过仅保留其中一些新功能,PCA一般被用做降维技术,仅保留前几个主要成分,能够在尽量保留差别的状况下减小所需处理的数据量。
一个简单例子:
咱们通常经过找到该协方差矩阵\(\sigma=\frac{1}{n-1} \mathbf{X}^{T} \mathbf{X}\)的特征分解来给出主成分,特征向量对应于主成分方向,而每一个关联的特征值均与沿该主成分的数据方差成比例。
其中PCA中计算上最复杂的步骤是执行协方差矩阵的特征分解。
既然又是特征分解,那么咱们可能以为如下行为是有帮助的:
可是这一样也有问题:
Quantum simulation with σ
协方差矩阵不多能知足量子模拟技术的稀疏性要求,所以咱们须要一种不一样的方法来找到σ的QPU运算表示。
Input for phase estimation
相位估计有两个输入寄存器,咱们必须使用其中之一来指定要为其关联本征相位(并由此得到本征值)的本征态。可是知道σ的任何特征向量正是咱们要使用QPCA解决的问题的一部分。(HHL中能够解决是由于咱们有\(|b\rangle\))
解决方案:
支持向量机的主要目的是找到一个超平面,把左右两类数据给隔开,而且尽量的,让这个平面离两边数据都远远的。
经过对偶问题转换,咱们能够把SVM问题变成最小二乘优化问题。
变成这个问题后,咱们的问题就又一次变成如何把这个现有的问题塞到HHL的接替框架里面。