密度矩阵

对于一些低量子比特系统而言,能够展示整个系统的量子态分布、密度矩阵分布或者Bloch轨迹,对于算法研究有很大帮助。 pyqpanda提供了类似的功能接口。

对于量子态,可以通过 state_to_density_matrix 转化为密度矩阵,参数是 量子态数组 ,可以参考如下示例。

state_to_density_matrix(quantum_state)

该函数用于将量子态转换为密度矩阵。

参数:

quantum_state (list of complex numbers) -- 要转换的量子态,以复数列表形式表示。

返回:

密度矩阵。

返回类型:

numpy.ndarray

抛出:

RuntimeError -- 如果输入不是有效的量子态。

一个简单的例子:

from pyqpanda import *
import numpy as np

machine = CPUQVM()
machine.init_qvm()
qubits = machine.qAlloc_many(3)

prog = QProg()
prog << X(qubits[0:2])\
    << Z(qubits[:2])\
    << H(qubits[:])

machine.directly_run(prog)
state = machine.get_qstate()
density_matrix = state_to_density_matrix(state)
print(density_matrix)

输出结果如下:

[[ 0.125+0.j -0.125-0.j -0.125-0.j  0.125+0.j  0.125+0.j -0.125-0.j
-0.125-0.j  0.125+0.j]
[-0.125+0.j  0.125+0.j  0.125+0.j -0.125+0.j -0.125+0.j  0.125+0.j
0.125+0.j -0.125+0.j]
[-0.125+0.j  0.125+0.j  0.125+0.j -0.125+0.j -0.125+0.j  0.125+0.j
0.125+0.j -0.125+0.j]
[ 0.125+0.j -0.125-0.j -0.125-0.j  0.125+0.j  0.125+0.j -0.125-0.j
-0.125-0.j  0.125+0.j]
[ 0.125+0.j -0.125-0.j -0.125-0.j  0.125+0.j  0.125+0.j -0.125-0.j
-0.125-0.j  0.125+0.j]
[-0.125+0.j  0.125+0.j  0.125+0.j -0.125+0.j -0.125+0.j  0.125+0.j
0.125+0.j -0.125+0.j]
[-0.125+0.j  0.125+0.j  0.125+0.j -0.125+0.j -0.125+0.j  0.125+0.j
0.125+0.j -0.125+0.j]
[ 0.125+0.j -0.125-0.j -0.125-0.j  0.125+0.j  0.125+0.j -0.125-0.j
-0.125-0.j  0.125+0.j]]

量子态分布

如果需要打印量子态的分布,可以使用 plot_state_city 接口,函数定义如下

plot_state_city(quantum_state, title='', figsize=None, color=None, ax_real=None, ax_imag=None)

该函数用于绘制量子态的立体分布图。

参数:
  • quantum_state (list of complex) -- 要绘制城市图的量子态,应为复数列表。

  • title (str, optional) -- 图的标题,默认为空字符串。

  • figsize (tuple, optional) -- 图的尺寸,格式为 (宽度, 高度),默认为 None。

  • color (str, optional) -- 图的颜色设置,默认为 None。

  • ax_real (matplotlib.axes.Axes, optional) -- 用于绘制实部的 Matplotlib 坐标轴,默认为 None。

  • ax_imag (matplotlib.axes.Axes, optional) -- 用于绘制虚部的 Matplotlib 坐标轴,默认为 None。

返回:

Matplotlib 图形对象。

返回类型:

matplotlib.figure.Figure

使用示例:

from pyqpanda import *
import numpy as np

machine = CPUQVM()
machine.set_configure(50, 50)
machine.init_qvm()
q = machine.qAlloc_many(4)
c = machine.cAlloc_many(4)
prog = QProg()
prog.insert(X(q[1]))\
    .insert(T(q[0]))\
    .insert(RX(q[1], np.pi/2))\
    .insert(RZ(q[0], np.pi/4))
machine.directly_run(prog)
result = machine.get_qstate()
plot_state_city(result)
machine.finalize()

终端会通过matplot绘制具体的量子态分布如下

../_images/plot_state_city.png

对于密度矩阵,我们可以通过 plot_density_matrix 来打印密度矩阵,函数定义如下:

plot_density_matrix(M, xlabels=None, ylabels=None, title=None, limits=None, phase_limits=None, fig=None, axis_vals=None, threshold=None)

该函数用于绘制给定量子态的密度矩阵图像,以直观地呈现量子态的结构和性质。

参数:
  • M (list of complex) -- 要绘制的量子态的复数列表(密度矩阵)。密度矩阵是量子力学中描述量子态的矩阵表示,包含了量子态的全部信息。

  • xlabels (list, optional) -- 用于自定义X轴标签的列表。每个标签对应密度矩阵的一列。默认为 None。

  • ylabels (list, optional) -- 用于自定义Y轴标签的列表。每个标签对应密度矩阵的一行。默认为 None。

  • title (str, optional) -- 图像的标题,用于指明图像的主题或特定含义。默认为 None。

  • limits (tuple, optional) -- 图像的显示范围,可控制颜色的映射范围。默认为 None。

  • phase_limits (tuple, optional) -- 相位的显示范围,用于调整相位颜色的映射范围。默认为 None。

  • fig (matplotlib.figure.Figure, optional) -- Matplotlib图像对象,用于在现有图像上绘制。默认为 None。

  • axis_vals (list, optional) -- 自定义轴的值,用于更改轴上的刻度值。默认为 None。

  • threshold (float, optional) -- 阈值,用于控制在图像中隐藏低于此值的元素。默认为 None。

返回:

Matplotlib图像对象,呈现了量子态的密度矩阵图像。

返回类型:

matplotlib.figure.Figure

使用示例:

from pyqpanda import *
import numpy as np

machine = CPUQVM()
machine.set_configure(50, 50)
machine.init_qvm()
q = machine.qAlloc_many(4)
c = machine.cAlloc_many(4)
prog = QProg()
prog.insert(X(q[1]))\
    .insert(H(q[0]))\
    .insert(H(q[1]))\
    .insert(T(q[2]))\
    .insert(RX(q[1], np.pi/2))\
    .insert(RY(q[3], np.pi/3))\
    .insert(RZ(q[0], np.pi/4))\
    .insert(RZ(q[1], np.pi))\
    .insert(RZ(q[2], np.pi))\
    .insert(RZ(q[3], np.pi))
machine.directly_run(prog)
result = machine.get_qstate()
rho = state_to_density_matrix(result)
plot_density_matrix(rho)
machine.finalize()

终端会通过matplot绘制具体的密度矩阵分布如下:

../_images/state_to_density_matrix.png

Bloch球轨迹

对于单个比特而言,有些情况下我们需要研究它的Bloch球运动轨迹,这个功能可以通过 plot_bloch_circuit 接口,函数定义如下:

plot_bloch_circuit(circuit, trace=True, saveas=None, fps=20, secs_per_gate=1)

该函数用于绘制一个量子线路的 Bloch 球视图,仅支持单量子比特。

参数:
  • circuit (QuantumCircuit) -- 要绘制的量子线路。

  • trace (bool, optional) -- 是否显示 Bloch 球轨迹。默认为 True。

  • saveas (str, optional) -- 保存图像的文件路径。默认为 None。

  • fps (int, optional) -- 动画的帧率。默认为 20。

  • secs_per_gate (int, optional) -- 每个门操作的显示时间(秒)。默认为 1。

返回:

Bloch 球视图的图像。

返回类型:

Figure

使用代码示例:

from pyqpanda import *
import numpy as np

machine = CPUQVM()
machine.set_configure(50, 50)
machine.init_qvm()
q = machine.qAlloc_many(2)
c = machine.cAlloc_many(2)
cir = QCircuit()
cir.insert(RX(q[0], np.pi/2)) \
    .insert(RZ(q[0], np.pi / 2)) \
    .insert(RZ(q[0], np.pi/6))\
    .insert(RY(q[0], np.pi/3))\
    .insert(RX(q[0], np.pi/9))
plot_bloch_circuit(cir)
machine.finalize()

终端会动态展示单个量子比特线路的Bloch轨迹如下:

../_images/bolch_cir.jpg

概率分布

在运行一个量子线路得到概率分布后,可以通过 draw_probabilitydraw_probability_dict 绘制具体的概率分布, 他们的区别是第一个函数参数是dict类型,包含量子态二进制表示与对应的概率,另一个函数参数是list,表示量子态概率数组,运行示例如下:

draw_probability(probability_dict)

该函数用于绘制量子态概率分布的字典。

参数:

probability_dict (dict) -- 要绘制的量子态概率分布字典,其中键是量子态,值是概率值。

返回:

无返回值。

返回类型:

None

一个简单的例子如下:

from pyqpanda import *

machine = CPUQVM()
machine.init_qvm()
qubits = machine.qAlloc_many(3)

prog = QProg()
prog << Z(qubits[0])\
    << X1(qubits[1])\
    << H(qubits[:2])

machine.directly_run(prog)
result_dict = machine.prob_run_dict(prog, qubits, -1)
draw_probability_dict(result_dict)
machine.finalize()

绘制的概率分布图如下:

../_images/draw_probability_dict.png