Gate Synthesis
Turning a mathematically specified unitary into an explicit, resource-minimal sequence of executable gates.
What synthesis produces
Gate synthesis takes a unitary target — given as a matrix, a rotation angle, or a high-level operation — and returns a concrete circuit of gates drawn from a chosen set. It differs from decomposition mainly in emphasis: synthesis is the optimization-driven search for the best such circuit under a resource metric.
Resource metrics
- Two-qubit gate count, since entangling gates are the noisiest operations
- T-count and T-depth, the dominant cost in fault-tolerant computation
- Circuit depth, which sets the wall-clock time and the exposure to decoherence
- Ancilla count, the extra qubits a construction borrows
Exact synthesis
For single-qubit rotations over Clifford+T, exact synthesis is possible when the target has entries in the ring of algebraic numbers reachable by that set. Kliuchnikov-Maslov-Mosca gave an exact algorithm; Ross-Selinger extended it to near-optimal approximate synthesis of arbitrary z-rotations with provable T-count bounds.
Approximate and numerical synthesis
When exact synthesis is impossible or too costly, numerical methods search parameterized circuits to match a target unitary within a tolerance. Techniques include template matching, peephole rewriting, and gradient-based fitting of variational circuit templates. These trade guaranteed optimality for flexibility across arbitrary native sets.
# angle-to-T-count rule of thumb for RZ(theta) over Clifford+T
import math
def approx_t_count(epsilon):
return round(3*math.log2(1/epsilon)) # Ross-Selinger scaling
Pipeline placement
Synthesis is one stage of the compiler. Upstream, a circuit is decomposed to two-qubit blocks; synthesis lowers each block and each rotation to native or fault-tolerant gates; downstream, routing and scheduling adapt to the device. See decomposition, Solovay-Kitaev, and transpilation.