我报名参加金石计划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/