Skip to content

Unitary Gate

Given a \(2^{n}\times2^{n}\) unitary matrix, the unitary-gate function constructs an equivalent unitary gate that acts on \(n\) qubits accordingly. For \(n>2\), the synthesis process implementation is based on [1].

Syntax

Function: UnitaryGate

Parameters:

  • data: DataArray
{
  "function": "UnitaryGate",
  "function_params": {
    "data": [
      [1, 0, 0, 0],
      [0, 1, 0, 0],
      [0, 0, "-1j", 0],
      [0, 0, 0, "1j"]
    ]
  }
}

Example

This example shows a \(2\)-qubit unitary gate generated from a series of arbitrary \(2\)-rotations in the formed \(4\)-dimensional space. The SDK code includes the construction of the matrix using NumPy functions, while the textual model is created by feeding the explicit numerical values.

{
  "functions": [
    {
      "name": "main",
      "body": [
          {
              "function": "UnitaryGate",
              "function_params": {
                  "data": [
                      [
                          "(-0.437588928003977-0.22742705999986979j)",
                          "(0.5162471759231342+0.5412974930115615j)",
                          "(-0.0257562186040025-0.09612351644098814j)",
                          "(0.11352149651283158+0.41771820225920475j)"
                      ],
                      [
                          "(-0.4657883653698742-0.4426774493996494j)",
                          "(-0.3564263367893152-0.37953725275954014j)",
                          "(-2.7383934913210134e-17+0.447213595499958j)",
                          "(0.24082111067114909+0.2408211106711492j)"
                      ],
                      [
                          "(0.276003031585611-0.227055039284318j)",
                          "(0.24522446154306524-0.17374499218631134j)",
                          "(0.8720020339202011+0j)",
                          "(0.08819092511956897+0.11739161131796567j)"
                      ],
                      [
                          "(0.08990251208306779-0.4561322296873242j)",
                          "(0.1573622060431408+0.23305019820160192j)",
                          "(-0.08618198713953264+0.14927158042291808j)",
                          "(0.38451638587720915-0.7261015617334183j)"
                      ]
                  ]
              }
          }
      ]
    }
  ]
}
import numpy as np
from classiq import Model, synthesize, show
from classiq.builtin_functions import UnitaryGate

num_gate_qubits = 2
thetas = [np.pi / 3, np.pi / 7, np.arccos(3 / 5), 0.2, np.pi / 4, np.pi / 2]
phis = [np.pi / 4, np.pi / 3, np.pi / 2, np.pi / 5, np.pi / 4, np.pi / 3]
pairs = [[0, 3], [3, 2], [1, 2], [0, 1], [1, 3], [0, 1]]
gate_matrix = np.identity(2**num_gate_qubits, dtype=complex)
for theta, phi, index in zip(thetas, phis, pairs):
    data_next = np.identity(2**num_gate_qubits, dtype=complex)
    data_next[index[0], index[0]] = 0
    data_next[index[1], index[1]] = 0
    data_next[np.ix_(index, index)] = [
        [
            np.exp(-1j * phi) * np.cos(theta / 2),
            -np.exp(-1j * phi) * np.sin(theta / 2),
        ],
        [np.sin(theta / 2), np.cos(theta / 2)],
    ]
    gate_matrix = np.dot(gate_matrix, data_next)
gate_matrix = gate_matrix.tolist()

model = Model()
unitary_gate_params = UnitaryGate(data=gate_matrix)
model.UnitaryGate(unitary_gate_params)

quantum_program = synthesize(model.get_model())
show(quantum_program)

The figure shows the constituents of the gate.

 Mcx example

References

[1] R. Iten et al, Quantum Circuits for Isometries, Phys. Rev. A 93 (2016). https://link.aps.org/doi/10.1103/PhysRevA.93.032318