Skip to content

[FEATURE] Decompose p, phaseshift and u1 as rz instead of h; rx; h #469

Closed

Description

@TheGupta2012

Feature Description

unroll decomposes p, phaseshift and u1 into three gates, h; rx(θ); h. A single rz(θ) gives the same gate up to a global phase. The longer form then grows during rebase, because each h expands again:

Input Basis Output on main Output for the same gate written as rz
p(0.3) q[0]; ROTATIONAL_CX 5 gates: ry(π/2); rx(π); rx(0.3); ry(π/2); rx(π) rz(0.3)
p(pi/4) q[0]; CLIFFORD_T 5 gates: h; h; t; h; h t
p(pi/2) q[0]; CLIFFORD_T 5 gates: h; h; s; h; h s

Reproduction on main at a742796, Python 3.12:

import pyqasm
from pyqasm.elements import BasisSet

src = 'OPENQASM 3.0;\ninclude "stdgates.inc";\nqubit[1] q;\np(pi/4) q[0];\n'
m = pyqasm.loads(src)
m.rebase(BasisSet.CLIFFORD_T)
print(pyqasm.dumps(m))  # h q[0]; h q[0]; t q[0]; h q[0]; h q[0];

OpenQASM 2 programs that use qelib1.inc unroll p and u1 the same way.

The decomposition is phaseshift_gate. ONE_QUBIT_ROTATION_MAP maps u1, U1, phaseshift and p to it. The csx and rccx decompositions also call it seven times in total.

A related point: #468 adds a p rule to rebase. Unroll rewrites a p gate written by the user before rebase sees it, so that rule only applies to the p gates that pyqasm generates itself.

Done when:

  • A single p(θ), phaseshift(θ) or u1(θ) unrolls to one gate.
  • Under CLIFFORD_T, p(pi/4) rebases to t and p(pi/2) rebases to s.
  • The unitary of each changed decomposition, including csx and rccx, still matches the original up to a global phase.

Implementation (Optional)

One option is to make phaseshift_gate emit rz(θ). gate_decompositions.md documents the current form and needs the same update. rz(θ) and p(θ) differ only by a global phase. That should be safe here, because ctrl @ p resolves to cp before this decomposition runs. This reasoning is not verified against the full test suite.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions