我报名参加金石计划1期挑战——分割10万奖池,这是我的第1篇文章,点击检查活动详情

什么是量子核算?

量子核算机的前景在于:在现有的一些规范设备上完结不了的重要核算,有望凭借量子世界的特色来完结,也即,它能极大扩展核算机处理的问题种类。

量子核算机更像 协处理器(一种芯片,用于减轻系统微处理器的特定处理使命)。

什么是QPU?

QPU,(quantum processing unit,量子处理单元),是可用于运转量子核算机代码的设备渠道(类似于传统的面向CPU、GPU编程)。

当时还没有通用的实体量子核算机设备,可是已经有了在线的量子核算模拟器。我是通过查找引擎查找“QCEngine”的,这个免费的模拟器由《量子核算机编程:从入门到实践》的作者开发。

模拟器链接:
oreilly-qc.github.io/

模拟器上限

衡量GPU的其间(不是唯一)一个指标是在其上可操作的 qubit (量子比特,或许了解为量子位)的数量。

截止我参考的这本书出版(原版不清楚,翻译本是2021.7),QPU模拟器的世界纪录是51个量子位,大众使用的一般是能处理26位。

每向示例增加一个量子位,都会使运转模拟器所需内存加倍,速度折半。

实际机器硬件上限

与传统位比较,量子位没有纠错才能,易受搅扰和不稳定。

截止该书出版,实际最大的QPU硬件能到达70物理量子位。

QPU编程的特色

(注:以下大部分表述掺杂了我个人的了解,能够说是三手材料了,主张觉得下列说法貌同实异的uu去看原版或许中文翻译本,可是出于对知识产权的保护考虑,还是加个引用号)

以下问题是GPU编程也存在的问题。

  • 一般是CPU与QPU协同运转。程序CPU上运转,宣布QPU指令,并在QPU上获取成果。
    (我的了解是它现在还要依附于现有的实体核算硬件)

  • 不是所有使命都合适QPU编程。
    (正像用多线程分解素数其实作用不大)

  • QPU的时钟机制:它通过专用的硬件接口衔接到外部设备。

  • 典型的QPU有专门地随机存储器。

  • 一块芯片、乃至是芯片上的一小块区域都能够成为QPU,不过更先进的需求大型附加设备和持续的冷却措施。

  • 核算完结时,QPU向CPU返回的是核算成果的投影(同时舍弃了大部分内部作业数据)

  • 对QPU调试的最好办法便是单行单行改程序,然后输出打印看差异。

  • 对一条QPU指令的履行速度进行优化或许会拖慢另一条指令的履行速度。

代码实践

生成随机字节

关于had()

had()对应于量子位的HAD运算(hadamard),本质上是为某个呈|0>态或|1>态的量子比特创立持平的叠加态。

  • |0>、|1>被称为狄拉克符号,表明处于叠加态时终究或许会被读取到的值;真正被读取到的值是确认的,就用纯数字表明。

量子物理定律保证了had()运算有不行猜测性,下列代码每次运转或许生成的0/1成果都不同,能够用做伪随机数生成器应用。

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

生成随机字节

qc.reset(8);
qc.write(0);
qc.had();
var result=qc.read();
qc.print(result);

运转三次,别离输出122,123,176

量子监听检测

以下代码完结一个简化的量子密钥分发(quantum key distribution,量子密码学领域的核心协议)

监听检测原理

交流一些不需求加密的传统数字信息,测试并读取量子比特的值看是否契合预期(因为监听将不行避免地破坏量子态,使其成为确认态),假如不一致,说明有人监听。

代码及解释

注:英文注释为示例代码原有,中文字是我加上的

qc.reset(3);
qc.discard();
//创立通信对象及信道
var a = qint.new(1, 'alice');
var fiber = qint.new(1, 'fiber');
var b = qint.new(1, 'bob');
function random_bit(q) {
    q.write(0);
    q.had();
    return q.read();
}
// Generate two random bits
qc.label('get two random bits');
var send_had = random_bit(a);
var send_value = random_bit(a);
qc.label('');
// Prepare Alice's qubit(只要alice自己知道,且量子位处于不确认态)
a.write(0);
qc.label('set value');
qc.nop();
//依据end_had值判别是否应用HAD
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!
//bob偶然能正确解码alice的二进制
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');

参考材料

  • 《量子核算机编程:从入门到实践》

[美] 埃里克R 约翰斯顿, [英] 尼古拉斯哈里根 著;

[西] 梅塞德丝希梅诺,[中]郑明智译

  • oreilly-qc.github.io/