Construct Clifford Maps
Contents
import sys
sys.path.insert(0, '..')
import numpy as np
import qutip as qt
import src
from src import (utils, paulialg, stabilizer, circuit)
2.1. Construct Clifford Maps#
identity_map(N) constructs an identity Clifford map on \(N\) qubits.
stabilizer.identity_map(4)
CliffordMap(
  X0-> +XIII
  Z0-> +ZIII
  X1-> +IXII
  Z1-> +IZII
  X2-> +IIXI
  Z2-> +IIZI
  X3-> +IIIX
  Z3-> +IIIZ)
random_pauli_map(N) samples a random Clifford map made of random single-qubit Clifford gates on \(N\) qubits, i.e. \(U=\prod_i U_i\in\mathrm{Cl}(2)^N\). Each realization specifies a random local Pauli basis.
stabilizer.random_pauli_map(4)
CliffordMap(
  X0-> -YIII
  Z0-> -ZIII
  X1-> +IZII
  Z1-> +IXII
  X2-> +IIZI
  Z2-> -IIYI
  X3-> +IIIZ
  Z3-> +IIIX)
random_clifford_map(N) samples a globally random Clifford map on \(N\) qubits, i.e. \(U\in\mathrm{Cl}(2^N)\). Each realization specifies a random global stabilizer basis.
stabilizer.random_clifford_map(4)
CliffordMap(
  X0-> -XXIX
  Z0-> +IXXY
  X1-> +ZZXX
  Z1-> -IYYY
  X2-> +YXYZ
  Z2-> +YIIY
  X3-> -XZIZ
  Z3-> +ZIZZ)
clifford_rotation_map(N) constructs a Clifford map based for a Clifford rotation given its generator.
stabilizer.clifford_rotation_map('-XXYZ')
CliffordMap(
  X0-> +XIII
  Z0-> +YXYZ
  X1-> +IXII
  Z1-> +XYYZ
  X2-> +XXZZ
  Z2-> -XXXZ
  X3-> -XXYY
  Z3-> +IIIZ)
2.2. Construct Stabilizer States#
maximally_mixed_state(N) constructs a \(N\)-qubit maximally mixed state (by setting the density matrix to full rank).
$\(\rho=2^{-N}\mathbb{1}.\)$
stabilizer.maximally_mixed_state(4)
StabilizerState()
zero_state(N) constructs a \(N\)-qubit all-zero state
$\(\rho=|0\cdots0\rangle\langle 0\cdots0|=\prod_{i}\frac{1+Z_i}{2}.\)$
stabilizer.zero_state(4)
StabilizerState(
   +ZIII
   +IZII
   +IIZI
   +IIIZ)
one_state(N) constructs a \(N\)-qubit all-one state
$\(\rho=|1\cdots1\rangle\langle 1\cdots1|=\prod_{i}\frac{1-Z_i}{2}.\)$
stabilizer.zero_state(4).ps
array([0, 0, 0, 0, 0, 0, 0, 0])
ghz_state(N) constructs a \(N\)-qubit GHZ state
$\(\rho = |\Psi\rangle\langle\Psi|, \qquad \text{with }|\Psi\rangle=\frac{1}{\sqrt{2}}(|0\cdots0\rangle+|1\cdots1\rangle).\)$
stabilizer.ghz_state(4)
StabilizerState(
   +ZZII
   +IZZI
   +IIZZ
   +XXXX)
random_pauli_map(N) samples a \(N\) qubit random Pauli state.
$\(\rho=U|0\cdots0\rangle\langle 0\cdots0|U^\dagger,\qquad\text{with }U\in \mathrm{Cl}(2)^N.\)$
stabilizer.random_pauli_map(4)
CliffordMap(
  X0-> -ZIII
  Z0-> +YIII
  X1-> +IZII
  Z1-> +IXII
  X2-> -IIZI
  Z2-> +IIXI
  X3-> -IIIY
  Z3-> +IIIZ)
random_clifford_map(N) samples a \(N\) qubit random Clifford (random stabilizer) state.
$\(\rho=U|0\cdots0\rangle\langle 0\cdots0|U^\dagger,\qquad\text{with }U\in \mathrm{Cl}(2^N).\)$
stabilizer.random_clifford_state(4)
StabilizerState(
   +IIIY
   +XXXI
   +IXXY
   +XIXI)
stabilizer_state(...) is a universal constructor of stabilizer state by specifying all stabilizers.
stabilizer.stabilizer_state('XXY','ZZI','IZZ')
StabilizerState(
   +XXY
   +ZZI
   +IZZ)
2.3. Construct Stabilizer States by Checker Matrix#
The user can also construct stabilizer state by low-level constructor StabilizerState(gs, ps, r=0):
Parameters
gs: int (2*N, 2*N): strings of Pauli operators in the stabilizer tableau.ps: int (2*N): phase indicators (should only be 0 or 2).r: int: number of logical qubits (log2 rank of density matrix)’’’
Returns
Object of
StabilizerState
tmp_state = stabilizer.random_clifford_state(3)
print(tmp_state)
StabilizerState(
   +YXY
   +XYY
   +ZIZ)
gs = tmp_state.gs
ps = tmp_state.ps
stabilizer.StabilizerState(gs=gs,ps=ps)
StabilizerState(
   +YXY
   +XYY
   +ZIZ)
A hack to inspect the full stabilizer tableau is by converting StabilizerState to PauliList by
stabilizer.stabilizer_state('XXY','ZZI','IZZ')[:]
 +XXY
 +ZZI
 +IZZ
 +ZII
 +ZXX
 +ZIX
2.4. State-Map convertion#
Stabilizer states and Clifford maps can be mapped to each other.
rho = stabilizer.stabilizer_state('XXX','ZZI','IZZ')
print("quantum state: \n", rho)
quantum state: 
 StabilizerState(
   +XXX
   +ZZI
   +IZZ)
rho.to_map()
CliffordMap(
  X0-> +ZII
  Z0-> +XXX
  X1-> +IXX
  Z1-> +ZZI
  X2-> +IIX
  Z2-> +IZZ)
And Clifford map can be converted back to the stabilizer state.
rho.to_map().to_state()
StabilizerState(
   +XXX
   +ZZI
   +IZZ)
.to_map()and.to_state()will make new copies of Pauli string data in the memory.