# How to implement non-unitary operator in qiskit?

I am trying to make a operator for S-Box for AES. The matrix is non-unitary. When I use Operator command for declaring it as a function. It gives error, the matrix is non-unitary. Thus, the qiskit does not allow non-unitary operators to be implemented. Is there any way to implement the non-unitary operator in qiskit or cirq etc?

• Sep 14 at 6:30

There are several ways to apply a classical function in quantum computing. Here, I think you're interested in one of the following two.

The first one is the standard oracle: $$U_f|x,y\rangle=|x,y\oplus f(x)\rangle$$ where $$\oplus$$ is the bitwise-XOR. This is the most common, as it allows to apply quantum functions even if they're not bijective.

However, there's another type of oracle, called erasing oracle or minimal oracle: $$V_f|x\rangle=|f(x)\rangle$$ Because of the requirement of unitarity, in order to use this oracle the function must be injective (though bijective is easier).

The thing is, the AES S-BOX is bijective, since it is essentially a lookup table with unique values. Since it takes an 8-bit number and returns another 8-bit number, you can build a $$2^8\times2^8$$ matrix where the first column is all $$0$$ except in $$S(0)=$$0x63$$=99$$, the second column is all zeros except in $$S(1)=$$0x7c$$=124$$, etc...

You can then apply this matrix, which is unitary since it's a permutation matrix, which corresponds in this case to an erasing oracle.

The standard oracle is a bit different, but similar in the process. You take a $$2^{16}\times2^{16}$$ matrix, where the $$256x+y$$ column is all zeros except in $$256x+(y\oplus S(x)$$, for all $$x$$ and $$y$$ being between $$0$$ and $$255$$ included. Once again, it is unitary since it's a permutation matrix.

As a side note, you probably don't want to implement the actual AES in Qiskit. AES' state being 128-bit long, you'd need a $$2^{128}$$ statevector to represent it with Qiskit, which clearly won't fit in your computer memory, not to mention the $$2^{128}\times2^{128}$$ matrices you'd have to apply. These numbers are for an erasing oracle, while you probably want a standard one in order to apply Grover's algorithm, in which case replace the $$2^{128}$$ by $$2^{256}$$.

Thus, you probably want to design an "AES" that acts on very small states, where a case of your state is only represented on 1 bit or two. This would still allow you to understand how you could implement such a function in Qiskit.

• thankyou, actually i am just doing it for a 8-qubit code, which i will repeat multiple times to complete a 256 bit input. So, the S-box is 8x8 but no-unitary, Now, i have used linear GF for constructing a unitary S-box (which i check by multiplying s-box matrix with its transpose) but the qiskit Operator commands gives error still. claiming its a non-unitary matrix. Sep 15 at 6:58
• @SyedShahmirKazmi Can you pour the code you've used to create this matrix in your question, along with how you try to append it to your circuit? Sep 15 at 7:38