cirq.linalg.targeted_left_multiply

Left-multiplies the given axes of the target tensor by the given matrix.

Note that the matrix must have a compatible tensor structure.

For example, if you have an 6-qubit state vector input_state with shape (2, 2, 2, 2, 2, 2), and a 2-qubit unitary operation op with shape (2, 2, 2, 2), and you want to apply op to the 5'th and 3'rd qubits within input_state, then the output state vector is computed as follows:

output_state = cirq.targeted_left_multiply(op, input_state, [5, 3])

This method also works when the right hand side is a matrix instead of a vector. If a unitary circuit's matrix is old_effect, and you append a CNOT(q1, q4) operation onto the circuit, where the control q1 is the qubit at offset 1 and the target q4 is the qubit at offset 4, then the appended circuit's unitary matrix is computed as follows:

new_effect = cirq.targeted_left_multiply(
    left_matrix=cirq.unitary(cirq.CNOT).reshape((2, 2, 2, 2)),
    right_target=old_effect,
    target_axes=[1, 4])

left_matrix What to left-multiply the target tensor by.
right_target A tensor to carefully broadcast a left-multiply over.
target_axes Which axes of the target are being operated on.
out The buffer to store the results in. If not specified or None, a new buffer is used. Must have the same shape as right_target.

The output tensor.