什么是量子计算?

什么是量子计算?

量子计算机的前景在于:在现有的一些标准设备上完成不了的重要计算,有望借助量子世界的特点来完成,也即,它能极大扩展计算机处理的问题种类。

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

什么是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· 约翰斯顿 , [英] 尼古拉斯·哈里根 著;

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


作者:逐光而行
链接:https://juejin.cn/post/7143166650051723271
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值