qml.exp¶
-
exp
(op, coeff=1, num_steps=None, id=None)[source]¶ Take the exponential of an Operator times a coefficient.
- Parameters
base (Operator) – The Operator to be exponentiated
coeff (float) – a scalar coefficient of the operator
num_steps (int) – The number of steps used in the decomposition of the exponential operator, also known as the Trotter number. If this value is None and the Suzuki-Trotter decomposition is needed, an error will be raised.
id (str) – id for the Exp operator. Default is None.
- Returns
An
Operator
representing an operator exponential.- Return type
Exp
Note
This operator supports a batched base, a batched coefficient and a combination of both:
>>> op = qml.exp(qml.RX([1, 2, 3], wires=0), coeff=4) >>> qml.matrix(op).shape (3, 2, 2) >>> op = qml.exp(qml.RX(1, wires=0), coeff=[1, 2, 3]) >>> qml.matrix(op).shape (3, 2, 2) >>> op = qml.exp(qml.RX([1, 2, 3], wires=0), coeff=[4, 5, 6]) >>> qml.matrix(op).shape (3, 2, 2)
But it doesn’t support batching of operators:
>>> op = qml.exp([qml.RX(1, wires=0), qml.RX(2, wires=0)], coeff=4) AttributeError: 'list' object has no attribute 'batch_size'
Example
This symbolic operator can be used to make general rotation operators:
>>> x = np.array(1.23) >>> op = qml.exp(qml.X(0), -0.5j * x) >>> qml.math.allclose(op.matrix(), qml.RX(x, wires=0).matrix()) True
This can even be used for more complicated generators:
>>> t = qml.X(0) @ qml.X(1) + qml.Y(0) @ qml.Y(1) >>> isingxy = qml.exp(t, 0.25j * x) >>> qml.math.allclose(isingxy.matrix(), qml.IsingXY(x, wires=(0,1)).matrix()) True
If the coefficient is purely imaginary and the base operator is Hermitian, then the gate can be used in a circuit, though it may not be supported by the device and may not be differentiable.
>>> @qml.qnode(qml.device('default.qubit', wires=1)) ... def circuit(x): ... qml.exp(qml.X(0), -0.5j * x) ... return qml.expval(qml.Z(0)) >>> print(qml.draw(circuit)(1.23)) 0: ──Exp─┤ <Z>
If the base operator is Hermitian and the coefficient is real, then the
Exp
operator can be measured as an observable:>>> obs = qml.exp(qml.Z(0), 3) >>> @qml.qnode(qml.device('default.qubit', wires=1)) ... def circuit(): ... return qml.expval(obs) >>> circuit() tensor(20.08553692, requires_grad=True)