Understanding how to create Toffoli gate using Blueqat

beef_and_rice

Takumi Kato

Posted on May 20, 2019

Understanding how to create Toffoli gate using Blueqat

What is Blueqat?

Blueqat is an open source library for quantum computer.
https://github.com/Blueqat/Blueqat

How to install Blueqat?

Blueqat is provided as Python (ver 3.6+) library. You can install by pip.

pip install blueqat
Enter fullscreen mode Exit fullscreen mode

What is Toffoli gate?

Toffoli gate is 2-controlled NOT gate. If both 2 control qubits are |1>, Toffoli gate flip a target qubit (|0> → |1>, |1> →|0>), otherwise do nothing.

Truth table for Toffoli gate

c1 c2 t
0 0 0 → 0
0 0 1 → 1
0 1 0 → 0
0 1 1 → 1
1 0 0 → 0
1 0 1 → 1
1 1 0 → 1
1 1 1 → 0

Toffoli gate implementation of IBM OpenQASM

OpenQASM's standard library qelib1.inc defines the Toffoli gate. Here is its definition.

gate ccx a,b,c
{
  h c;
  cx b,c; tdg c;
  cx a,c; t c;
  cx b,c; tdg c;
  cx a,c; t b; t c; h c;
  cx a,b; t a; tdg b;
  cx a,b;
}
Enter fullscreen mode Exit fullscreen mode

"h" is a Hadamard gate, "cx" is a CNOT gate, "t" is a T gate which rotates the Bloch sphere Z-axis by π/4 radians, and "tdg" is T† gate which rotates the Bloch spere Z-axis by -π/4 radians.

To understand this implementation, we reorder some operations. Generally, gate operations are not commutable. However, some gates can be commutable for example single qubit operation for i-th qubit and for j-th qubit, if i ≠ j, they're commutable. cx a, b and t a are also commutable because T gate rotate only Z-axis and CNOT gate don't minds control qubit's phase.

Here is reordered implementation.

gate ccx a,b,c
{
  h c;
  cx b,c; tdg c;
  cx a,c; t c;
  cx b,c; tdg c;
  cx a,c; t c;
  h c;
  t a; t b;
  cx a,b; tdg b; cx a,b;
}
Enter fullscreen mode Exit fullscreen mode

This implementation can be separate to 2 parts. First part is making ccx except phase adjustment, second part is adjusting phase factors.

Create Toffoli gate

First part, some operations are sandwiched with Hadamard gates.

  h c;
  cx b,c; tdg c;
  cx a,c; t c;
  cx b,c; tdg c;
  cx a,c; t c;
  h c
Enter fullscreen mode Exit fullscreen mode

To begin from conclusion, 2-controlled Z gate is sandwiched with H gates.
As we know, -H-Z-H- gate is X gate. We can confirm it with Blueqat.

from blueqat import Circuit
print(Circuit().h[0].z[0].h[0].to_unitary())
# => Matrix([[0, 1], [1, 0]]), This is X gate.
# We can see X gate definition by
print(Circuit().x[0].to_unitary())
# => Matrix([[0, 1], [1, 0]]), Yes! They're same!
Enter fullscreen mode Exit fullscreen mode

If you're using Jupyter Notebook, you can get more pretty display.

Controlled Z gate sandwiched with H gates for target qubit is CNOT gate.

As same as these, 2-controlled Z gate sandwiched with H gates is Toffoli gate. However, in this part, we will get strange 2-controlled Z gate because adjustment of phase factor is not yet.

Let us implement 2-controlled Z gate using Blueqat.

cx b,c; tdg c;
cx a,c; t c;
cx b,c; tdg c;
cx a,c; t c;
Enter fullscreen mode Exit fullscreen mode

We choose a = 2, b = 1, c = 0.
Implementation is very easy.

from blueqat import Circuit
c = Circuit()
c.cx[1, 0].tdg[0]
c.cx[2, 0].t[0]
c.cx[1, 0].tdg[0]
c.cx[2, 0].t[0]
c.to_unitary()
Enter fullscreen mode Exit fullscreen mode

Phase factor is strange, but similar to 2-controlled Z gate.

Add H gates before first opearation and after last operation.

Is it a Toffoli gate? It seems not a Toffoli gate. But if we know, exp(-iπ/4) = i * exp(iπ/4), we can feel it is similar to Toffoli gate.

Blueqat's unitary gate is Sympy matrix and Sympy can simplify these terms automatically. Let's simplify the unitary matrix.

It is as same as Toffoli gate except phase factors.

Then, we will see second part.

 t a; t b;
 cx a,b; tdg b; cx a,b;
Enter fullscreen mode Exit fullscreen mode

What is this means? Check by Blueqat.

Wow! This part multiples phase factor i if both qubit 1 and qubit 2 are |1>.

Finally, we combine first part and second part.

Is something wrong? Don't worry. First, exp(3iπ/8) = (-1)^3/8 because -1 =exp(iπ) and then, we can ignore scalar part of unitary matrix, it is "global phase".

So, divide by [0, 0]-th element and simplify the matrix, we can get Toffoli gate matrix.

Perfect!

Learn Blueqat more!

I'm a core developer of Blueqat. Blueqat has very simple and easy interface for quantum computing. I recommend to use Blueqat for learning quantum computer programming.

We prepared Blueqat tutorials and we will add more and more contents.
https://github.com/Blueqat/Blueqat-tutorials

If you have any questions or suggestions, please feel free to contact us by our Slack community. (Join from here)

Blueqat repository is here.
https://github.com/Blueqat/Blueqat

💖 💪 🙅 🚩
beef_and_rice
Takumi Kato

Posted on May 20, 2019

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related