Example #1
0
def mcrz_gray(c: Circuit, theta: float, ctrl: Sequence[int],
              target: int) -> Circuit:
    """A macro of multi controlled RZ gate."""
    n_ctrl = len(ctrl)
    if n_ctrl == 0:
        return c.rz(theta)[target]
    angles = [theta / 2**(n_ctrl - 1), -theta / 2**(n_ctrl - 1)]
    for c0, c1, parity in gen_gray_controls(n_ctrl):
        if c0 >= 0:
            c.cx[ctrl[c0], ctrl[c1]]
        c.crz(angles[parity])[ctrl[c1], target]
    return c
Example #2
0
def test_complicated_circuit(backend):
    c = Circuit()
    c.x[0].h[0].rx(-1.5707963267948966)[2].cx[0, 2].rz(0.095491506289)[2]
    c.cx[0, 2].h[0].rx(1.5707963267948966)[2].h[0].ry(-1.5707963267948966)[2]
    c.cx[0, 2].cx[2, 3].rz(0.095491506289)[3].cx[2, 3].cx[0, 2].h[0]
    c.rx(1.5707963267948966)[2].h[0].ry(-1.5707963267948966)[2].cx[0, 1]
    c.cx[1,
         2].rz(0.095491506289)[2].cx[1,
                                     2].cx[0,
                                           1].h[0].u(math.pi / 2, 1.58,
                                                     -0.62)[2]
    c.h[0].rx(-1.5707963267948966)[2].cx[0, 1].cx[1, 2].cx[2, 3]
    c.rz(0.095491506289)[3].cx[2, 3].cx[1, 2].cx[0, 1].h[0]
    c.rx(1.5707963267948966)[2].u(0.42, -1.5707963267948966, 1.64)[2].h[2]
    c.cx[0, 2].rz(-0.095491506289)[2].cx[0, 2].rx(1.5707963267948966)[0].h[2]
    c.rx(-1.5707963267948966)[0].h[2].cx[0, 2].cx[2, 3].rz(-0.095491506289)[3]
    c.cx[2, 3].cx[0, 2].rx(1.5707963267948966)[0].h[2]
    c.rx(-1.5707963267948966)[0].h[2].cx[0, 1].cx[1, 2].rz(-0.095491506289)[2]
    c.cx[1, 2].cx[0, 1].rx(1.5707963267948966)[0].h[2]
    c.rx(-1.5707963267948966)[0].t[2].s[2].cx[0, 1].cx[1, 2].sdg[1].cx[2, 3]
    c.rz(-0.095491506289)[3].cx[2, 3].cx[1, 2].cx[0, 1]
    c.rx(1.5707963267948966)[0].h[2].h[0].rx(-1.5707963267948966)[1].h[2]
    c.cx[0, 1].cx[1, 2].rz(1.1856905316303521e-08)[2].cx[1, 2].cx[0, 1].h[0]
    c.rx(1.5707963267948966)[1].h[2].rx(-1.5707963267948966)[0]
    c.rx(-1.5707963267948966)[1].rx(-1.5707963267948966)[2].cx[0, 1].cx[1, 2]
    c.rz(1.1856905316303521e-08)[2].cx[1, 2].cx[0, 1].rx(1.5707963267948966)[0]
    c.rx(1.5707963267948966)[1].rx(1.5707963267948966)[2]
    c.rx(-1.5707963267948966)[1].cx[1, 3].rz(1.2142490216037756e-08)[3]
    c.cx[1, 3].rx(1.5707963267948966)[1].rx(-1.5707963267948966)[1].cx[0, 1]
    c.cx[1, 2].rz(-1.2142490216037756e-08)[2].cx[1, 2].cx[0, 1]
    c.rx(1.5707963267948966)[1]
    c.cx[0, 3].u(0.23, 1.24, -0.65)[3].cx[3, 1].cx[3, 0]
    vec = c.run(backend=backend)
    assert np.allclose(
        ignore_global_phase(vec),
        np.array([
            5.88423813e-01 + 0.00000000e+00j, -3.82057626e-02 -
            5.70122617e-02j, -2.52821022e-17 - 5.09095967e-17j,
            -1.21188626e-11 + 5.63063568e-10j, -2.19604047e-01 -
            2.85449458e-01j, -2.59211189e-03 + 4.58219688e-02j,
            3.08617333e-09 - 3.56619861e-09j, 4.48946755e-18 - 3.62425819e-19j,
            4.64439684e-09 - 1.48402425e-09j, 4.61321871e-18 - 4.67197922e-18j,
            -3.59382904e-01 + 4.73135946e-01j, 2.20759589e-02 +
            6.42836440e-02j, -1.55912415e-17 - 3.57403200e-17j,
            5.05381446e-10 + 2.03362289e-10j, 3.82475330e-01 - 1.07620677e-01j,
            2.29456407e-02 - 3.47003613e-02j
        ]))