Random Quantum Circuits (RQC)

The RQC module aims to generate RQC capable of demonstrating results as those of Villalonga et al (npj Quantum Inf 5, 86 (2019)) and Arute et al. (Nature volume 574, 505–510 (2019)).

API

rqc.jl

QXZoo.RQC.random_gate!Method
random_gate!(rqc::RQC, i::Int, j::Int)

Returns the gate name for the next single qubit gate to be applied to the qubit at (i, j).

source
QXZoo.RQC.patternsMethod
patterns(rqc::RQC)

Generate a dictionary of patterns of qubit pairs to apply two qubit gates to. The patterns are numbers 1 to 8 like in Boxio2018 but in a different order. (Note, the order used in Boxio2018 is 3, 1, 6, 8, 5, 7, 2, 4)

source
QXZoo.RQC.create_RQCFunction
create_RQC(rows::Int, cols::Int, depth::Int,
                    seed::Union{Int, Nothing}=nothing;
                    use_iswap::Bool=false,
                    final_Hadamard_layer::Bool=false)

Generate a random quantum circuit with a (rows x cols) grid of qubits. The parameter 'depth' is the number of one and two qubit gate layers to be used in the circuit.

The single qubit gates used are chossen randomly from the set {T, sqrt(X), sqrt(Y)}. The seed for the random selection can be set with the seed parameter.

CZ gates are used by default as the two qubit gates. [TODO] Setting 'use_iswap' to true will use iSWAP gates inplace of CZ gates.

Setting 'finalHadamardlayer' to true will include a layer of Hadamard gates at the end of the circuit.

source

Example

To use the Grover module, we provide example code below to search for a state in a 5-qubit quantum register marked by bit-pattern 11 (0b01011).

using QXZoo

# Set 2D qubit grid size and circuit depth
rows = 4
cols = 5
depth = 7

# Create RQC circuit using built-in generator
cct = QXZoo.RQC.create_RQC(rows, cols, depth)

println(cct)

for i in cct.circ_ops
    println(i)
end
20 qubits with 80 gate-calls using 5 unique gates.
GateCall1(GateSymbol(:h, 0, false), 1)
GateCall1(GateSymbol(:h, 0, false), 2)
GateCall1(GateSymbol(:h, 0, false), 3)
GateCall1(GateSymbol(:h, 0, false), 4)
GateCall1(GateSymbol(:h, 0, false), 5)
GateCall1(GateSymbol(:h, 0, false), 6)
GateCall1(GateSymbol(:h, 0, false), 7)
GateCall1(GateSymbol(:h, 0, false), 8)
GateCall1(GateSymbol(:h, 0, false), 9)
GateCall1(GateSymbol(:h, 0, false), 10)
GateCall1(GateSymbol(:h, 0, false), 11)
GateCall1(GateSymbol(:h, 0, false), 12)
GateCall1(GateSymbol(:h, 0, false), 13)
GateCall1(GateSymbol(:h, 0, false), 14)
GateCall1(GateSymbol(:h, 0, false), 15)
GateCall1(GateSymbol(:h, 0, false), 16)
GateCall1(GateSymbol(:h, 0, false), 17)
GateCall1(GateSymbol(:h, 0, false), 18)
GateCall1(GateSymbol(:h, 0, false), 19)
GateCall1(GateSymbol(:h, 0, false), 20)
GateCall2(GateSymbol(:c_z, 0, false), 6, 2, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 8, 4, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 13, 9, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 15, 11, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 5, 1, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 7, 3, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 14, 10, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 16, 12, GateSymbol(:z, 0, false))
GateCall1(GateSymbol(:z, 2, false), 3)
GateCall1(GateSymbol(:z, 2, false), 4)
GateCall1(GateSymbol(:z, 2, false), 6)
GateCall1(GateSymbol(:z, 2, false), 7)
GateCall1(GateSymbol(:z, 2, false), 13)
GateCall1(GateSymbol(:z, 2, false), 14)
GateCall1(GateSymbol(:z, 2, false), 16)
GateCall1(GateSymbol(:z, 2, false), 17)
GateCall2(GateSymbol(:c_z, 0, false), 6, 7, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 14, 15, GateSymbol(:z, 0, false))
GateCall1(GateSymbol(:z, 2, false), 1)
GateCall1(GateSymbol(:z, 2, false), 2)
GateCall1(GateSymbol(:z, 2, false), 8)
GateCall1(GateSymbol(:z, 2, false), 11)
GateCall1(GateSymbol(:z, 2, false), 18)
GateCall1(GateSymbol(:z, 2, false), 19)
GateCall2(GateSymbol(:c_z, 0, false), 2, 3, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 10, 11, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 18, 19, GateSymbol(:z, 0, false))
GateCall1(GateSymbol(:x, 1, false), 7)
GateCall1(GateSymbol(:z, 2, false), 9)
GateCall1(GateSymbol(:z, 2, false), 12)
GateCall1(GateSymbol(:x, 1, false), 14)
GateCall2(GateSymbol(:c_z, 0, false), 6, 10, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 8, 12, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 13, 17, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 15, 19, GateSymbol(:z, 0, false))
GateCall1(GateSymbol(:x, 1, false), 6)
GateCall1(GateSymbol(:z, 2, false), 10)
GateCall1(GateSymbol(:y, 1, false), 11)
GateCall1(GateSymbol(:x, 1, false), 13)
GateCall2(GateSymbol(:c_z, 0, false), 5, 9, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 7, 11, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 14, 18, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 16, 20, GateSymbol(:z, 0, false))
GateCall1(GateSymbol(:x, 1, false), 4)
GateCall1(GateSymbol(:z, 2, false), 5)
GateCall1(GateSymbol(:y, 1, false), 7)
GateCall1(GateSymbol(:y, 1, false), 8)
GateCall1(GateSymbol(:y, 1, false), 14)
GateCall1(GateSymbol(:z, 2, false), 15)
GateCall1(GateSymbol(:x, 1, false), 17)
GateCall1(GateSymbol(:y, 1, false), 18)
GateCall2(GateSymbol(:c_z, 0, false), 2, 1, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 10, 9, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 18, 17, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 8, 7, GateSymbol(:z, 0, false))
GateCall2(GateSymbol(:c_z, 0, false), 16, 15, GateSymbol(:z, 0, false))
GateCall1(GateSymbol(:y, 1, false), 2)
GateCall1(GateSymbol(:x, 1, false), 9)
GateCall1(GateSymbol(:z, 2, false), 13)
GateCall1(GateSymbol(:z, 2, false), 20)