qrisp.q_matmul#

q_matmul(q_array_0, q_array_1, output_array=None, res_bit_shape='eq', phase_tolerant=False)[source]#

Matrix multiplication for QuantumArrays.

Parameters:
q_array_0QuantumArray

The first factor of the matrix multiplication.

q_array_1QuantumArray

The second factor of the matrix multiplication.

output_arrayQuantumArray, optional

The QuantumArray to store the results in. By default, a new QuanumArray is created.

res_bit_shapestr or QuantumFloat, optional

Specification of the dimension of the output bitshape of the output QuantumArray. Possible are “eq”, which will take the bitshape equal two the first factor, “safe” which automatically determines the bitshape such that there can be no overflow, or a QuantumFloat which has the desired bitshape. The default is “eq”.

phase_tolerantbool, optional

If set to True, the required gate count is reduced but each constellation of computational basis states of the inputs will introduce a different phase. This is helpful when it’s clear that this function will be at some point uncomputed, resulting in the cancelation of these phases. The default is False.

Returns:
resQuantumArray

The result of the matrix multiplication.

Raises:
Exception

Tried to perform matrix multiplication with differing contraction index size.

Examples

We multiply a QuantumArray with a multiply of the identity matrix (np.eye):

>>> import numpy as np
>>> from qrisp import QuantumFloat, QuantumArray, q_matmul
>>> qf = QuantumFloat(4,0, signed = False)
>>> q_arr_0 = QuantumArray(qf, shape = (2,2))
>>> q_arr_1 = QuantumArray(qf, shape = (2,2))
>>> q_arr_0[:] = [[1,2],[3,4]]
>>> q_arr_1[:] = 2*np.eye(2)
>>> res = q_matmul(q_arr_0, q_arr_1)
>>> print(res)
{OutcomeArray([[2, 4],
               [6, 8]]): 1.0}