paddle_quantum.mbqc.utils

此模块包含计算所需的各种常用类和函数。

plus_state()

定义加态。

其矩阵形式为:

\[\begin{split}\frac{1}{\sqrt{2}} \begin{bmatrix} 1 \\ 1 \end{bmatrix}\end{split}\]

代码示例:

from paddle_quantum.mbqc.utils import plus_state
print("State vector of plus state: \n", plus_state().numpy())
State vector of plus state:
[[0.70710678]
 [0.70710678]]
返回:

加态对应的 Tensor 形式

返回类型:

paddle.Tensor

minus_state()

定义减态。

其矩阵形式为:

\[\begin{split}\frac{1}{\sqrt{2}} \begin{bmatrix} 1 \\ -1 \end{bmatrix}\end{split}\]

代码示例:

from paddle_quantum.mbqc.utils import minus_state
print("State vector of minus state: \n", minus_state().numpy())
State vector of minus state:
[[ 0.70710678]
 [-0.70710678]]
返回:

减态对应的 Tensor 形式

返回类型:

paddle.Tensor

zero_state()

定义零态。

其矩阵形式为:

\[\begin{split}\begin{bmatrix} 1 \\ 0 \end{bmatrix}\end{split}\]

代码示例:

from paddle_quantum.mbqc.utils import zero_state
print("State vector of zero state: \n", zero_state().numpy())
State vector of zero state:
[[1.]
 [0.]]
返回:

零态对应的 Tensor 形式

返回类型:

paddle.Tensor

one_state()

定义一态。

其矩阵形式为:

\[\begin{split}\begin{bmatrix} 0 \\ 1 \end{bmatrix}\end{split}\]

代码示例:

from paddle_quantum.mbqc.utils import one_state
print("State vector of one state: \n", one_state().numpy())
State vector of one state:
[[0.]
 [1.]]
返回:

一态对应的 Tensor 形式

返回类型:

paddle.Tensor

h_gate()

定义 Hadamard 门。

其矩阵形式为:

\[\begin{split}\frac{1}{\sqrt{2}} \begin{bmatrix} 1 & 1 \\ 1 & -1 \end{bmatrix}\end{split}\]

代码示例:

from paddle_quantum.mbqc.utils import h_gate
print("Matrix of Hadamard gate: \n", h_gate().numpy())
Matrix of Hadamard gate:
[[ 0.70710678  0.70710678]
 [ 0.70710678 -0.70710678]]
返回:

Hadamard 门对应矩阵的 Tensor 形式

返回类型:

paddle.Tensor

s_gate()

定义 S 门。

其矩阵形式为:

\[\begin{split}\begin{bmatrix} 1 & 0 \\ 0 & i \end{bmatrix}\end{split}\]

代码示例:

from paddle_quantum.mbqc.utils import s_gate
print("Matrix of S gate:\n", s_gate().numpy())
Matrix of S gate:
[[1.+0.j 0.+0.j]
 [0.+0.j 0.+1.j]]
返回:

S 门矩阵对应的 Tensor 形式

返回类型:

paddle.Tensor

t_gate()

定义 T 门。

其矩阵形式为:

\[\begin{split}\begin{bmatrix} 1 & 0 \\ 0 & e^{i \pi / 4} \end{bmatrix}\end{split}\]

代码示例:

from paddle_quantum.mbqc.utils import t_gate
print("Matrix of T gate: \n", t_gate().numpy())
Matrix of T gate:
[[1.        +0.j         0.        +0.j        ]
 [0.        +0.j         0.70710678+0.70710678j]]
返回:

T 门矩阵对应的 Tensor 形式

返回类型:

paddle.Tensor

cz_gate()

定义 Controlled-Z 门。

其矩阵形式为:

\[\begin{split}\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & -1 \end{bmatrix}\end{split}\]

代码示例:

from paddle_quantum.mbqc.utils import cz_gate
print("Matrix of CZ gate: \n", cz_gate().numpy())
Matrix of CZ gate:
[[ 1.  0.  0.  0.]
 [ 0.  1.  0.  0.]
 [ 0.  0.  1.  0.]
 [ 0.  0.  0. -1.]]
返回:

Controlled-Z 门矩阵对应的 Tensor 形式

返回类型:

paddle.Tensor

cnot_gate()

定义 Controlled-NOT (CNOT) 门。

其矩阵形式为:

\[\begin{split}\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{bmatrix}\end{split}\]

代码示例:

from paddle_quantum.mbqc.utils import cnot_gate
print("Matrix of CNOT gate: \n", cnot_gate().numpy())
Matrix of CNOT gate:
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 0. 1.]
 [0. 0. 1. 0.]]
返回:

Controlled-NOT (CNOT) 门矩阵对应的 Tensor 形式

返回类型:

paddle.Tensor

swap_gate()

定义 SWAP 门。

其矩阵形式为:

\[\begin{split}\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}\end{split}\]

代码示例:

from paddle_quantum.mbqc.utils import swap_gate
print("Matrix of Swap gate: \n", swap_gate().numpy())
Matrix of Swap gate:
[[1. 0. 0. 0.]
 [0. 0. 1. 0.]
 [0. 1. 0. 0.]
 [0. 0. 0. 1.]]
返回:

SWAP 门矩阵对应的 Tensor 形式

返回类型:

paddle.Tensor

pauli_gate(gate)

定义 Pauli 门。

单位阵 I 的矩阵形式为:

\[\begin{split}\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}\end{split}\]

Pauli X 门的矩阵形式为:

\[\begin{split}\begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}\end{split}\]

Pauli Y 门的矩阵形式为:

\[\begin{split}\begin{bmatrix} 0 & - i \\ i & 0 \end{bmatrix}\end{split}\]

Pauli Z 门的矩阵形式为:

\[\begin{split}\begin{bmatrix} 1 & 0 \\ 0 & - 1 \end{bmatrix}\end{split}\]

代码示例:

from paddle_quantum.mbqc.utils import pauli_gate
I = pauli_gate('I')
X = pauli_gate('X')
Y = pauli_gate('Y')
Z = pauli_gate('Z')
print("Matrix of Identity gate: \n", I.numpy())
print("Matrix of Pauli X gate: \n", X.numpy())
print("Matrix of Pauli Y gate: \n", Y.numpy())
print("Matrix of Pauli Z gate: \n", Z.numpy())
Matrix of Identity gate:
[[1. 0.]
 [0. 1.]]
Matrix of Pauli X gate:
[[0. 1.]
 [1. 0.]]
Matrix of Pauli Y gate:
[[ 0.+0.j -0.-1.j]
 [ 0.+1.j  0.+0.j]]
Matrix of Pauli Z gate:
[[ 1.  0.]
 [ 0. -1.]]
参数:

gate (str) – Pauli 门的索引字符,”I”, “X”, “Y”, “Z” 分别表示对应的门

返回:

Pauli 门对应的矩阵

返回类型:

paddle.Tensor

rotation_gate(gate)

定义旋转门矩阵。

\[ \begin{align}\begin{aligned}R_{x}(\theta) = \cos(\theta / 2) I - i\sin(\theta / 2) X\\R_{y}(\theta) = \cos(\theta / 2) I - i\sin(\theta / 2) Y\\R_{z}(\theta) = \cos(\theta / 2) I - i\sin(\theta / 2) Z\end{aligned}\end{align} \]

代码示例:

from numpy import pi
from paddle import to_tensor
from paddle_quantum.mbqc.utils import rotation_gate

theta = to_tensor([pi / 6], dtype='float64')
Rx = rotation_gate('x', theta)
Ry = rotation_gate('y', theta)
Rz = rotation_gate('z', theta)
print("Matrix of Rotation X gate with angle pi/6: \n", Rx.numpy())
print("Matrix of Rotation Y gate with angle pi/6: \n", Ry.numpy())
print("Matrix of Rotation Z gate with angle pi/6: \n", Rz.numpy())
Matrix of Rotation X gate with angle pi/6:
[[0.96592583+0.j         0.        -0.25881905j]
 [0.        -0.25881905j 0.96592583+0.j        ]]
Matrix of Rotation Y gate with angle pi/6:
[[ 0.96592583+0.j -0.25881905+0.j]
 [ 0.25881905+0.j  0.96592583+0.j]]
Matrix of Rotation Z gate with angle pi/6:
[[0.96592583-0.25881905j 0.        +0.j        ]
 [0.        +0.j         0.96592583+0.25881905j]]
参数:
  • axis (str) – 旋转轴,绕 X 轴旋转输入 ‘x’,绕 Y 轴旋转输入 ‘y’,绕 Z 轴旋转输入 ‘z’

  • theta (paddle.Tensor) – 旋转的角度

返回:

旋转门对应的矩阵

返回类型:

paddle.Tensor

to_projector(vector)

把列向量转化为密度矩阵(或测量基对应的投影算符)。

\[|\psi\rangle \to |\psi\rangle\langle\psi|\]

代码示例:

from paddle_quantum.mbqc.utils import zero_state, plus_state
from paddle_quantum.mbqc.utils import to_projector

zero_proj = to_projector(zero_state())
plus_proj = to_projector(plus_state())
print("The projector of zero state: \n", zero_proj.numpy())
print("The projector of plus state: \n", plus_proj.numpy())
The projector of zero state:
[[1. 0.]
 [0. 0.]]
The projector of plus state:
[[0.5 0.5]
 [0.5 0.5]]
参数:

vector (paddle.Tensor) – 量子态列向量(或投影测量中的测量基向量)

返回:

密度矩阵(或测量基对应的投影算符)

返回类型:

paddle.Tensor

basis(label, theta)

测量基。

备注

常用的测量方式有 XY-平面测量,YZ-平面测量,X 测量,Y 测量,Z 测量。

\[\begin{split}\begin{align*} & M^{XY}(\theta) = \{R_{z}(\theta)|+\rangle, R_{z}(\theta)|-\rangle\}\\ & M^{YZ}(\theta) = \{R_{x}(\theta)|0\rangle, R_{x}(\theta)|1\rangle\}\\ & X = M^{XY}(0)\\ & Y = M^{YZ}(\pi / 2) = M^{XY}(-\pi / 2)\\ & Z = M_{YZ}(0) \end{align*}\end{split}\]

代码示例:

from numpy import pi
from paddle import to_tensor
from paddle_quantum.mbqc.utils import basis
theta = to_tensor(pi / 6, dtype='float64')
YZ_plane_basis = basis('YZ', theta)
XY_plane_basis = basis('XY', theta)
X_basis = basis('X')
Y_basis = basis('Y')
Z_basis = basis('Z')
print("Measurement basis in YZ plane: \n", YZ_plane_basis)
print("Measurement basis in XY plane: \n", XY_plane_basis)
print("Measurement basis of X: \n", X_basis)
print("Measurement basis of Y: \n", Y_basis)
print("Measurement basis of Z: \n", Z_basis)
Measurement basis in YZ plane:
 [Tensor(shape=[2, 1], dtype=complex128, place=CPUPlace, stop_gradient=True,
       [[(0.9659258262890683+0j)],
        [-0.25881904510252074j  ]]),
  Tensor(shape=[2, 1], dtype=complex128, place=CPUPlace, stop_gradient=True,
       [[-0.25881904510252074j  ],
        [(0.9659258262890683+0j)]])]
Measurement basis in XY plane:
 [Tensor(shape=[2, 1], dtype=complex128, place=CPUPlace, stop_gradient=True,
       [[(0.6830127018922193-0.1830127018922193j)],
        [(0.6830127018922193+0.1830127018922193j)]]),
  Tensor(shape=[2, 1], dtype=complex128, place=CPUPlace, stop_gradient=True,
       [[ (0.6830127018922193-0.1830127018922193j)],
        [(-0.6830127018922193-0.1830127018922193j)]])]
Measurement basis of X:
 [Tensor(shape=[2, 1], dtype=float64, place=CPUPlace, stop_gradient=True,
       [[0.70710678],
        [0.70710678]]),
  Tensor(shape=[2, 1], dtype=float64, place=CPUPlace, stop_gradient=True,
       [[ 0.70710678],
        [-0.70710678]])]
Measurement basis of Y:
 [Tensor(shape=[2, 1], dtype=complex128, place=CPUPlace, stop_gradient=True,
       [[(0.5-0.5j)],
        [(0.5+0.5j)]]),
  Tensor(shape=[2, 1], dtype=complex128, place=CPUPlace, stop_gradient=True,
       [[ (0.5-0.5j)],
        [(-0.5-0.5j)]])]
Measurement basis of Z:
 [Tensor(shape=[2, 1], dtype=float64, place=CPUPlace, stop_gradient=True,
       [[1.],
        [0.]]),
  Tensor(shape=[2, 1], dtype=float64, place=CPUPlace, stop_gradient=True,
       [[0.],
        [1.]])]
参数:
  • label (str) – 测量基索引字符,”XY” 表示 XY-平面测量,”YZ” 表示 YZ-平面测量,”X” 表示 X 测量,”Y” 表示 Y 测量,”Z” 表示 Z 测量

  • theta (Optional[paddle.Tensor]) – 测量角度,这里只有 XY-平面测量和 YZ-平面测量时需要

返回:

测量基向量构成的列表,列表元素为 Tensor 类型

返回类型:

List[paddle.Tensor]

kron(tensor_list)

把列表中的所有元素做张量积。

\[[A, B, C, \cdots] \to A \otimes B \otimes C \otimes \cdots\]

代码示例 1:

from paddle import to_tensor
from paddle_quantum.mbqc.utils import pauli_gate, kron
tensor0 = pauli_gate('I')
tensor1 = to_tensor([[1, 1], [1, 1]], dtype='float64')
tensor2 = to_tensor([[1, 2], [3, 4]], dtype='float64')
tensor_list = [tensor0, tensor1, tensor2]
tensor_all = kron(tensor_list)
print("The tensor product result: \n", tensor_all.numpy())
The tensor product result:
[[1. 2. 1. 2. 0. 0. 0. 0.]
 [3. 4. 3. 4. 0. 0. 0. 0.]
 [1. 2. 1. 2. 0. 0. 0. 0.]
 [3. 4. 3. 4. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 2. 1. 2.]
 [0. 0. 0. 0. 3. 4. 3. 4.]
 [0. 0. 0. 0. 1. 2. 1. 2.]
 [0. 0. 0. 0. 3. 4. 3. 4.]]

代码示例 2:

from paddle_quantum.mbqc.utils import pauli_gate, kron
tensor0 = pauli_gate('I')
tensor_list = [tensor0]
tensor_all = kron(tensor_list)
print("The tensor product result: \n", tensor_all.numpy())
The tensor product result:
[[1. 0.]
[0. 1.]]
参数:

tensor_list (List[paddle.Tensor]) – 需要做张量积的元素组成的列表

返回:

所有元素做张量积运算得到的 Tensor,当列表中只有一个 Tensor 时,返回该 Tensor 本身

返回类型:

paddle.Tensor

permute_to_front(state, which_system)

将一个量子态中某个子系统的顺序变换到最前面。

假设当前系统的量子态列向量 \(\psi\rangle\) 可以分解成多个子系统列向量的 tensor product 形式:

\[|\psi\rangle = |\psi_1\rangle \otimes |\psi_2\rangle \otimes |\psi_3\rangle \otimes \cdots\]

每个 \(|\psi_i\rangle\) 的系统标签为 \(i\) ,则当前总系统的标签为:

\[\text{label} = \{1, 2, 3, \cdots \}\]

假设需要操作的子系统的标签为:i

输出新系统量子态的列向量为:

\[|\psi_i\rangle \otimes |\psi_1\rangle \otimes \cdots |\psi_{i-1}\rangle \otimes |\psi_{i+1}\rangle \otimes \cdots\]
参数:
  • state (State) – 需要操作的量子态

  • which_system (str) – 要变换到最前面的子系统标签

返回:

系统顺序变换后的量子态

返回类型:

State

permute_systems(state, new_system)

变换量子态的系统到指定顺序。

假设当前系统的量子态列向量 \(|\psi\rangle\) 可以分解成多个子系统列向量的 tensor product 形式:

\[|\psi\rangle = |\psi_1\rangle \otimes |\psi_2\rangle \otimes |\psi_3\rangle \otimes \cdots\]

每个 \(\psi_i\rangle\) 的系统标签为 \(i\) ,则当前总系统的标签为:

\[\text{label} = \{1, 2, 3, \cdots \}\]

给定新系统的标签顺序为:

\[\{i_1, i_2, i_3, \cdots \}\]

输出新系统量子态的列向量为:

\[|\psi_{i_1}\rangle \otimes |\psi_{i_2}\rangle \otimes |\psi_{i_3}\rangle \otimes \cdots\]
参数:
  • state (State) – 需要操作的量子态

  • new_system (list) – 目标系统顺序

返回:

系统顺序变换后的量子态

返回类型:

State

compare_by_density(state1, state2)

通过密度矩阵形式比较两个量子态是否相同。

参数:
  • state1 (State) – 第一个量子态

  • state2 (State) – 第二个量子态

compare_by_vector(state1, state2)

通过列向量形式比较两个量子态是否相同。

参数:
  • state1 (State) – 第一个量子态

  • state2 (State) – 第二个量子态

random_state_vector(n, is_real)

随机生成一个量子态列向量。

代码示例:

from paddle_quantum.mbqc.utils import random_state_vector
random_vec = random_state_vector(2)
print(random_vec.numpy())
random_vec = random_state_vector(1, is_real=True)
print(random_vec.numpy())
[[-0.06831946+0.04548425j]
 [ 0.60460088-0.16733175j]
 [ 0.39185213-0.24831266j]
 [ 0.45911355-0.41680807j]]
[[0.77421121]
 [0.63292732]]
参数:
  • n (int) – 随机生成的量子态的比特数

  • is_real (Optional[bool]) – True 表示实数量子态,False 表示复数量子态,默认为 False

返回:

随机生成量子态的列向量

返回类型:

paddle.Tensor

div_str_to_float(div_str)

将除式字符串转化为对应的浮点数。

例如将字符串 ‘3/2’ 转化为 1.5。

代码示例:

from paddle_quantum.mbqc.utils import div_str_to_float
division_str = "1/2"
division_float = div_str_to_float(division_str)
print("The corresponding float value is: ", division_float)
The corresponding float value is:  0.5
参数:

div_str (str) – 除式字符串

返回:

除式对应的浮点数结果

返回类型:

float

int_to_div_str(idx1, idx2)

将两个整数转化为除式字符串。

代码示例:

from paddle_quantum.mbqc.utils import int_to_div_str
one = 1
two = 2
division_string = int_to_div_str(one, two)
print("The corresponding division string is: ", division_string)
The corresponding division string is:  1/2
参数:
  • idx1 (int) – 第一个整数

  • idx2 (int) – 第二个整数

返回:

对应的除式字符串

返回类型:

str

画出当前步骤的进度条。

代码示例:

from paddle_quantum.mbqc.utils import print_progress
print_progress(14/100, "Current Progress")
Current Progress              |■■■■■■■                                           |   14.00%
参数:
  • current_progress (float) – 当前的进度百分比

  • progress_name (str) – 当前步骤的名称

  • track (bool) – 是否绘图的布尔开关

返回:

对应的除式字符串

返回类型:

str

plot_results(dict_lst, bar_label, title, xlabel, ylabel, xticklabels)

根据字典的键值对,以键为横坐标,对应的值为纵坐标,画出柱状图。

备注

该函数主要调用来画出采样分布或时间比较的柱状图。

参数:
  • dict_lst (list) – 待画图的字典列表

  • bar_label (list) – 每种柱状图对应的名称

  • title (str) – 整个图的标题

  • xlabel (str) – 横坐标的名称

  • ylabel (str) – 纵坐标的名称

  • xticklabels (Optional[list]) – 柱状图中每个横坐标的名称

write_running_data(textfile, eg, width, mbqc_time, reference_time)

写入电路模拟运行的时间。

由于在许多电路模型模拟案例中,需要比较我们的 MBQC 模拟思路与 Qiskit 或量桨平台的电路模型模拟思路的运行时间。因而单独定义了写入文件函数。

提示

该函数与 read_running_data 函数配套使用。

警告

在调用该函数之前,需要调用 open 打开 textfile;在写入结束之后,需要调用 close 关闭 textfile

参数:
  • textfile (TextIOWrapper) – 待写入的文件

  • eg (str) – 当前案例的名称

  • width (float) – 电路宽度(比特数)

  • mbqc_time (float) – MBQC 模拟电路运行时间

  • reference_time (flaot) – Qiskit 或量桨平台的 UAnsatz 电路模型运行时间

write_running_data(file_name)

读取电路模拟运行的时间。

由于在许多电路模型模拟案例中,需要比较我们的 MBQC 模拟思路与 Qiskit 或量桨平台的电路模型模拟思路的运行时间。因而单独定义了读取文件函数读取运行时间,将其处理为一个列表,列表中的两个元素分别为 Qiskit 或量桨平台的 UAnsatz 电路模型模拟思路的运行时间

提示

该函数与 write_running_data 函数配套使用。

参数:

file_name (str) – 待读取的文件名

返回:

运行时间列表

返回类型:

list