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 只能支持 XYYZ

参数:
  • 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')]
-----------------------------------------------------------