跳到内容

Qiskit入门

如您所料,问#并不是唯一的语言或框架为开发量子算法。有相当多的今天,每个国家都有自己的怪癖和特性。

在本节中,我们将向你们介绍一个非常受欢迎的一个用于这一领域:IBM的量子信息科学工具,或Qiskit

相比问#

与QDK附带自己的quantum-specific语言问#,Qiskit完全是一个工具包Python发展。创建算法、运行测试和调试都是做与Qiskit Python。

在高级别上,Qiskit问#操作在一个相当类似的方法。大部分的代码是在创建寄存器,运行量子量子位的说明,最后和测量的东西。然而,两者之间有一些根本性的差异:

  • 问#:
    • 在问#,量子程序是一系列的静态操作没有全局状态。他们执行statement-by-statement所以很容易设置一个断点,检查所有的状态,当你完成。
    • 问#伴随控制关键词让你运行逆和arbitrarily-controlled版本的量子操作非常。
    • 问#让你衡量一个量子位的计算(量子工作完成之前)和使用测量任意经典代码。
    • 在问#,你运行一个完整的电路。如果你想要多个测量输出,你必须模拟整个事情每次输出。
    • 问#“内存管理”,所以你可以任意量子比特进行分配和释放,当你认为合适的程序。
    • 股票问#安装只运行在本地量子模拟器。
  • Qiskit:
    • 在Qiskit,量子程序实际上是对象被称为电路。大部分的程序构建电路对象——实际上运行它是作为一个单独的步骤完成的。
    • 因为它是Python,电路构建代码完全访问程序的全局状态,任何你想要的其他Python库用于经典的数据处理。
    • Qiskit没有运行任意一个内置的方式控制版本的量子门或子例程。你必须手动构建它们。
    • Measuring-in-the-middle有些支持,但Qiskit只允许您运行其他量子操作的控制模式(使用测量的控制)。它不会让你测量,然后运行任意的经典代码基于程序的中间结果。
    • Qiskit,你所要做的所有的量子位元的“内存管理”自己。一旦你分配一个量子位,你不能“重新分配地址”,所以你必须处理再利用女仆量子位手动最小化量子位使用您的程序的数量。(从好的方面说,这意味着你不喜欢必须回报他们\ \(刃{0}\)状态当你完成他们,如果你知道你在做什么)。
    • Qiskit全后端系统允许您指定如何运行一个电路对象:你可以在你当地的模拟器,运行它在一个更强大的基于云的模拟器,或者即使在一个基于云计算的真正的量子计算机!这使得Qiskit研究之间的差异的一个很好的工具理论实现一个算法,实用一个真正的机器上使用它。然而,调试程序使它有点困难,因为你不能断点的执行(模拟器),检查一切。
    • Qiskit模拟器允许您构建和模拟电路一次,然后样品测量很多次无需re-simulate这整件事。这是一个更快的方式大量测量结果建立一个最终状态的统计分布。

最后,一旦你熟悉Qiskit语义,很容易翻译之间来回和Q #(和任何其他量子框架订阅circuit-gate-register模型)。你在这门课学到的一切使用Qiskit时仍然是完全适用的。事实上,我们倾向于使用这些框架都在我们自己的量子软件一起工作。

Qiskit的基础知识

Qiskit开发人员写了大量的文档,向人们介绍量子计算和Qiskit同时进行。事实上,他们有一个完整的在线教科书专用的。然而,我们已经覆盖了许多的这些概念。而不是做一个回顾,我们将向您展示如何使用Qiskit构建和运行量子电路使用你已经知道的东西。

先决条件

本教程假设您已经安装了Python和Qiskit。类包附带的虚拟机已经设置。如果你自己的机器上运行,请遵循安装说明在继续之前。

准备一个量子电路

任何东西之前,你要首先导入适当的模块和类:

qiskit进口QuantumCircuit,ClassicalRegister,QuantumRegisterqiskit进口执行qiskit进口爱尔兰
  • QuantumCircuit类代表一个完整的量子电路对象,包括量子比特和盖茨涉及应用于这些量子位。
  • QuantumRegister类代表一个量子寄存器,一个量子位元的集合。
  • ClassicalRegister类代表一个“经典”注册,这基本上意味着经典比特的集合,可以存储测量量子位的结果。
  • 执行是一个函数,允许您运行一个量子电路一旦你建立它。
  • 爱尔兰用于创建一个本地模拟器运行电路。

接下来,你要做的就是定义一个QuantumRegister对象与量子位它需要的数量。对于所有意图和目的,你可以把它像一个量子位元的固定大小的列表。如果你计划来衡量这些量子位,您还想创建一个ClassicalRegister相同的大小。在这个例子中,我们使用三量子位的大小:

量子比特=QuantumRegister(3)测量=ClassicalRegister(3)

现在创建一个新的QuantumCircuit对象包含这些寄存器,对量子比特和任何操作:

电路=QuantumCircuit(量子比特,测量)

让我们创建的第一个例子复杂的叠加部分。提醒一下,这个电路有以下执行:

这是如何实现这个Qiskit电路:

电路h(量子比特(0])电路h(量子比特(1])电路芝加哥气候交易所(量子比特(0),量子比特(1),量子比特(2])

这里有几件事来分解:

  1. 量子门方法QuantumCircuit类,在问#与自由浮动的静态方法。
  2. 他们的语法在很大程度上是相同的;h ()阿达玛门,芝加哥气候交易所()CCNOT门,等等。
  3. 量子操作的顺序是相同的在问# Qiskit,所以实际电路本身应该翻译相对容易。

请注意

你也可以应用这些盖茨整个寄存器而不是单个量子位;例如,circuit.h(量子比特)将H门适用于所有量子位的吗量子比特登记。

盖茨Qiskit支持的完整列表,看看他们电路库文档

如果我们想要测量量子比特,我们可以做的测量()方法:

电路测量(量子比特,测量)

这将衡量每个量子位量子比特登记,并将导致相应的古典的测量登记。

我们也可以打印一个ASCII版本的电路图,并将其用于调试:

打印(电路)

这将生成以下输出程序运行时:

这张照片你可以很快告诉如果你实现它应该是,或者如果你犯了一个错误。最后注意测量盖茨——这些不是在原来的线路图。

执行一个量子电路

一旦你完成了构建电路对象,您就可以执行它了。这意味着你寄Qiskit之一的后端系统,要么是模拟的,真正的量子计算机上执行,或以其它方式处理,提供有用的分析。现在,我们将展示如何在本地模拟电路。别担心,我们会得到真正的机器上执行。

模拟电路非常简单执行以下行:

模拟器=爱尔兰get_backend(“aer_simulator”)模拟=执行(电路,模拟器,照片=1000年)结果=模拟结果()

照片参数(当使用模拟器)描述了许多随机抽样从最终statevector。在本例中,它设置为1000样本。自模拟器能够跟踪statevector没有崩溃的叠加(因为所有存储经典),Qiskit整个电路将模拟一次,然后随机测量每个量子位多次你想没有任何性能损失。这是比问#的工作方式不同,每执行,你可以只测量一次。

结果对象包含所有的仿真结果。有很多在这个对象上获取的数据,但是大多数时候我们只需要看哪些状态测量,和每个州有多少出现。

这里有一个快速的描述方法:

计数=结果get_counts(电路)(measured_state,)计数项目():# Qiskit会给你在低位优先的形式在默认情况下,如果你想#把它变成大端法,反向big_endian_state=measured_state(::- - - - - -1]打印(f“测量{big_endian_state}{}次。”)

get_counts ()方法提供了一个字典的键是测量状态,和值是多少次测量相应的状态。可以看到从上面的评论Qiskit将返回美国在低位优先模式下默认情况下,但他们可以轻松地逆转,转换成高位优先如果你喜欢。

整个程序运行会产生下面的输出:

测量了000 284次。测量了111 230次。测量了010 247次。测量了100 239次。

这正是我们所期望的,第一个和第二个量子位都有50%的机会被测量为独立0或1,但当它们都是1,第三个量子位是1。

Arbitrarily-Controlled盖茨和女仆量子位

现在您已经了解了电路构建和运行的过程,让我们来做一个例子。对于这一颗来说,我们将使用第三电路复杂的叠加部分:

一开始很容易:

电路h(量子比特(0])电路h(量子比特(1])电路x(量子比特(2])

然而,有一个问题CCZ门口。Qiskit没有CCZ操作,它并没有提供一种运行一个门在控制模式与任意数量的控制量子比特。为了达到这个目标,我们要建立我们自己的实现。

幸运的是,我们可以开始与CZ Qiskit提供门。从概念上讲,简单的方法是创建一个女仆量子位将翻转当所有的控件在原始CCZ门翻转,然后使用助手CZ门的控制。

我们可以完成这迅速通过创建一个随从,然后使用CCX门口,最后使用该CZ的控制:

附属品=QuantumRegister(1,“附属品”)电路add_register(附属品)电路芝加哥气候交易所(量子比特(0),量子比特(1),附属品)电路cz(附属品,量子比特(2])

如果我们有更多的控制量子比特,说一个Z 4管制,我们必须使用所谓的扩展这种技术Toffoli级联如下所示:

从本质上讲,我们刚刚创建的梯子CCX盖茨创建单个量子位可以作为一个聚合控制量子位任意门。当然,我们跑,门后,我们必须撤销级联。这是一项昂贵的操作,但它揭示了一个有趣的事情框架:Qiskit往往让你思考底层实现细节你的代码,而问#更多的设计高层和抽象。

运行Qiskit例子

帮助您熟悉Qiskit,我们提供了一些例子与实验室练习。如果你打开你可以看到它们QiskitExercises项目在解决方案资源管理器。在顶层是一个文件命名qiskit_reference.py它包含的几个例子Qiskit代码实现所有三个电路复杂的叠加部分。

运行它,打开一个命令提示符访问Python和Qiskit。如果你使用了这个类的虚拟机,您可以在开始菜单中找到这个标签Miniconda提示。这将启动的蟒蛇环境包含在Visual Studio。我们已经创建了一个Conda环境Qiskit安装(如上Qiskit中描述的安装说明)你可以用下面的命令激活:

conda激活qiskit-env

一旦你这样做,导航到类包文件夹,进入练习/ QiskitExercises目录中。

你可以用这个命令运行参考文件:

python qiskit_reference.py

上面,它会产生输出示例1的线路图的复杂叠加部分,其次是1000次迭代的测量结果。

改变的例子是运行,滚动到的底部qiskit_reference.py文件在Visual Studio和修改以下代码:

#代码跑-改变下面的方法来运行一个不同的例子如果__name__= =“__main__ ':#评论这条线和取消注释以下行上本地运行电路模拟器run_example_on_simulator(example_1)#取消注释这一行和评论上面的一个真正的量子机器上运行电路# run_example_on_hardware (example_1)

改变example_1你想要哪个例子,或添加自己的代码并运行它来实验。

实验室12和13

接下来的两个实验室运行的一些算法你已经建成,所以你可以问#和Qiskit之间的一些翻译练习:

  • 实验室12是叫做deutsch - jozsa算法
  • 实验室13是Grover的算法

你会发现这些的的代码练习\ QiskitExercises在文件夹中,权利qiskit_reference.py文件。

在这些实验室运行每个运动,头部的QiskitExercises \测试文件夹Qiskit终端。

实验室12,运行以下命令:

python lab12tests。py Lab12Tests.test_exercise_1

取代test_exercise_1与每一个运动你想测试的数量。

对于实验室13个,下面的命令将让你运行每个运动的测试:

python lab13tests。py Lab13Tests.test_exercise_1

同样,取代test_exercise_1与运动的名字你想要测试的进展。

看看这两个实验室在继续之前。你可以参考实现的问#实验室;这些实验室只是为了给你一个感觉Qiskit语义和不是教你这些算法是如何工作的。


最后更新:2021年6月29日