Python使用qiskit模块实现量子Dj 算法

64 篇文章 21 订阅
29 篇文章 8 订阅

Python使用qiskit模块实现量子Dj 算法

实现 Dj 算法

(这个图片确实不很好看,但是问题不大了啦啊)
在这里插入图片描述

电路图

(这个图片确实不很好看,但是问题不大了啦啊)
在这里插入图片描述

源代码展示:

# Deutsch-Jozsa 算法 的代码实现
# 原本 Deutsch-Jozsa 算法 是处理 2 的 n 次方个输入,然后判断 f(x) 是否为一个常值函数
# 但是鉴于个人能力的限制,我在此处仅以两个量子比特为例来实现 Deutsch-Jozsa 算法
# 另外,我使用的是 qiskit
# 然后我是按照图片 电路图2.png 接的线


from qiskit import (QuantumCircuit, execute, Aer)
"""
各个模块的含义:
QuantumCircuit:这个包可以看作量子系统的操作指南,它包含了各种需要的量子操作
execute:这个包用来执行量子线路
Aer:用来指定使用什么后台运行上面的线路
plot_histogram:用来创建一个直方图
"""
from qiskit.visualization import plot_histogram
# 导入 qiskit 中的所需要的相应的模块,
# 第一个导入是模拟电路所需要的模块,第二个是创建直方图需要的模块
simulator = Aer.get_backend('qasm_simulator')
# 设置我们所指定的模拟器,这里是:qasm_simulator
circuit = QuantumCircuit(2, 2)
# 初始化两个量子比特以及两个经典比特,
# 第一个参数是量子比特的个数,第二个参数是经典比特的个数
circuit.x(1)
# 将 0 量子比特设置为 |0> 状态不变, 通过 X 门使得 1 量子比特设置为 |1> 状态
circuit.h(0)
circuit.h(1)
# 对 0 量子比特 以及 1 量子比特 分别都施加一个 H 门的作用
circuit.cx(0, 1)
# 对电路作用一个 CNOT 门,
# 其中控制比特是 0 ,受控比特是 1
circuit.h(0)
circuit.h(1)
# 对 0 量子比特 以及 1 量子比特 分别都施加一个 H 门的作用
circuit.measure([0, 1], [0, 1])
# 对量子比特作用以后的结果进行观测,意思就是说:
# 第一个量子比特的观测结果存储在第一个经典比特中,
# 第二个量子比特的观测结果存放在第二个经典比特中
# measure 即为测量

job = execute(circuit, simulator, shots=1024)
# 利用 Python 中的 qiskit 内置的测试方法进行测试,execute 即就是进行仿真
result = job.result()
# 获取得到运行电路的结果
print(result)
# 打印出来结果信息

print(result.get_counts())
# 打印结果,获取到的是量子计算的结果,以及,我们所观测得到的量子状态的情况
plot_histogram(result.get_counts())
# 创建一个直方图
# 输出:
# Result(backend_name='qasm_simulator', backend_version='0.7.3', qobj_id='2a2ab672-7137-46c0-b0b4-51a0365b03b0', job_id='fbc90744-3e5d-4caf-8ca7-f35e092b2c0f', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=MeasLevel.CLASSIFIED, data=ExperimentResultData(counts={'0x3': 1024}), header=QobjExperimentHeader(clbit_labels=[['c', 0], ['c', 1]], creg_sizes=[['c', 2]], global_phase=0.0, memory_slots=2, n_qubits=2, name='circuit8', qreg_sizes=[['q', 2]], qubit_labels=[['q', 0], ['q', 1]]), status=DONE, seed_simulator=1749305044, time_taken=0.0335547, metadata={'fusion': {'enabled': False}, 'measure_sampling': True, 'method': 'stabilizer', 'parallel_shots': 1, 'parallel_state_update': 8})], date=2021-04-21T21:36:54.568448, status=COMPLETED, status=QobjHeader(backend_name='qasm_simulator', backend_version='0.7.3'), metadata={'max_memory_mb': 8106, 'omp_enabled': True, 'parallel_experiments': 1, 'time_taken': 0.0336479}, time_taken=0.03391456604003906)
# {'11': 1024}
# 运行结果分析如下:
"""

1、结果信息 

Result(backend_name='qasm_simulator', backend_version='0.7.3', qobj_id='ae404781-861b-48e4-9ae3-8553bdc75ae0', job_id='c767c5b5-8f12-45d0-9ec9-b79a8a0d249a', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=MeasLevel.CLASSIFIED, data=ExperimentResultData(counts={'0x3': 1024}), header=QobjExperimentHeader(clbit_labels=[['c', 0], ['c', 1]], creg_sizes=[['c', 2]], global_phase=0.0, memory_slots=2, n_qubits=2, name='circuit8', qreg_sizes=[['q', 2]], qubit_labels=[['q', 0], ['q', 1]]), status=DONE, seed_simulator=435590158, time_taken=0.0320486, metadata={'fusion': {'enabled': False}, 'measure_sampling': True, 'method': 'stabilizer', 'parallel_shots': 1, 'parallel_state_update': 8})], date=2021-04-21T21:43:14.767408, status=COMPLETED, status=QobjHeader(backend_name='qasm_simulator', backend_version='0.7.3'), metadata={'max_memory_mb': 8106, 'omp_enabled': True, 'parallel_experiments': 1, 'time_taken': 0.0321427}, time_taken=0.03291034698486328)
这里展示了一些运行的相关信息,比如:运行时间等。

2、获取到的运行结果信息

{'11': 1024}
这个结果表明了我们所搭建的电路一定获得到的是一个恒定值,也就是说这是一个常值函数
因为结果全为 11 => 这是一个常值函数。

"""

运行的结果的展示:

在这里插入图片描述
以上即就是一个简单的DJ算法的实现案例了啦,确实很简单,这里只是大概写了写,因为复杂的DJ(也就是多个量子比特的情况,我也还是没有想明白的啦,因此就只写了这个两位比特的量子电路,要是有大佬会完整的DJ算法的电路的话,可以考虑教一教我,那就万分感谢了啦)
最后,还是谢谢大家阅读了啦啊!!!

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hhh江月

您的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值