量子计算机编程(一)——QPU编程

今天要给你们介绍的是这本书《Programming Quantum Computers —— Essential Algorithms and Code Samples》,主要讲如何在量子计算机上编程,又示例的代码能够跑 https://oreilly-qc.github.io./ ,这本书的理解方向是纯粹计算机的,连矩阵都不多涉及,一个量子计算机就像是协处理器同样,很像咱们如今的GPU。html

这本书一共分为三个部分,我也将分红三篇文章来写,这是第一部分QPU的编程。git

单量子比特

这本书中对于量子的表达方式以下circle notation:github

蓝色圈的面积就是这个量子态测量后是这个状态的几率,中间的蓝色短线表明他们的相位,由于全局相位也观察不出来,因此通常\(|0\rangle\)就是朝上的。对于一个量子比特来讲,重要的也就这两个,magnitude和relative phase(可能由于重要的是几率大小,因此他其实没有提amplitude实际上是一个复数)。编程

这两个态其实是等价的。app

电路图呢,通常长这样dom

这个电路图对应的代码以下:(这个例子均可以在上面那个网站上跑起来)网站

qc.reset(1);         // allocate one qubit
qc.write(0);         // write the value zero
qc.had();            // place it into superposition of 0 and 1
var result = qc.read();  // read the result as a digital bit

第一步就是申请一个qubit,就像你要给变量分配空间同样。spa

第二步写0,其实写0很容易,你能够直接测量,要么0,要么1,若是结果是1的话,再作一个not操做就好;固然,你要是嫌麻烦,对于一个qubit,长时间的静置他,他也会变成0,毕竟仍是基态比较稳定。code

第三步就是进行一个H门的操做htm

第四步读,其实就是测量了

常见的做用于单量子比特操做的表达方式:

其中值得一提的是PHASE相位操做,phase操做只做用在 \(|1\rangle\) 上,由于他的效果是改变相对相位,若是你们都改变就没有什么用了。可能有同窗据说过绕X轴旋转和绕Y轴旋转,这些都是针对Bloch球的表达方式,与这里的circle notation的方式不要弄混了。

一个操做也多是其余几个操做的组合,好比:

若是咱们能够把not变成H+180°旋转+H,那么咱们也能够把中间的180°旋转变成两个90°的旋转,中间再加上两个H,由于\(HH=I\),他们能够相互抵消,这样咱们还能够获得RNOT:

COPY:这是一个须要注意的操做,由于量子程序里没有复制,这也保障了量子传输的信息不会被窃听, 由于你要窃听,你就须要去读,一读就是测量,而量子比特一测量就是坍缩。因为量子不能复制,因此,上述全部操做都是在原有的那个比特上操做的,因此操做就会被发现。

一个简单例子:

对于这里例子来讲, \(A_1\)\(A_2\) 是对qubit Hadmard门操做后测量获得的随机值,由于这个是真随机,因此就不会被窃听者提早知道或者预估,那么当我传输这个被我用红色圈出来的比特的时候,spy并不知道这个比特是否执行了H门和not操做,那他就只能猜了,25%的几率,图里面所示就是他猜有执行了,而后他再按照他的猜想如法炮制一个qubit继续传递,当B收了这个bit后,B也随机一个数据\(B_2\),看是否执行H门,而后测量。这个时候消息也都收到了,测量也都测量好了,那么把 \(A_2\)的信息发过来也和窃听没有关系了,若是 \(B_2\) \(A_2\) 的结果同样,那么测量结果应该同样,若是不同,那么必定被窃听了。

这样的成功几率有多少呢? \(B_2\) \(A_2\) 同样的几率0.5,在这种状况下spy被发现的几率0.25。看起来不是很高,可是若是咱们有一百个比特先检测一下这条线路,不被发现的几率将会降到百万分之一。

如今来看一下代码:https://oreilly-qc.github.io/?p=2-4

qc.reset(3);//申请三个qubit
qc.discard();
var a = qint.new(1, 'alice'); //给其中一个变量命名为a,可是画出来的电路图中显示alice
var fiber = qint.new(1, 'fiber');
var b = qint.new(1, 'bob');

function random_bit(q) {//对一个初始化为0的比特,进行H操做,而后测量,测量结果是随机的
    q.write(0);
    q.had();
    return q.read();
}

// Generate two random bits
qc.label('get two random bits');
var send_had = random_bit(a);//获得是否执行H门的随机值
var send_value = random_bit(a);//获得是否not的随机值
qc.label('');

// Prepare Alice's qubit
a.write(0);//a从新赋值为0,因此前面取随机值的操做也能够在a上进行
qc.label('set value');
qc.nop();
if (send_value)
    a.not();
qc.nop();
qc.label('');
qc.nop();
qc.label('apply had');
qc.nop();
if (send_had)
    a.had();
qc.nop();
qc.label('');

// Send the qubit!
fiber.exchange(a);

// Activate the spy
var spy_is_present = true;
if (spy_is_present)
{
    var spy_had = 1;
    qc.nop();
    qc.label('spy');
    if (spy_had)
        fiber.had();
    stolen_data = fiber.read();
    fiber.write(0);
    if (stolen_data)
        fiber.not();
    if (spy_had)
        fiber.had();
    qc.label('');
    qc.nop();
}

// Receive the qubit!
var recv_had = random_bit(b);
fiber.exchange(b);
qc.label('apply had');
qc.nop();
if (recv_had)
    b.had();
qc.nop();
qc.label('');
qc.nop();
qc.label('read value');
qc.nop();
recv_val = b.read();
qc.nop();
qc.label('');
qc.nop();

// Now Alice emails Bob to tell
// him her had setting and value.
// If the had setting matches and the
// value does not, there's a spy!
if (send_had == recv_had)
    if (send_value != recv_val)
        qc.print('Caught a spy!\n');

多量子比特

多量子比特的表示方法和单量子比特没有什么区别,下面的数字就是把他们从01的二进制换算成了咱们熟悉的十进制。0x是十六进制的表示方法,最上面的是地位,正好能够not操做表示了出来,0就是000,1就是001,2就是010……以此类推

真要说和单量子比特的区别,那主要是两方面,一个是纠缠;另外一个就是受控操做。

纠缠

纠缠好说,两个纠缠的量子比特就是其中一个的测量结果会影响另外一个。

具体呢,能够看一下个人这篇文章量子纠缠1——量子比特、Bell态、EPR佯谬

受控操做

受控操做就是说有两类比特,一个是用来控制的,另外一个是被控制的。

好比你们耳熟能详的CNOT,当控制比特是1的时候,就翻转被控制的比特,若是控制比特是0的时候,那就不作操做。还有CCNOT门,又叫作toffli门,有两个控制比特,只有当他们都为1的时候才翻转。

如今要介绍一个前面没有提过的CPHASE受控相位门,和CNOT类似,一样是当控制比特为1的时候才进行,可是正如前面咱们提过,PHASE操做只操做在1上,也就是说,若是这个操做被执行其实只有一种状况,那就是\(|11\rangle\)

在前面咱们表示过一个旋转180°的相位操做能够表示成一个 H+NOT+H figure 2-14

那么如今受控相位操做拥有了三种表示方法:

当控制比特为0的时候,CNOT就不会发生,两个H又正好抵消了。

phase kickback

在这之因此说这么多的受控相位操做是由于这里面有个一颇有趣的小技巧 QPU Trick: Phase Kickback 来看下面这个电路图

这个电路图很容易理解,一种理解方式就是把register 1看成控制比特,register 2 看成受控比特,两个H门使得register 1变成了等可能的四种状况 \(\frac{1}{2}|00\rangle+\frac{1}{2}|01\rangle+\frac{1}{2}|10\rangle+\frac{1}{2}|11\rangle\)

如今来看看结果:

由于register 2并非叠加态,因此没有相对相位,而绝对相位又测不出来,因此他能够说是没有变的,改变了的,反而是register 1 , \(|3\rangle\) 转了135°是由于两个都为1,45°和90°都转了。做为一个受控操做,控制比特反而变了,而受控比特没有改变。

swap

受控操做固然也能连在一块儿,获得一些有用的结果,好比三个CNOT操做,他就能够交换两条线路。

这个的证实是一件很容易的事情,你能够取一个任意态推一边,专门把这个提出来讲一遍是由于这个还能作一件有趣的事情,那就是验证两个比特是否相等。咱们须要用到的是CSWAP,即当控制比特为1时才交换。

当咱们的output比特通过H门后,他就变成了等几率的 \(|0\rangle\)\(|1\rangle\) 通过一个CSWAP,为1状况下的input1和input2就会交换,也就是说他们原来x几率的ab就变成了x几率的ba了,这样的问题出在哪?

若是几率仍是原来的分布,那么在通过一个H门output等待率的 \(|0\rangle\)\(|1\rangle\) 又会化简成 \(|0\rangle\) ,各类各样的 \(|1\rangle\) 的几率会相互抵消掉,那么在经历一个NOT操做就必定会获得1。

那,若是这两个数据不同,就必定得不到1吗?不必定,只是他有几率不是1,而一旦有几率不是1,那只要多检测几回就必定能检测出来,就像上面那个窃听同样,明明只有四分之一的几率,但仅须要一百次,测不出来的可能性就降到了百万分之一。

固然,代码在这里https://oreilly-qc.github.io/?p=3-4,这也是这本书的特点了。

受控操做固然不止这些,可是不少受控操做均可以分解成CNOT加上一些相位操做,咱们能够本身构造本身须要的操做。

远距离操控随机

这里的远距离操控不是指我能扣肯定他是什么,若是我能肯定,那就不是随机了,而是说,我把两个比特弄成纠缠,当我一个测出来是0的时候,另外一个以x%的几率获得0,至于我测出来是否是0看天意,对面测出来是否是0,也看天意,其中惟一能肯定的,就只有这个x了。

这个例子是书上例子3-6 https://oreilly-qc.github.io/?p=3-6 方法很简单,就是我H门操做后,我旋转45°的角度,这样再来一个H门,由于相位变了,符号对不上,因此回不去了,就有了关联。

更强大的一点的应用是——量子隐形传态,量子隐形传态 Quantum Teleportation 提过了,就不在累述。

相关文章
相关标签/搜索