I would like to uniformly sample from the group of random Clifford gates. I am aware of the paper https://arxiv.org/abs/2003.09412 where they have designed the algorithm to do this task and even provided a Python implementation of it. The algorithm outputs a Clifford tableau uniformly sampled from the corresonding Clifford group. I would like to define a Clifford gate with this tableau in Google Cirq - is there any simple way to do that?

  • $\begingroup$ What do you want to do with it in cirq? How many qubits are we talking about here: less than 10? More than 100? This exact method is the one used by stim.Tableau.random, but there's nothing in stimcirq to convert that tableau into a cirq object at the moment. $\endgroup$ Jun 11, 2022 at 18:50
  • $\begingroup$ Thanks for the response! The number of qubits N to be simulated is ideally of order few hundred with a circuit depth O(N). I most likely do not need anything beyond 3-qubit random Clifford. Within Cirq I guess one possibility might be to use clifford decomposition into a list of 1 and 2 qubit operations (cirq.decompose_clifford_tableau_to_operations: github.com/quantumlib/Cirq/blob/v0.14.1/cirq-core/cirq/… ) and create a Clifford Tableau by simply specifying the state - but this sounds like a bit of an overkill... $\endgroup$
    – CatQubit
    Jun 11, 2022 at 20:41
  • $\begingroup$ @CatQubit There is a way but it's fairly involved. Assuming this is a full tableau (i.e. it has the stabilisers + logicals + destabilisers) then it corresponds to a symplectic matrix. This matrix can be ("Bruhat") decomposed as a product of simpler matrices which are then mapped to clifford circuits (CNOT's + phase + hadarmard). See this for details arxiv.org/pdf/1803.06987.pdf $\endgroup$
    – unknown
    Jun 11, 2022 at 21:39
  • $\begingroup$ If you're working with hundreds of qubits then you're probably doing a pure stabilizer simulation. In that case I'd recommend giving stim.TableauSimulator a try for your specific problem. Cirq's stabilizer simulation stuff is really minimal, and not optimized for performance. I watch this stack exchange for stim questions so you'd get answers relatively quickly. (That being said, I might be a bit biased since I made stim. But then again I guess I also wrote and drove a large part of cirq. Maybe it all cancels out.) $\endgroup$ Jun 11, 2022 at 23:17
  • $\begingroup$ @CraigGidney is it then possible to implement say a layer of 2 qubit random Clifford gates between selected qubits in stim? I understand that normally one would use combination of stim.Tableau.random and stim.TableauSimulator().set_inverse_tableau but it does not seem to allow to specify on which qubits I apply these operations and set_inverse_tableau overwrites the previous number of qubits I might have had. Furthermore, is there any way to bypass the stim limitation and apply a non-Pauli gate as a feedback? I do not require this latter operation to be efficient neccesarily. $\endgroup$
    – CatQubit
    Jun 12, 2022 at 15:23


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Browse other questions tagged or ask your own question.