量子算子¶
PennyLane 支持多种量子算子——例如门、噪声通道、状态准备和测量。这些算子可以在量子函数中使用,以下面的示例所示:
import pennylane as qml
def my_quantum_function(x, y):
qml.RZ(x, wires=0)
qml.CNOT(wires=[0,1])
qml.RY(y, wires=1)
qml.AmplitudeDamping(0.1, wires=0)
return qml.expval(qml.PauliZ(1))
这个量子函数使用了 RZ,
CNOT,
RY 门,以及
AmplitudeDamping
噪声信道和
PauliZ 可观测量。
应用于算符的函数提取信息(例如矩阵表示)或转换算符(如将一个门转变为受控门)。
PennyLane 支持以下运算符和运算符函数:
操作符函数¶
可以使用各种函数和变换来操作算子并提取信息。这些可以分为两个主要类别:
操作符到操作符的函数¶
|
创建一个算子的伴随或一个应用所提供的函数伴随的函数。 |
|
创建一个方法,该方法应用所提供操作的受控版本。 |
|
量子兼容的if-else条件 --- 基于中途电路量子比特测量结果等参数对量子操作进行条件处理。 |
|
取一个算子的指数乘以一个系数。 |
|
构造一个运算符,它是给定运算符的总和。 |
|
将运算符提升到一个幂。 |
|
构造一个表示所提供算子的广义乘积的算子。 |
|
构造一个算子,该算子是给定标量和提供的算子的标量积。 |
|
返回操作的生成器。 |
|
根据给定的线图更改操作符、录音带、量子节点或量子函数的连接线。 |
|
返回 |
|
此方法被调用,其功能取决于输入 |
|
通过减少算术深度或旋转参数的数量,简化操作符、胶带、量子节点或量子函数。 |
这些运算符函数作用于运算符以产生新的运算符。
>>> op = qml.prod(qml.PauliX(0), qml.PauliZ(1))
>>> op = qml.sum(qml.Hadamard(0), op)
>>> op = qml.s_prod(1.2, op)
>>> op
1.2 * (H(0) + X(0) @ Z(1))
操作符与其他函数¶
|
一个操作或量子电路的矩阵表示。 |
|
一个或多个操作的特征值。 |
|
检查两个操作是否通过查找表进行交换。 |
|
检查该操作是否是厄米的。 |
|
检查操作是否为单位算子。 |
|
执行迭代量子相位估计电路。 |
这些运算符函数作用于运算符并返回其他数据类型。
所有运算符函数都可以在实例化的运算符上使用。
>>> op = qml.RX(0.54, wires=0)
>>> qml.matrix(op)
[[0.9637709+0.j 0. -0.26673144j]
[0. -0.26673144j 0.9637709+0.j ]]
某些运算符函数也可以以函数形式使用:
>>> x = torch.tensor(0.6, requires_grad=True)
>>> matrix_fn = qml.matrix(qml.RX)
>>> matrix_fn(x, wires=0)
tensor([[0.9553+0.0000j, 0.0000-0.2955j],
[0.0000-0.2955j, 0.9553+0.0000j]], grad_fn=<StackBackward0>)
在函数形式下,它们通常对门控参数可微分:
>>> loss = torch.real(torch.trace(matrix_fn(x, wires=0)))
>>> loss.backward()
>>> x.grad
tensor(-0.2955)
一些算子变换也可以作用于多个算子,方法是传递量子函数、QNodes或录音带:
>>> def circuit(theta):
... qml.RX(theta, wires=1)
... qml.Z(wires=0)
>>> qml.matrix(circuit)(np.pi / 4)
array([[ 0.92387953+0.j, 0.+0.j , 0.-0.38268343j, 0.+0.j],
[ 0.+0.j, -0.92387953+0.j, 0.+0.j, 0. +0.38268343j],
[ 0. -0.38268343j, 0.+0.j, 0.92387953+0.j, 0.+0.j],
[ 0.+0.j, 0.+0.38268343j, 0.+0.j, -0.92387953+0.j]])
矩阵到算子函数¶
|
将一个厄米矩阵分解为保利算子的线性组合。 |
|
实现矩阵或哈密顿量 |
这些函数接受一个矩阵并返回一个相关的本地 Pennylane 操作符。
例如:
>>> mat = np.array([[1, 1], [1, -1]])
>>> h = qml.pauli_decompose(mat)
>>> type(h)
pennylane.ops.op_math.linear_combination.LinearCombination
>>> print(h)
1.0 * X(0) + 1.0 * Z(0)
量子比特算子¶
非参数化门¶
身份运算符 |
|
哈达玛算子 |
|
保利X算子 |
|
保利Y算符 |
|
保利 Z 算子 |
|
单量子比特相位门 |
|
单量子比特 T 门 |
|
单量子比特平方根X算子。 |
|
受控非门运算符 |
|
受控-Z算子 |
|
受控-Y算子 |
|
受控Hadamard算子 |
|
交换算符 |
|
i-swap算符 |
|
一个回声RZX(\(\pi/2\))门。 |
|
i-swap算子的平方根。 |
|
受控交换算子 |
|
托福利(控制-控制-X)门。 |
|
应用一个受到任意计算基态控制的保利X门。 |
|
障碍算子,用于将编译过程分为块或作为可视化工具。 |
|
线切割操作,用于手动标记线切割的位置。 |
参数化门¶
任意单量子比特旋转 |
|
单量子比特X旋转 |
|
单量子比特 Y 旋转 |
|
单个量子比特Z旋转 |
|
任意多重 Z 旋转。 |
|
任意保利字旋转。 |
|
任意单量子比特局部相位移 |
|
一个量子比特控制的相位移。 |
|
别名: |
|
一个投影仪控制的相位门。 |
|
一个量子比特控制的相位移。 |
|
一个量子比特控制的相位移。 |
|
一个量子比特控制的相位移。 |
|
受控RX算子 |
|
受控RY算子 |
|
受控-RZ算子 |
|
受控旋转算子 |
|
U1门。 |
|
U2 门。 |
|
任意单量子比特幺正算子。 |
|
伊辛 XX 耦合门 |
|
伊辛 (XX + YY) 耦合门 |
|
伊辛YY耦合门 |
|
伊辛ZZ耦合门 |
|
相位交换门 |
|
一个全局相位操作,将状态的所有分量乘以\(e^{-i \phi}\)。 |
量子化学门¶
单重激发旋转。 |
|
在旋转子空间外进行具有正相位移的单激发旋转。 |
|
旋转子空间外具有负相位偏移的单重激发旋转。 |
|
双激发旋转。 |
|
在旋转子空间外进行带正相移的双激发旋转。 |
|
在旋转子空间外进行负相移的双激发旋转。 |
|
自旋适应的空间轨道旋转。 |
|
费米子SWAP旋转。 |
使用OpenFermion工具独立构建的电子哈密顿量可以通过import_operator()函数轻松转换为PennyLane可观察量。
由矩阵构建的门¶
应用一个维度为二的幂的任意单位矩阵。 |
|
将任意固定的单位操作应用于 |
|
应用一个任意的对角单位矩阵,其维度是二的幂。 |
|
来自群体 \(SU(N)\) 的门,具有 \(N=2^n\),适用于 \(n\) 个量子比特。 |
|
构造一个酉 \(U(A)\),使任意矩阵 \(A\) 编码在左上角块中。 |