6 // order of matrix elements is [row][column]!!!
8 /*********************************************************/
9 /* Generates random Hermitian Paulis that are commuting! */
10 /*********************************************************/
11 int main( int argc, char *argv[])
15 printf("randominputPauli arguments: \"number of qubits\" \"number of T gates\" \"number of random Clifford steps\"\n");
19 int N = atoi(argv[1]); // number of qubits
20 int T = atoi(argv[2]); // number of T gate magic states (set to the first 'K' of the 'N' qubits -- the rest are set to the '0' computational basis state)
21 int randsteps = atoi(argv[3]); // number of random Clifford steps
28 srand((unsigned)time(NULL));
35 // don't initially generate Y's (which is represented by '3'; I=0, Z=1, X=2, Y=3)
37 omega[i] = (rand()%2)*2; // omega must be 0 or 2 (since it is a power of i: i^omega)
44 int qubita, qubitb; // indices of qubits that are Hadamarded or CNOTed.
46 for(i=0; i<randsteps; i++) {
47 //printf("i=%d\n", i);
49 //printf("gate=%d\n", gate);
50 if(gate==0) { // Hadamard
53 if(Pauli[j][qubita] ==1)
54 Pauli[j][qubita] = 2; // 1->2 and 2->1 (i.e. Z->X and X->Z)
55 else if(Pauli[j][qubita] ==2)
56 Pauli[j][qubita] = 1; // 1->2 and 2->1 (i.e. Z->X and X->Z)
58 } else if(gate==1) { // phaseshift
60 //printf("qubita=%d", qubita);
62 if(Pauli[j][qubita] == 2)
63 Pauli[j][qubita] = 3; // X->Y
64 else if(Pauli[j][qubita] == 3) {
65 Pauli[j][qubita] = 2; // Y->-X
66 omega[j] = (2*omega[j])%2;
72 while(qubitb == qubita)
75 if((Pauli[j][qubita] == 1) && (Pauli[j][qubitb] == 1)) // ZZ ->ZI
76 Pauli[j][qubitb] == 0;
77 else if((Pauli[j][qubita] == 1) && (Pauli[j][qubitb] == 0)) // ZI ->ZZ
78 Pauli[j][qubitb] == 1;
79 else if((Pauli[j][qubita] == 2) && (Pauli[j][qubitb] == 2)) // XX ->IX
80 Pauli[j][qubita] == 1;
81 else if((Pauli[j][qubita] == 0) && (Pauli[j][qubitb] == 2)) // IX ->XX
82 Pauli[j][qubita] == 2;
83 else if((Pauli[j][qubita] == 1) && (Pauli[j][qubitb] == 2)) {// ZX ->YY
84 Pauli[j][qubita] == 3;
85 Pauli[j][qubitb] == 3;
86 } else if((Pauli[j][qubita] == 0) && (Pauli[j][qubitb] == 2)) {// YY ->ZX
87 Pauli[j][qubita] == 1;
88 Pauli[j][qubitb] == 2;
89 } else if((Pauli[j][qubita] == 3) && (Pauli[j][qubitb] == 2)) {// YX ->-ZY
90 Pauli[j][qubita] == 1;
91 Pauli[j][qubitb] == 3;
93 } else if((Pauli[j][qubita] == 1) && (Pauli[j][qubitb] == 3)) {// ZY ->-YX
94 Pauli[j][qubita] == 3;
95 Pauli[j][qubitb] == 2;
103 printf("%d\n", omega[i]);
105 printf("%d %d %d %d\n", Pauli[i][j]==0, Pauli[i][j]==1, Pauli[i][j]==2, Pauli[i][j]==3);