本文首发于稀土掘金。该平台的作者 逐光而行 也是本人。
什么是量子计算?
量子计算机的前景在于:在现有的一些标准设备上完成不了的重要计算,有望借助量子世界的特点来完成,也即,它能极大扩展计算机处理的问题种类。
量子计算机更像 协处理器(一种芯片,用于减轻系统微处理器的特定处理任务)。
什么是QPU?
QPU,(quantum processing unit,量子处理单元),是可用于运行量子计算机代码的设备平台(类似于传统的面向CPU、GPU编程)。
当前还没有通用的实体量子计算机设备,但是已经有了在线的量子计算模拟器。我是通过搜索引擎搜索“QCEngine”的,这个免费的模拟器由《量子计算机编程:从入门到实践》的作者开发。
模拟器链接:
https://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· 约翰斯顿 , [英] 尼古拉斯·哈里根 著;
[西] 梅塞德丝·希梅诺,[中]郑明智译
- https://oreilly-qc.github.io/