Grover算法试验

《量子算法与编程入门》4.3 Grover算法

量子搜索算法如何工作
https://quantum.country/search

01 grover算法在Qiskit上试验

grover.py

# grover.py
# 《量子算符与编程入门》 4.3 Grover算法
# 基于QISKit实现Grover算法
# mytoken = "mytoken"
myconfig = {
    "url": 'https://quantumexperience.ng.bluemix.net/api'
}
from IBMQuantumExperience import *

api = IBMQuantumExperience(token=mytoken, config=myconfig)

# 每行前面不要有空格和tab键
# code代码的格式要求比较严格
# 1 include "qelib1.inc" 与引号之间对多只能有一个回车换号符
code = '''include "qelib1.inc";
    qreg q[5];
    creg c[5];
    
    h q[0];
    h q[1];
    x q[2];
    h q[2];
    h q[2];
    h q[1];
    h q[2];
    cx q[2],q[1];
    h q[1];
    h q[2];
    tdg q[2];
    h q[0];
    h q[2];
    cx q[2],q[0];
    h q[0];
    h q[2];
    t q[2];
    h q[1];
    h q[2];
    cx q[2],q[1];
    h q[1];
    h q[2];
    tdg q[1];
    tdg q[2];
    h q[0];
    h q[2];
    cx q[2],q[0];
    h q[0];
    h q[2];
    h q[0];
    h q[1];
    cx q[1],q[0];
    h q[0];
    h q[1];
    t q[2];
    tdg q[1];
    h q[2];
    h q[0];
    h q[1];
    cx q[1],q[0];
    h q[0];
    h q[1];
    t q[0];
    s q[1];
    h q[0];
    h q[1];
    x q[0];
    x q[1];
    h q[1];
    h q[0];
    h q[1];
    cx q[1],q[0];
    h q[0];
    h q[1];
    x q[0];
    h q[1];
    h q[0];
    x q[1];
    measure q[0] -> c[0];
    h q[1];
    measure q[1] -> c[1];
'''
# 我申请的个人账号没有使用物理芯片的权限
# data = api.run_experiment(qasm=code, backend='ibmqx4', shots=1024, name=None, timeout=180, access_token=mytoken)
data = api.run_experiment(qasm=code, backend='simulator', shots=1024, name=None)

result = data['result']['measure']
label = result['labels']
value = result['values']
print("测量结果:")
print(label)
print("对应的概率为:")
print(value)

print("data的完整返回结果:")
print(data)

import matplotlib.pyplot as plt

plt.bar(label, value)
plt.show()

用模拟设备运行结果:

C:\Python36\python.exe D:/tmp/tensorflow/grover.py
测量结果:
['00011']
对应的概率为:
[1]
data的完整返回结果:
{'status': 'DONE', 'idExecution': '5c30a53a65bb5100566f3e2f', 'idCode': '5c30a53965bb5100566f3e2e', 'result': {'extraInfo': {'seed': 3816039801}, 'measure': {'qubits': [0, 1], 'labels': ['00011'], 'values': [1]}}}

在这里插入图片描述

在ibmqx4上的试验结果
在这里插入图片描述

02 grover算法在Liqui|>上试验

grover.fsx

#if INTERACTIVE
#r@"..\bin\Liquid1.dll"
#else
namesapce Microsoft.Research.Liquid
#endif
open System
open System.Collections.Generic
open Microsoft.Research.Liquid
open Util
open Operations

module Script=
    [<LQD>]
    let Grover() = 
        show "Grover算法"
        let ket = Ket(3)
        let qs = ket.Qubits
        X qs.Tail.Tail
        H >< qs
        CCNOT qs
        let target = !!(qs, 0, 1)
        H >< target
        X >< target
        H target.Tail
        CNOT target
        H target.Tail
        X >< target
        H >< qs
        M >< target
        for q in target do
            show "测量得到的结果是: %s"(q.ToString())

#if INTERACTIVE
do
    Script.Grover()
#endif

运行结果:

d:\git\Quantum\Liquid\Samples>fsi grover.fsx
0:0000.0/Grover算法
0:0000.0/
0:0000.0/===========================================================================================
0:0000.0/=    The Language-Integrated Quantum Operations (LIQUi|>) Simulator                       =
0:0000.0/=        Copyright (c) 2015,2016 Microsoft Corporation                                    =
0:0000.0/=        If you use LIQUi|> in your research, please follow the guidelines at             =
0:0000.0/=        https://github.com/StationQ/Liquid for citing LIQUi|> in your publications.     =
0:0000.0/===========================================================================================
0:0000.0/
0:0000.0/测量得到的结果是:                  0|0>+                 1|1>
0:0000.0/测量得到的结果是:                  0|0>+                 1|1>

03 grover算法在ProjectQ上试验

grover.py

# grover.py
# ProjectQ上Grover算法
from projectq.backends import CircuitDrawer
from projectq import MainEngine
from projectq.ops import *

def grover(eng, t):
    qs = eng.allocate_qureg(3)
    X | qs[2]
    All(H) | qs
    H |qs[2]
    CNOT | (qs[1], qs[2])
    Tdagger | qs[2]
    CNOT | (qs[0], qs[2])
    T | qs[2]
    CNOT | (qs[1], qs[2])
    Tdagger | qs[2]
    CNOT | (qs[0], qs[2])
    Tdagger | qs[1]
    T | qs[2]
    CNOT | (qs[0], qs[1])
    H | qs[2]
    Tdagger | qs[1]
    CNOT | (qs[0], qs[1])
    T | qs[0]
    S | qs[1]
    H | qs[0]
    H | qs[1]
    X | qs[0]
    X | qs[1]
    H | qs[1]
    CNOT | (qs[0], qs[1])
    H | qs[1]
    X | qs[0]
    X | qs[1]
    All(H) | qs
    All(Measure) | qs
    eng.flush()
    if t == 'simulator':
        print("执行Grover算法,检索到的元素是:" + str(int(qs[0])) + str(int(qs[1])))
    elif t == 'drawer':
        drawing_engine = CircuitDrawer()
        latex = drawing_engine.get_latex()
        circuit = open("grover.tex", 'w')
        circuit.write(latex)
        circuit.close();
    else:
        pass


if __name__ == "__main__":
    eng = MainEngine()
    types = 'simulator'
    grover(eng, types)
    drawing_engine = CircuitDrawer()
    eng = MainEngine(drawing_engine)
    types = 'drawer'
    grover(eng, types)

运行结果:

C:\Python36\python.exe D:/tmp/tensorflow/grover.py
执行Grover算法,检索到的元素是:11

Process finished with exit code 0

运行pdflatex grover.tex生成pdf没成功。

如有错误之处,欢迎批评指正。QQ群:579809480。

Grover算法是一种量子搜索算法,可以在未排序的数据库中搜索特定的条目,其复杂度为 $O(\sqrt{N})$,相较于经典算法的 $O(N)$,具有非常高的效率。Grover算法的主要思想是将数据库中特定的条目转化为量子态,并利用量子并行性进行搜索。 在Qiskit中,实现Grover算法的步骤如下: 1. 导入Qiskit库和其他必要的库。 ```python from qiskit import QuantumCircuit, Aer, execute from qiskit.visualization import plot_histogram import numpy as np ``` 2. 定义一个函数,将搜索的目标作为输入,并返回代表目标的量子态。 ```python def oracle(target, n): qc = QuantumCircuit(n) for q in range(n): if target[q] == '0': qc.x(q) qc.h(n-1) qc.mct(list(range(n-1)), n-1) qc.h(n-1) for q in range(n): if target[q] == '0': qc.x(q) return qc ``` 这个函数将目标转化为量子态,并将其标记为 $-1$。这个标记可以看作是一个“黑盒”,只有查询到这个黑盒才能知道目标的位置。 3. 定义一个函数,使用Grover算法搜索目标。 ```python def grover(target, n, num_iterations): qc = QuantumCircuit(n, n) qc.h(range(n)) for i in range(num_iterations): qc.append(oracle(target, n), range(n)) qc.h(range(n)) qc.x(range(n)) qc.h(n-1) qc.mct(list(range(n-1)), n-1) qc.h(n-1) qc.x(range(n)) qc.h(range(n)) qc.measure(range(n), range(n)) return qc ``` 这个函数使用 $H$ 门来创建一个均匀的超立方体分布,并在其上应用Grover算法迭代,以增加目标的振幅。在每次迭代中,应用Oracle和Grover反演运算。 4. 运行Grover算法,以搜索目标。 ```python target = '101' n = len(target) num_iterations = int(np.floor(np.pi/4*np.sqrt(2**n))) qc = grover(target, n, num_iterations) backend = Aer.get_backend('qasm_simulator') shots = 1024 results = execute(qc, backend=backend, shots=shots).result() answer = results.get_counts() plot_histogram(answer) ``` 这个代码片段定义了要搜索的目标,以及要搜索的位数。然后,它计算要执行的迭代次数,并在量子计算机上运行Grover算法,以搜索目标。最后,它使用Qiskit中的可视化工具绘制结果直方图。 这就是使用Qiskit实现Grover算法的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值