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\]
- 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\]
- compare_by_density(state1, state2)
通过密度矩阵形式比较两个量子态是否相同。
- compare_by_vector(state1, state2)
通过列向量形式比较两个量子态是否相同。
- 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
- print_progress(current_progress, progress_name, track)
画出当前步骤的进度条。
代码示例:
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