deleted incorrect var numPaulis and replaced with numrandomsteps in test2 bash script
[strong_simulation_stabilizer_rank.git] / randominputcommutingHermitianPauli2.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4 #include <string.h>
5
6 // order of matrix elements is [row][column]!!!
7
8 /*********************************************************/
9 /* Generates random Hermitian Paulis that are commuting! */
10 /*********************************************************/
11 int main( int argc, char *argv[])
12 {
13
14   if(argc != 4) {
15     printf("randominputPauli arguments: \"number of qubits\" \"number of T gates\" \"number of random Clifford steps\"\n");
16     exit(0);
17   }
18   
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
22
23   printf("%d\n", N);
24   printf("%d\n", T);
25
26   int omega[N];
27   int Pauli[N][N];
28   srand((unsigned)time(NULL));
29
30
31   int i, j, k;
32
33   int sign = 1;
34
35   // don't initially generate Y's (which is represented by '3'; I=0, Z=1, X=2, Y=3)
36   for(i=0; i<N; i++) {
37     omega[i] = (rand()%2)*2; // omega must be 0 or 2 (since it is a power of i: i^omega)
38     for(j=0; j<i; j++)
39       Pauli[i][j] = 0; 
40     for(j=i; j<N; j++)
41       Pauli[i][j] = 1; 
42   }
43
44   int qubita, qubitb; // indices of qubits that are Hadamarded or CNOTed.
45   int gate;
46   for(i=0; i<randsteps; i++) {
47     //printf("i=%d\n", i);
48     gate = rand()%3;
49     //printf("gate=%d\n", gate);
50     if(gate==0) { // Hadamard
51       qubita = rand()%N;
52       for(j=0; j<N; j++) {
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)
57       }
58     } else if(gate==1) { // phaseshift
59       qubita = rand()%N;
60       //printf("qubita=%d", qubita);
61       for(j=0; j<N; j++) {
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])%4;
67         }
68       }
69     } else { // CNOT
70       qubita = rand()%N;
71       qubitb = qubita;
72       while(qubitb == qubita)
73         qubitb = rand()%N;
74       for(j=0; j<N; j++) {
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;
92           omega[j] = (2+omega[j])%4;
93         } else if((Pauli[j][qubita] == 1) && (Pauli[j][qubitb] == 3)) {// ZY ->-YX
94           Pauli[j][qubita] == 3;
95           Pauli[j][qubitb] == 2;
96           omega[j] = (2+omega[j])%4;
97         }
98       }
99     }
100   }
101
102   for(i=0; i<N; i++) {
103     printf("%d\n", omega[i]); 
104     for(j=0; j<N; j++) {
105       printf("%d %d %d %d\n", Pauli[i][j]==0, Pauli[i][j]==1, Pauli[i][j]==2, Pauli[i][j]==3);
106     }
107   }
108
109 }