Home Reference Source

src/setups/decompositions/crz2cxandrz.js

;
import {NOT, Rz} from '../../ops/gates';
import {C} from '../../ops/metagates';
import {tuple} from '../../libs/util';
import DecompositionRule from '../../cengines/replacer/decompositionrule';

const _decompose_CRz = (cmd) => {
  const qubit = cmd.qubits[0]
  const ctrl = cmd.controlQubits
  const gate = cmd.gate
  const n = cmd.controlCount

  new Rz(0.5 * gate.angle).or(qubit)
  C(NOT, n).or(tuple(ctrl, qubit))
  new Rz(-0.5 * gate.angle).or(qubit)
  C(NOT, n).or(tuple(ctrl, qubit))
}

const _recognize_CRz = cmd => cmd.controlCount >= 1

export default [
  new DecompositionRule(Rz, _decompose_CRz, _recognize_CRz)
]