paddle_quantum.mbqc.qobject
此模块包含量子信息处理的常用对象,如量子态、量子电路、测量模式等。
- class State(vector, system)
基类:
object
定义量子态。
- 参数:
vector (Optional[paddle.Tensor]) – 量子态的列向量
system (Optional[list]) – 量子态的系统标签列表
- class Circuit(width)
基类:
object
定义量子电路。
- 参数:
width (int) – 电路的宽度(比特数)
警告
当前版本仅支持
H, X, Y, Z, S, T, Rx, Ry, Rz, Rz_5, U, CNOT, CNOT_15, CZ
中的量子门以及测量操作。- h(which_qubit)
添加
Hadamard
门。其矩阵形式为:
\[\begin{split}\frac{1}{\sqrt{2}}\begin{bmatrix} 1&1\\1&-1 \end{bmatrix}\end{split}\]代码示例:
from paddle_quantum.mbqc.qobject import Circuit width = 1 cir = Circuit(width) which_qubit = 0 cir.h(which_qubit) print(cir.get_circuit())
[['h', [0], None]]
- 参数:
which_qubit (int) – 作用量子门的量子位编号
- x(which_qubit)
添加
Pauli X
门。其矩阵形式为:
\[\begin{split}\begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}\end{split}\]代码示例:
from paddle_quantum.mbqc.qobject import Circuit width = 1 cir = Circuit(width) which_qubit = 0 cir.x(which_qubit) print(cir.get_circuit())
[['x', [0], None]]
- 参数:
which_qubit (int) – 作用量子门的量子位编号
- y(which_qubit)
添加
Pauli Y
门。其矩阵形式为:
\[\begin{split}\begin{bmatrix} 0 & -i \\ i & 0 \end{bmatrix}\end{split}\]代码示例:
from paddle_quantum.mbqc.qobject import Circuit width = 1 cir = Circuit(width) which_qubit = 0 cir.y(which_qubit) print(cir.get_circuit())
[['y', [0], None]]
- 参数:
which_qubit (int) – 作用量子门的量子位编号
- z(which_qubit)
添加
Pauli Z
门。其矩阵形式为:
\[\begin{split}\begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}\end{split}\]代码示例:
from paddle_quantum.mbqc.qobject import Circuit width = 1 cir = Circuit(width) which_qubit = 0 cir.z(which_qubit) print(cir.get_circuit())
[['z', [0], None]]
- 参数:
which_qubit (int) – 作用量子门的量子位编号
- s(which_qubit)
添加
S
门。其矩阵形式为:
\[\begin{split}\begin{bmatrix} 1&0\\0& i \end{bmatrix}\end{split}\]代码示例:
from paddle_quantum.mbqc.qobject import Circuit width = 1 cir = Circuit(width) which_qubit = 0 cir.s(which_qubit) print(cir.get_circuit())
[['s', [0], None]]
- 参数:
which_qubit (int) – 作用量子门的量子位编号
- t(which_qubit)
添加
T
门。其矩阵形式为:
\[\begin{split}\begin{bmatrix} 1&0\\0& e^{i\pi/ 4} \end{bmatrix}\end{split}\]代码示例:
from paddle_quantum.mbqc.qobject import Circuit width = 1 cir = Circuit(width) which_qubit = 0 cir.t(which_qubit) print(cir.get_circuit())
[['t', [0], None]]
- 参数:
which_qubit (int) – 作用量子门的量子位编号
- rx(theta, which_qubit)
添加关于 x 轴的旋转门。
其矩阵形式为:
\[\begin{split}\begin{bmatrix} \cos\frac{\theta}{2} & -i\sin\frac{\theta}{2} \\ -i\sin\frac{\theta}{2} & \cos\frac{\theta}{2} \end{bmatrix}\end{split}\]代码示例:
from paddle import to_tensor from paddle_quantum.mbqc.qobject import Circuit width = 1 cir = Circuit(width) which_qubit = 0 angle = to_tensor([1], dtype='float64') cir.rx(angle, which_qubit) print(cir.get_circuit())
[['rx', [0], Tensor(shape=[1], dtype=float64, place=CPUPlace, stop_gradient=True, [1.])]]
- 参数:
theta (paddle.Tensor) – 旋转角度
which_qubit (int) – 作用量子门的量子位编号
- ry(theta, which_qubit)
添加关于 y 轴的旋转门。
其矩阵形式为:
\[\begin{split}\begin{bmatrix} \cos\frac{\theta}{2} & -\sin\frac{\theta}{2} \\ \sin\frac{\theta}{2} & \cos\frac{\theta}{2} \end{bmatrix}\end{split}\]代码示例:
from paddle import to_tensor from paddle_quantum.mbqc.qobject import Circuit width = 1 cir = Circuit(width) which_qubit = 0 angle = to_tensor([1], dtype='float64') cir.ry(angle, which_qubit) print(cir.get_circuit())
[['ry', [0], Tensor(shape=[1], dtype=float64, place=CPUPlace, stop_gradient=True, [1.])]]
- 参数:
theta (paddle.Tensor) – 旋转角度
which_qubit (int) – 作用量子门的量子位编号
- rz(theta, which_qubit)
添加关于 z 轴的旋转门。
其矩阵形式为:
\[\begin{split}\begin{bmatrix} 1 & 0 \\ 0 & e^{i\theta} \end{bmatrix}\end{split}\]代码示例:
from paddle import to_tensor from paddle_quantum.mbqc.qobject import Circuit width = 1 cir = Circuit(width) which_qubit = 0 angle = to_tensor([1], dtype='float64') cir.rz(angle, which_qubit) print(cir.get_circuit())
[['rz', [0], Tensor(shape=[1], dtype=float64, place=CPUPlace, stop_gradient=True, [1.])]]
- 参数:
theta (paddle.Tensor) – 旋转角度
which_qubit (int) – 作用量子门的量子位编号
- rz_5(theta, which_qubit)
添加关于 z 轴的旋转门(该旋转门对应的测量模式由五个量子比特构成)。
其矩阵形式为:
\[\begin{split}\begin{bmatrix} 1 & 0 \\ 0 & e^{i\theta} \end{bmatrix}\end{split}\]代码示例:
from paddle import to_tensor from paddle_quantum.mbqc.qobject import Circuit width = 1 cir = Circuit(width) which_qubit = 0 angle = to_tensor([1], dtype='float64') cir.rz(angle, which_qubit) print(cir.get_circuit())
[['rz_5', [0], Tensor(shape=[1], dtype=float64, place=CPUPlace, stop_gradient=True, [1.])]]
- 参数:
theta (paddle.Tensor) – 旋转角度
which_qubit (int) – 作用量子门的量子位编号
- u(params, which_qubit)
添加单量子比特的任意酉门。
警告
这里的酉门采用
Rz Rx Rz
分解,其分解形式为:
\[U(\alpha, \beta, \gamma) = Rz(\gamma) Rx(\beta) Rz(\alpha)\]代码示例:
from paddle import to_tensor from numpy import pi from paddle_quantum.mbqc.qobject import Circuit width = 1 cir = Circuit(width) which_qubit = 0 alpha = to_tensor([pi / 2], dtype='float64') beta = to_tensor([pi], dtype='float64') gamma = to_tensor([- pi / 2], dtype='float64') cir.u([alpha, beta, gamma], which_qubit) print(cir.get_circuit())
[['u', [0], [Tensor(shape=[1], dtype=float64, place=CPUPlace, stop_gradient=True, [1.57079633]), Tensor(shape=[1], dtype=float64, place=CPUPlace, stop_gradient=True, [3.14159265]), Tensor(shape=[1], dtype=float64, place=CPUPlace, stop_gradient=True, [-1.57079633])]]]
- 参数:
params (List[paddle.Tensor]) – 单比特酉门的三个旋转角度
which_qubit (int) – 作用量子门的量子位编号
- cnot(which_qubits)
添加控制非门。
当
which_qubits
为[0, 1]
时,其矩阵形式为:\[\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.qobject import Circuit width = 2 cir = Circuit(width) which_qubits = [0, 1] cir.cnot(which_qubits) print(cir.get_circuit())
[['cnot', [0, 1], None]]
- 参数:
which_qubits (List[int]) – 作用量子门的量子位,其中列表第一个元素为控制位,第二个元素为受控位
- cnot_15(which_qubits)
添加控制非门(该门对应的测量模式由十五个量子比特构成)。
当
which_qubits
为[0, 1]
时,其矩阵形式为:\[\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.qobject import Circuit width = 2 cir = Circuit(width) which_qubits = [0, 1] cir.cnot_15(which_qubits) print(cir.get_circuit())
[['cnot_15', [0, 1], None]]
- 参数:
which_qubits (List[int]) – 作用量子门的量子位,其中列表第一个元素为控制位,第二个元素为受控位
- cz(which_qubits)
添加控制 Z 门。
当
which_qubits
为[0, 1]
时,其矩阵形式为:\[\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.qobject import Circuit width = 2 cir = Circuit(width) which_qubits = [0, 1] cir.cz(which_qubits) print(cir.get_circuit())
[['cz', [0, 1], None]]
- 参数:
which_qubits (List[int]) – 作用量子门的量子位,其中列表第一个元素为控制位,第二个元素为受控位
- measure(which_qubit, basis_list)
对量子电路输出的量子态进行测量。
备注
除默认的 Z 测量外,此处的测量方式可以由用户自定义,但需要将测量方式与测量比特相对应。
警告
此方法只接受三种输入方式: 1. 不输入任何参数,表示对所有的量子位进行 Z 测量; 2. 输入量子位,但不输入测量基,表示对输入的量子位进行 Z 测量; 3. 输入量子位和对应测量基,表示对输入量子位进行指定的测量。 如果用户希望自定义测量基参数,需要注意输入格式为
[angle, plane, domain_s, domain_t]
, 且当前版本的测量平面plane
只能支持XY
或YZ
。- 参数:
which_qubit (Optional[int]) – 被测量的量子位
basis_list (Optional[list]) – 测量方式
- is_valid()
检查输入的量子电路是否符合规定。
我们规定输入的量子电路中,每一个量子位上至少作用一个量子门。
- 返回:
量子电路是否符合规定的布尔值
- 返回类型:
bool
- get_width()
返回量子电路的宽度。
- 返回:
量子电路的宽度
- 返回类型:
int
- get_circuit()
返回量子电路列表。
- 返回:
量子电路列表
- 返回类型:
list
- get_measured_qubits()
返回量子电路中测量的比特位。
- 返回:
量子电路中测量的比特位列表
- 返回类型:
list
- print_circuit_list()
打印电路图的列表。
代码示例:
from paddle_quantum.mbqc.qobject import Circuit from paddle import to_tensor from numpy import pi n = 2 theta = to_tensor([pi], dtype="float64") cir = Circuit(n) cir.h(0) cir.cnot([0, 1]) cir.rx(theta, 1) cir.measure() cir.print_circuit_list()
-------------------------------------------------- Current circuit -------------------------------------------------- Gate Name Qubit Index Parameter -------------------------------------------------- h [0] None cnot [0, 1] None rx [1] 3.141592653589793 m [0] [0.0, 'YZ', [], []] m [1] [0.0, 'YZ', [], []] --------------------------------------------------
- 返回:
用来打印的字符串
- 返回类型:
string
- class Pattern(name, space, input_, output_, commands)
基类:
object
定义测量模式。
该测量模式的结构依据文献 [The measurement calculus, arXiv: 0704.1263]。
- 参数:
name (str) – 测量模式的名称
space (list) – 测量模式所有节点列表
input (list) – 测量模式的输入节点列表
output (list) – 测量模式的输出节点列表
commands (list) – 测量模式的命令列表
- class CommandE
基类:
object
定义纠缠命令类。
备注
此处纠缠命令对应作用控制 Z 门。
- 参数:
which_qubits (list) – 作用纠缠命令的两个节点标签构成的列表
- class CommandM
基类:
object
定义测量命令类。
测量命令有五个属性,分别为测量比特的标签
which_qubit
,原始的测量角度angle
,测量平面plane
,域 s 对应的节点标签列表domain_s
,域 t 对应的节点标签列表domain_t
。设原始角度为 \(\alpha\),则考虑域中节点依赖关系后的测量角度 \(\theta\) 为:\[\theta = (-1)^s \times \alpha + t \times \pi\]备注
域 s 和域 t 是 MBQC 模型中的概念,分别记录了 Pauli X 算符和 Pauli Z 算符对测量角度产生的影响,二者共同记录了该测量节点对其他节点的测量结果的依赖关系。
警告
该命令当前只支持 XY 和 YZ 平面的测量。
- 参数:
which_qubit (Any) – 作用测量命令的节点标签
angle (paddle.Tensor) – 原始的测量角度
plane (str) – 测量平面
domain_s (list) – 域 s 对应的节点标签列表
domain_t (list) – 域 t 对应的节点标签列表
- class CommandX
基类:
object
定义 Pauli X 副产品修正命令类。
- 参数:
which_qubit (Any) – 作用修正算符的节点标签
domain (list) – 依赖关系列表
- class CommandZ
基类:
object
定义 Pauli Z 副产品修正命令。
备注
此处纠缠命令对应作用控制 Z 门。
- 参数:
which_qubit (Any) – 作用修正算符的节点标签
domain (list) – 依赖关系列表
- class CommandS
基类:
object
定义“信号转移”命令类。
备注
“信号转移”是一类特殊的操作,用于消除测量命令对域 t 中节点的依赖关系,在某些情况下对测量模式进行简化。
- 参数:
which_qubit (Any) – 消除依赖关系的测量命令作用的节点标签
domain (list) – 依赖关系列表
- print_command_list()
打印该
Pattern
类中的命令的信息,便于用户查看。代码示例:
from paddle_quantum.mbqc.qobject import Circuit from paddle_quantum.mbqc.mcalculus import MCalculus n = 1 cir = Circuit(n) cir.h(0) pat = MCalculus() pat.set_circuit(cir) pattern = pat.get_pattern() pattern.print_command_list()
----------------------------------------------------------- Current Command List ----------------------------------------------------------- Command: E which_qubits: [('0/1', '0/1'), ('0/1', '1/1')] ----------------------------------------------------------- Command: M which_qubit: ('0/1', '0/1') plane: XY angle: 0.0 domain_s: [] domain_t: [] ----------------------------------------------------------- Command: X which_qubit: ('0/1', '1/1') domain: [('0/1', '0/1')] -----------------------------------------------------------