【量子计算机编程】(一)量子计算机简介+QPU编程初体验

简介: 什么是量子计算?量子计算机的前景在于:在现有的一些标准设备上完成不了的重要计算,有望借助量子世界的特点来完成,也即,它能极大扩展计算机处理的问题种类。
本文首发于稀土掘金。该平台的作者 逐光而行 也是本人。

什么是量子计算?

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

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

什么是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/
相关文章
|
27天前
|
存储 人工智能 算法
计算机编程:从基础到实践,探索编程的奥秘
计算机编程:从基础到实践,探索编程的奥秘
15 1
|
2月前
|
算法 量子技术 C#
量子编程入门:从基础到实践
【5月更文挑战第26天】本文引导读者入门量子编程,从量子比特、量子门和量子算法的基础概念,到量子编程语言和量子模拟器的工具介绍,再到编写、运行和调试量子程序的实践步骤。通过学习和实践,开发者可以逐渐掌握量子编程,为未来的量子计算应用打下基础。随着量子计算技术的发展,量子编程将在更多领域展现其潜力。
|
2月前
|
机器学习/深度学习 算法 新能源
未来编程之光:量子计算入门
【5月更文挑战第30天】 随着科技的迅猛发展,量子计算作为一颗冉冉升起的新星,正在改变我们对数据处理和计算能力的认知。本文将引导读者走进量子计算的世界,探索其基本原理、当前的应用现状以及面临的挑战,旨在为有志于深入了解和参与量子计算领域的技术人员提供一份入门指南。文章不仅介绍了量子位、量子叠加与纠缠等核心概念,还涉及了量子算法和量子编程语言的最新动态,为读者描绘出一个充满潜力的未来技术蓝图。
|
2月前
|
机器学习/深度学习 存储 人工智能
未来编程:量子计算与量子编程语言的兴起
【5月更文挑战第30天】 在经典计算模型日趋成熟的今天,量子计算以其潜在的超强并行处理能力和对特定问题的高效解决策略成为科技前沿的新宠。本文将探讨量子计算的基础原理、目前的技术挑战以及量子编程语言的发展现状。我们将分析量子编程与传统编程的根本差异,并展望未来量子编程如何可能引领技术革命。
|
数据可视化 Ubuntu 算法
量子程序设计基础 | 基于Python的量子程序设计
IBM量子程序开发套件的安装。
110 2
|
算法 TensorFlow 定位技术
量子程序设计基础 | 量子计算简史
量子革命和量子计算发展简史。
135 0
量子程序设计基础 | 量子计算简史
|
存储 量子技术
量子计算入门:量子计算机的理解与术语科普(二)
量子计算入门:量子计算机的理解与术语科普
227 0
|
存储 算法 量子技术
量子计算入门:量子计算机的理解与术语科普(一)
量子计算入门:量子计算机的理解与术语科普
260 0
|
安全 Java Linux
【C++要笑着学】认识C++ | C++的发展史 | 学习方法建议
在学习C++之前,对C++有一些了解还是有必要的。知己知彼,百战不殆!本章将讲述什么是C++,带着大家聊一聊C++的发展史。本专栏文章默认认为读者是已经学过C语言,并且对数据结构的一小部分知识有简单了解,建议在正式开启学习C++之前,可以复习一下C语言相关的知识。
299 0
【C++要笑着学】认识C++ | C++的发展史 | 学习方法建议
|
算法 安全 架构师
软件编程概念与入门
软件编程概念与入门 1.概要 2 项目开发流程 3.编程提升