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.
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