deleted incorrect var numPaulis and replaced with numrandomsteps in test2 bash script
[strong_simulation_stabilizer_rank.git] / strongsim12.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5 #include <complex.h>
6 #include "matrix.h"
7 #include "exponentialsum.h"
8 #include "shrink.h"
9 #include "extend.h"
10 #include "measurepauli.h"
11 #include "innerproduct.h"
12
13 #define ZEROTHRESHOLD (0.00000001)
14
15 int readPaulicoeffs(int *omega, int *alpha, int *beta, int *gamma, int *delta, int numqubits);
16
17 void outerProductMod(int **A, int **B, int **C, int ro1, int co1, int ro2, int co2, int mod);
18
19 // order of matrix elements is [row][column]!!!
20
21 int main()
22 {
23
24   int N;              // number of qubits
25   scanf("%d", &N);
26
27   if(N%12 != 0) {
28     printf("'N' needs to be a multiple of 12 for a k=12 tensor factor decomposition!\n");
29     return 1;
30   }
31
32   int T;              // 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)
33   scanf("%d", &T);  
34
35   int omega;
36   int alpha[N], beta[N], gamma[N], delta[N];
37   int Paulicounter = 0;
38
39   int i, j, k, l, m;
40
41   double complex coeffb60 = (-16.0+12.0*sqrt(2.0)+0.0*I)*pow(cos(PI/8.0),6)*cexp(6.0*PI*I/8.0)/8.0*cpow(2.0,3.0);
42   double complex coeffb66 = (96.0-68.0*sqrt(2.0)+0.0*I)*pow(cos(PI/8.0),6)*cexp(6.0*PI*I/8.0)/8.0*cpow(2.0,3.0);
43   double complex coeffe6 = (10.0-7.0*sqrt(2.0)+0.0*I)*pow(cos(PI/8.0),6)*cexp(6.0*PI*I/8.0)*cpow(2.0,2.5);
44   double complex coeffo6 = (-14.0+10.0*sqrt(2.0)+0.0*I)*pow(cos(PI/8.0),6)*cexp(-14.0*PI*I/8.0)*cpow(2.0,2.5);
45   double complex coeffk6 = (7.0-5.0*sqrt(2.0)+0.0*I)*pow(cos(PI/8.0),6)*cexp(-8.0*PI*I/8.0)*4.0*csqrt(2.0)*cpow(2.0,0.5);
46   double complex coeffphiprime = (10.0-7.0*sqrt(2.0)+0.0*I)*pow(cos(PI/8.0),6)*cexp(2.0*PI*I/8.0)*cpow(2.0,2.5);
47   double complex coeffphidprime = (10.0-7.0*sqrt(2.0)+0.0*I)*pow(cos(PI/8.0),6)*cexp(2.0*PI*I/8.0)*cpow(2.0,2.5);
48
49   // b60
50   int nn1 = 6; int kk1 = 6; int (*(GG1[])) = { (int[]) {1, 0, 0, 0, 0, 0}, (int[]) {0, 1, 0, 0, 0, 0}, (int[]) {0, 0, 1, 0, 0, 0}, (int[]) {0, 0, 0, 1, 0, 0}, (int[]) {0, 0, 0, 0, 1, 0}, (int[]) {0, 0, 0, 0, 0, 1}}; int (*(GGBar1[])) = { (int[]) {1, 0, 0, 0, 0, 0}, (int[]) {0, 1, 0, 0, 0, 0}, (int[]) {0, 0, 1, 0, 0, 0}, (int[]) {0, 0, 0, 1, 0, 0}, (int[]) {0, 0, 0, 0, 1, 0}, (int[]) {0, 0, 0, 0, 0, 1}}; int hh1[] = {0, 0, 0, 0, 0, 0}; int QQ1 = 0; int DD1[] = {0, 0, 0, 0, 0, 0}; int (*(JJ1[])) = { (int[]) {0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0} };
51   // b66
52   int nn2 = 6; int kk2 = 6; int (*(GG2[])) = { (int[]) {1, 0, 0, 0, 0, 0}, (int[]) {0, 1, 0, 0, 0, 0}, (int[]) {0, 0, 1, 0, 0, 0}, (int[]) {0, 0, 0, 1, 0, 0}, (int[]) {0, 0, 0, 0, 1, 0}, (int[]) {0, 0, 0, 0, 0, 1}}; int (*(GGBar2[])) = { (int[]) {1, 0, 0, 0, 0, 0}, (int[]) {0, 1, 0, 0, 0, 0}, (int[]) {0, 0, 1, 0, 0, 0}, (int[]) {0, 0, 0, 1, 0, 0}, (int[]) {0, 0, 0, 0, 1, 0}, (int[]) {0, 0, 0, 0, 0, 1}}; int hh2[] = {0, 0, 0, 0, 0, 0}; int QQ2 = 4; int DD2[] = {4, 4, 4, 4, 4, 4}; int (*(JJ2[])) = { (int[]) {0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0} };
53   // e6
54   int nn3 = 6; int kk3 = 5; int (*(GG3[])) = { (int[]) {1, 1, 0, 0, 0, 0}, (int[]) {1, 0, 1, 0, 0, 0}, (int[]) {1, 0, 0, 1, 0, 0}, (int[]) {1, 0, 0, 0, 1, 0}, (int[]) {1, 0, 0, 0, 0, 1}, (int[]) {1, 0, 0, 0, 0, 0} }; int (*(GGBar3[])) = { (int[]) {0, 1, 0, 0, 0, 0}, (int[]) {0, 0, 1, 0, 0, 0}, (int[]) {0, 0, 0, 1, 0, 0}, (int[]) {0, 0, 0, 0, 1, 0}, (int[]) {0, 0, 0, 0, 0, 1}, (int[]) {1, 1, 1, 1, 1, 1} }; int hh3[] = {1, 0, 0, 0, 0, 0}; int QQ3 = 4; int DD3[] = {0, 0, 0, 0, 0}; int (*(JJ3[])) = { (int[]) {0, 4, 4, 4, 4}, (int[]) {4, 0, 4, 4, 4}, (int[]) {4, 4, 0, 4, 4}, (int[]) {4, 4, 4, 0, 4}, (int[]) {4, 4, 4, 4, 0}  };
55   // o6
56   int nn4 = 6; int kk4 = 5; int (*(GG4[])) = { (int[]) {1, 1, 0, 0, 0, 0}, (int[]) {1, 0, 1, 0, 0, 0}, (int[]) {1, 0, 0, 1, 0, 0}, (int[]) {1, 0, 0, 0, 1, 0}, (int[]) {1, 0, 0, 0, 0, 1}, (int[]) {1, 0, 0, 0, 0, 0} }; int (*(GGBar4[])) = { (int[]) {0, 1, 0, 0, 0, 0}, (int[]) {0, 0, 1, 0, 0, 0}, (int[]) {0, 0, 0, 1, 0, 0}, (int[]) {0, 0, 0, 0, 1, 0}, (int[]) {0, 0, 0, 0, 0, 1}, (int[]) {1, 1, 1, 1, 1, 1} }; int hh4[] = {0, 0, 0, 0, 0, 0}; int QQ4 = 4; int DD4[] = {4, 4, 4, 4, 4}; int (*(JJ4[])) = { (int[]) {0, 4, 4, 4, 4}, (int[]) {4, 0, 4, 4, 4}, (int[]) {4, 4, 0, 4, 4}, (int[]) {4, 4, 4, 0, 4}, (int[]) {4, 4, 4, 4, 0}  };
57   // k6
58   int nn5 = 6; int kk5 = 1; int (*(GG5[])) = { (int[]) {1, 1, 1, 1, 1, 1}, (int[]) {0, 1, 0, 0, 0, 0}, (int[]) {0, 0, 1, 0, 0, 0}, (int[]) {0, 0, 0, 1, 0, 0}, (int[]) {0, 0, 0, 0, 1, 0}, (int[]) {0, 0, 0, 0, 0, 1} }; int (*(GGBar5[])) = { (int[]) {1, 0, 0, 0, 0, 0}, (int[]) {1, 1, 0, 0, 0, 0}, (int[]) {1, 0, 1, 0, 0, 0}, (int[]) {1, 0, 0, 1, 0, 0}, (int[]) {1, 0, 0, 0, 1, 0}, (int[]) {1, 0, 0, 0, 0, 1} }; int hh5[] = {1, 1, 1, 1, 1, 1}; int QQ5 = 6; int DD5[] = {2}; int (*(JJ5[])) = { (int[]) {4} };
59   // phiprime
60   int nn6 = 6; int kk6 = 5; int (*(GG6[])) = { (int[]) {1, 1, 0, 0, 0, 0}, (int[]) {1, 0, 1, 0, 0, 0}, (int[]) {1, 0, 0, 1, 0, 0}, (int[]) {1, 0, 0, 0, 1, 0}, (int[]) {1, 0, 0, 0, 0, 1}, (int[]) {1, 0, 0, 0, 0, 0} }; int (*(GGBar6[])) = { (int[]) {0, 1, 0, 0, 0, 0}, (int[]) {0, 0, 1, 0, 0, 0}, (int[]) {0, 0, 0, 1, 0, 0}, (int[]) {0, 0, 0, 0, 1, 0}, (int[]) {0, 0, 0, 0, 0, 1}, (int[]) {1, 1, 1, 1, 1, 1} }; int hh6[] = {1, 0, 0, 0, 0, 0}; int QQ6 = 0; int DD6[] = {0, 0, 0, 0, 0}; int (*(JJ6[])) = { (int[]) {0, 4, 0, 0, 4}, (int[]) {4, 0, 4, 0, 0}, (int[]) {0, 4, 0, 4, 0}, (int[]) {0, 0, 4, 0, 4}, (int[]) {4, 0, 0, 4, 0}  };
61   // phidoubleprime
62   int nn7 = 6; int kk7 = 5; int (*(GG7[])) = { (int[]) {1, 1, 0, 0, 0, 0}, (int[]) {1, 0, 1, 0, 0, 0}, (int[]) {1, 0, 0, 1, 0, 0}, (int[]) {1, 0, 0, 0, 1, 0}, (int[]) {1, 0, 0, 0, 0, 1}, (int[]) {1, 0, 0, 0, 0, 0} }; int (*(GGBar7[])) = { (int[]) {0, 1, 0, 0, 0, 0}, (int[]) {0, 0, 1, 0, 0, 0}, (int[]) {0, 0, 0, 1, 0, 0}, (int[]) {0, 0, 0, 0, 1, 0}, (int[]) {0, 0, 0, 0, 0, 1}, (int[]) {1, 1, 1, 1, 1, 1} }; int hh7[] = {1, 0, 0, 0, 0, 0}; int QQ7 = 0; int DD7[] = {0, 0, 0, 0, 0}; int (*(JJ7[])) = { (int[]) {0, 0, 4, 4, 0}, (int[]) {0, 0, 0, 4, 4}, (int[]) {4, 0, 0, 0, 4}, (int[]) {4, 4, 0, 0, 0}, (int[]) {0, 4, 4, 0, 0}  };
63
64   // b60 * b60
65   int n1 = nn1+nn1; int k1 = kk1+kk1; int **G1; int **GBar1; int *h1; int Q1; int *D1; int **J1;
66   G1 = calloc(nn1+nn1,sizeof(int*));
67   GBar1 = calloc(nn1+nn1,sizeof(int*));
68   h1 = calloc(nn1+nn1,sizeof(int));
69   D1 = calloc(kk1+kk1,sizeof(int));
70   J1 = calloc(kk1+kk1,sizeof(int*));
71   for(i=0; i<nn1+nn1; i++) {
72     G1[i] = calloc(nn1+nn1, sizeof(int)); GBar1[i] = calloc(nn1+nn1, sizeof(int));
73   }
74   for(i=0; i<kk1+kk1; i++)
75      J1[i] = calloc(kk1+kk1, sizeof(int));
76   //appendBlockMatrix(GG1, GG1, G1, nn1, nn1, nn1, nn1);
77   addSubMatrix(GG1, G1, kk1, nn1, 0, 0, 0, 0);
78   addSubMatrix(GG1, G1, kk1, nn1, 0, 0, kk1, nn1);
79   addSubMatrix(GG1, G1, nn1-kk1, nn1, kk1, 0, kk1+kk1, 0); // put the out-of-subspace vectors at the end
80   addSubMatrix(GG1, G1, nn1-kk1, nn1, kk1, 0, kk1+kk1+nn1-kk1, nn1);
81   //appendBlockMatrix(GGBar1, GGBar1, GBar1, nn1, nn1, nn1, nn1);
82   addSubMatrix(GGBar1, GBar1, kk1, nn1, 0, 0, 0, 0);
83   addSubMatrix(GGBar1, GBar1, kk1, nn1, 0, 0, kk1, nn1);
84   addSubMatrix(GGBar1, GBar1, nn1-kk1, nn1, kk1, 0, kk1+kk1, 0); // put the out-of-subspace vectors at the end
85   addSubMatrix(GGBar1, GBar1, nn1-kk1, nn1, kk1, 0, kk1+kk1+nn1-kk1, nn1);
86   appendVector(hh1, hh1, h1, nn1, nn1);
87   Q1 = (QQ1+QQ1);
88   appendVector(DD1, DD1, D1, kk1, kk1);
89   appendBlockMatrix(JJ1, JJ1, J1, kk1, kk1, kk1, kk1);
90   //addSubMatrix(JJ1, J1, kk1, kk1, 0, 0, 0, 0);
91   //addSubMatrix(JJ1, J1, kk1, kk1, 0, 0, kk1, kk1);
92
93   // b66 * b60
94   /*int n2 = nn1+nn2; int k2 = kk1+kk2; int **G2; int **GBar2; int *h2; int Q2; int *D2; int **J2;
95   G2 = calloc(nn1+nn2,sizeof(int*));
96   GBar2 = calloc(nn1+nn2,sizeof(int*));
97   h2 = calloc(nn1+nn2,sizeof(int));
98   D2 = calloc(kk1+kk2,sizeof(int));
99   J2 = calloc(kk1+kk2,sizeof(int*));
100   for(i=0; i<nn1+nn2; i++) {
101     G2[i] = calloc(nn1+nn2, sizeof(int)); GBar2[i] = calloc(nn1+nn2, sizeof(int));
102   }
103   for(i=0; i<kk1+kk2; i++)
104      J2[i] = calloc(kk1+kk2, sizeof(int));
105   //appendBlockMatrix(GG2, GG1, G2, nn2, nn2, nn1, nn1);
106   addSubMatrix(GG2, G2, kk2, nn2, 0, 0, 0, 0);
107   addSubMatrix(GG1, G2, kk1, nn1, 0, 0, kk2, nn2);
108   addSubMatrix(GG2, G2, nn2-kk2, nn2, kk2, 0, kk2+kk1, 0); // put the out-of-subspace vectors at the end
109   addSubMatrix(GG1, G2, nn1-kk1, nn1, kk1, 0, kk2+kk1+nn2-kk2, nn1);
110   //appendBlockMatrix(GGBar2, GGBar1, GBar2, nn2, nn2, nn1, nn1);
111   addSubMatrix(GGBar2, GBar2, kk2, nn2, 0, 0, 0, 0);
112   addSubMatrix(GGBar1, GBar2, kk1, nn1, 0, 0, kk2, nn2);
113   addSubMatrix(GGBar2, GBar2, nn2-kk2, nn2, kk2, 0, kk2+kk1, 0); // put the out-of-subspace vectors at the end
114   addSubMatrix(GGBar1, GBar2, nn1-kk1, nn1, kk1, 0, kk2+kk1+nn2-kk2, nn1);
115   appendVector(hh2, hh1, h2, nn2, nn1);
116   Q2 = (QQ1+QQ2);
117   appendVector(DD2, DD1, D2, kk2, kk1);
118   appendBlockMatrix(JJ2, JJ1, J2, kk2, kk2, kk1, kk1);*/
119
120   // e6 * b60
121   int n2 = nn1+nn3; int k2 = kk1+kk3; int **G2; int **GBar2; int *h2; int Q2; int *D2; int **J2;
122   G2 = calloc(nn1+nn3,sizeof(int*));
123   GBar2 = calloc(nn1+nn3,sizeof(int*));
124   h2 = calloc(nn1+nn3,sizeof(int));
125   D2 = calloc(kk1+kk3,sizeof(int));
126   J2 = calloc(kk1+kk3,sizeof(int*));
127   for(i=0; i<nn1+nn3; i++) {
128     G2[i] = calloc(nn1+nn3, sizeof(int)); GBar2[i] = calloc(nn1+nn3, sizeof(int));
129   }
130   for(i=0; i<kk1+kk3; i++)
131      J2[i] = calloc(kk1+kk3, sizeof(int));
132   //appendBlockMatrix(GG3, GG1, G3, nn3, nn3, nn1, nn1);
133   addSubMatrix(GG3, G2, kk3, nn3, 0, 0, 0, 0);
134   addSubMatrix(GG1, G2, kk1, nn1, 0, 0, kk3, nn3);
135   addSubMatrix(GG3, G2, nn3-kk3, nn3, kk3, 0, kk3+kk1, 0); // put the out-of-subspace vectors at the end
136   addSubMatrix(GG1, G2, nn1-kk1, nn1, kk1, 0, kk3+kk1+nn3-kk3, nn1);
137   //appendBlockMatrix(GGBar3, GGBar1, GBar3, nn3, nn3, nn1, nn1);
138   addSubMatrix(GGBar3, GBar2, kk3, nn3, 0, 0, 0, 0);
139   addSubMatrix(GGBar1, GBar2, kk1, nn1, 0, 0, kk3, nn3);
140   addSubMatrix(GGBar3, GBar2, nn3-kk3, nn3, kk3, 0, kk3+kk1, 0); // put the out-of-subspace vectors at the end
141   addSubMatrix(GGBar1, GBar2, nn1-kk1, nn1, kk1, 0, kk3+kk1+nn3-kk3, nn1);
142   appendVector(hh3, hh1, h2, nn3, nn1);
143   Q2 = (QQ1+QQ3);
144   appendVector(DD3, DD1, D2, kk3, kk1);
145   appendBlockMatrix(JJ3, JJ1, J2, kk3, kk3, kk1, kk1);
146   
147   // o6 * b60
148   int n3 = nn1+nn4; int k3 = kk1+kk4; int **G3; int **GBar3; int *h3; int Q3; int *D3; int **J3;
149   G3 = calloc(nn1+nn4,sizeof(int*));
150   GBar3 = calloc(nn1+nn4,sizeof(int*));
151   h3 = calloc(nn1+nn4,sizeof(int));
152   D3 = calloc(kk1+kk4,sizeof(int));
153   J3 = calloc(kk1+kk4,sizeof(int*));
154   for(i=0; i<nn1+nn4; i++) {
155     G3[i] = calloc(nn1+nn4, sizeof(int)); GBar3[i] = calloc(nn1+nn4, sizeof(int));
156   }
157   for(i=0; i<kk1+kk4; i++)
158      J3[i] = calloc(kk1+kk4, sizeof(int));
159   //appendBlockMatrix(GG4, GG1, G4, nn4, nn4, nn1, nn1);
160   addSubMatrix(GG4, G3, kk4, nn4, 0, 0, 0, 0);
161   addSubMatrix(GG1, G3, kk1, nn1, 0, 0, kk4, nn4);
162   addSubMatrix(GG4, G3, nn4-kk4, nn4, kk4, 0, kk4+kk1, 0); // put the out-of-subspace vectors at the end
163   addSubMatrix(GG1, G3, nn1-kk1, nn1, kk1, 0, kk4+kk1+nn4-kk4, nn1);
164   //appendBlockMatrix(GGBar4, GGBar1, GBar4, nn4, nn4, nn1, nn1);
165   addSubMatrix(GGBar4, GBar3, kk4, nn4, 0, 0, 0, 0);
166   addSubMatrix(GGBar1, GBar3, kk1, nn1, 0, 0, kk4, nn4);
167   addSubMatrix(GGBar4, GBar3, nn4-kk4, nn4, kk4, 0, kk4+kk1, 0); // put the out-of-subspace vectors at the end
168   addSubMatrix(GGBar1, GBar3, nn1-kk1, nn1, kk1, 0, kk4+kk1+nn4-kk4, nn1);
169   appendVector(hh4, hh1, h3, nn4, nn1);
170   Q3 = (QQ1+QQ4);
171   appendVector(DD4, DD1, D3, kk4, kk1);
172   appendBlockMatrix(JJ4, JJ1, J3, kk4, kk4, kk1, kk1);
173
174   // k6 * b60
175   int n4 = nn1+nn5; int k4 = kk1+kk5; int **G4; int **GBar4; int *h4; int Q4; int *D4; int **J4;
176   G4 = calloc(nn1+nn5,sizeof(int*));
177   GBar4 = calloc(nn1+nn5,sizeof(int*));
178   h4 = calloc(nn1+nn5,sizeof(int));
179   D4 = calloc(kk1+kk5,sizeof(int));
180   J4 = calloc(kk1+kk5,sizeof(int*));
181   for(i=0; i<nn1+nn5; i++) {
182     G4[i] = calloc(nn1+nn5, sizeof(int)); GBar4[i] = calloc(nn1+nn5, sizeof(int));
183   }
184   for(i=0; i<kk1+kk5; i++)
185      J4[i] = calloc(kk1+kk5, sizeof(int));
186   //appendBlockMatrix(GG5, GG1, G5, nn5, nn5, nn1, nn1);
187   addSubMatrix(GG5, G4, kk5, nn5, 0, 0, 0, 0);
188   addSubMatrix(GG1, G4, kk1, nn1, 0, 0, kk5, nn5);
189   addSubMatrix(GG5, G4, nn5-kk5, nn5, kk5, 0, kk5+kk1, 0); // put the out-of-subspace vectors at the end
190   addSubMatrix(GG1, G4, nn1-kk1, nn1, kk1, 0, kk5+kk1+nn5-kk5, nn1);
191   //appendBlockMatrix(GGBar5, GGBar1, GBar5, nn5, nn5, nn1, nn1);
192   addSubMatrix(GGBar5, GBar4, kk5, nn5, 0, 0, 0, 0);
193   addSubMatrix(GGBar1, GBar4, kk1, nn1, 0, 0, kk5, nn5);
194   addSubMatrix(GGBar5, GBar4, nn5-kk5, nn5, kk5, 0, kk5+kk1, 0); // put the out-of-subspace vectors at the end
195   addSubMatrix(GGBar1, GBar4, nn1-kk1, nn1, kk1, 0, kk5+kk1+nn5-kk5, nn1);
196   appendVector(hh5, hh1, h4, nn5, nn1);
197   Q4 = (QQ1+QQ5);
198   appendVector(DD5, DD1, D4, kk5, kk1);
199   appendBlockMatrix(JJ5, JJ1, J4, kk5, kk5, kk1, kk1);
200
201   // phiprime * b60 
202   int n5 = nn1+nn6; int k5 = kk1+kk6; int **G5; int **GBar5; int *h5; int Q5; int *D5; int **J5;
203   G5 = calloc(nn1+nn6,sizeof(int*));
204   GBar5 = calloc(nn1+nn6,sizeof(int*));
205   h5 = calloc(nn1+nn6,sizeof(int));
206   D5 = calloc(kk1+kk6,sizeof(int));
207   J5 = calloc(kk1+kk6,sizeof(int*));
208   for(i=0; i<nn1+nn6; i++) {
209     G5[i] = calloc(nn1+nn6, sizeof(int)); GBar5[i] = calloc(nn1+nn6, sizeof(int));
210   }
211   for(i=0; i<kk1+kk6; i++)
212      J5[i] = calloc(kk1+kk6, sizeof(int));
213   //appendBlockMatrix(GG6, GG1, G6, nn6, nn6, nn1, nn1);
214   addSubMatrix(GG6, G5, kk6, nn6, 0, 0, 0, 0);
215   addSubMatrix(GG1, G5, kk1, nn1, 0, 0, kk6, nn6);
216   addSubMatrix(GG6, G5, nn6-kk6, nn6, kk6, 0, kk6+kk1, 0); // put the out-of-subspace vectors at the end
217   addSubMatrix(GG1, G5, nn1-kk1, nn1, kk1, 0, kk6+kk1+nn6-kk6, nn1);
218   //appendBlockMatrix(GGBar6, GGBar1, GBar6, nn6, nn6, nn1, nn1);
219   addSubMatrix(GGBar6, GBar5, kk6, nn6, 0, 0, 0, 0);
220   addSubMatrix(GGBar1, GBar5, kk1, nn1, 0, 0, kk6, nn6);
221   addSubMatrix(GGBar6, GBar5, nn6-kk6, nn6, kk6, 0, kk6+kk1, 0); // put the out-of-subspace vectors at the end
222   addSubMatrix(GGBar1, GBar5, nn1-kk1, nn1, kk1, 0, kk6+kk1+nn6-kk6, nn1);
223   appendVector(hh6, hh1, h5, nn6, nn1);
224   Q5 = (QQ1+QQ6);
225   appendVector(DD6, DD1, D5, kk6, kk1);
226   appendBlockMatrix(JJ6, JJ1, J5, kk6, kk6, kk1, kk1);
227   
228   // phidprime * b60
229   int n6 = nn1+nn7; int k6 = kk1+kk7; int **G6; int **GBar6; int *h6; int Q6; int *D6; int **J6;
230   G6 = calloc(nn1+nn7,sizeof(int*));
231   GBar6 = calloc(nn1+nn7,sizeof(int*));
232   h6 = calloc(nn1+nn7,sizeof(int));
233   D6 = calloc(kk1+kk7,sizeof(int));
234   J6 = calloc(kk1+kk7,sizeof(int*));
235   for(i=0; i<nn1+nn7; i++) {
236     G6[i] = calloc(nn1+nn7, sizeof(int)); GBar6[i] = calloc(nn1+nn7, sizeof(int));
237   }
238   for(i=0; i<kk1+kk7; i++)
239      J6[i] = calloc(kk1+kk7, sizeof(int));
240   //appendBlockMatrix(GG7, GG1, G7, nn7, nn7, nn1, nn1);
241   addSubMatrix(GG7, G6, kk7, nn7, 0, 0, 0, 0);
242   addSubMatrix(GG1, G6, kk1, nn1, 0, 0, kk7, nn7);
243   addSubMatrix(GG7, G6, nn7-kk7, nn7, kk7, 0, kk7+kk1, 0); // put the out-of-subspace vectors at the end
244   addSubMatrix(GG1, G6, nn1-kk1, nn1, kk1, 0, kk7+kk1+nn7-kk7, nn1);
245   //appendBlockMatrix(GGBar7, GGBar1, GBar7, nn7, nn7, nn1, nn1);
246   addSubMatrix(GGBar7, GBar6, kk7, nn7, 0, 0, 0, 0);
247   addSubMatrix(GGBar1, GBar6, kk1, nn1, 0, 0, kk7, nn7);
248   addSubMatrix(GGBar7, GBar6, nn7-kk7, nn7, kk7, 0, kk7+kk1, 0); // put the out-of-subspace vectors at the end
249   addSubMatrix(GGBar1, GBar6, nn1-kk1, nn1, kk1, 0, kk7+kk1+nn7-kk7, nn1);
250   appendVector(hh7, hh1, h6, nn7, nn1);
251   Q6 = (QQ1+QQ7);
252   appendVector(DD7, DD1, D6, kk7, kk1);
253   appendBlockMatrix(JJ7, JJ1, J6, kk7, kk7, kk1, kk1);
254
255   // b60 * b66
256   /*int n8 = nn2+nn1; int k8 = kk2+kk1; int **G8; int **GBar8; int *h8; int Q8; int *D8; int **J8;
257   G8 = calloc(nn2+nn1,sizeof(int*));
258   GBar8 = calloc(nn2+nn1,sizeof(int*));
259   h8 = calloc(nn2+nn1,sizeof(int));
260   D8 = calloc(kk2+kk1,sizeof(int));
261   J8 = calloc(kk2+kk1,sizeof(int*));
262   for(i=0; i<nn2+nn1; i++) {
263     G8[i] = calloc(nn2+nn1, sizeof(int)); GBar8[i] = calloc(nn2+nn1, sizeof(int));
264   }
265   for(i=0; i<kk2+kk1; i++)
266      J8[i] = calloc(kk2+kk1, sizeof(int));
267   //appendBlockMatrix(GG1, GG2, G8, nn1, nn1, nn2, nn2);
268   addSubMatrix(GG1, G8, kk1, nn1, 0, 0, 0, 0);
269   addSubMatrix(GG2, G8, kk2, nn2, 0, 0, kk1, nn1);
270   addSubMatrix(GG1, G8, nn1-kk1, nn1, kk1, 0, kk1+kk2, 0); // put the out-of-subspace vectors at the end
271   addSubMatrix(GG2, G8, nn2-kk2, nn2, kk2, 0, kk1+kk2+nn1-kk1, nn2);
272   //appendBlockMatrix(GGBar1, GGBar2, GBar8, nn1, nn1, nn2, nn2);
273   addSubMatrix(GGBar1, GBar8, kk1, nn1, 0, 0, 0, 0);
274   addSubMatrix(GGBar2, GBar8, kk2, nn2, 0, 0, kk1, nn1);
275   addSubMatrix(GGBar1, GBar8, nn1-kk1, nn1, kk1, 0, kk1+kk2, 0); // put the out-of-subspace vectors at the end
276   addSubMatrix(GGBar2, GBar8, nn2-kk2, nn2, kk2, 0, kk1+kk2+nn1-kk1, nn2);
277   appendVector(hh1, hh2, h8, nn1, nn2);
278   Q8 = (QQ2+QQ1);
279   appendVector(DD1, DD2, D8, kk1, kk2);
280   appendBlockMatrix(JJ1, JJ2, J8, kk1, kk1, kk2, kk2);*/
281
282   // b66 * b66
283   int n7 = nn2+nn2; int k7 = kk2+kk2; int **G7; int **GBar7; int *h7; int Q7; int *D7; int **J7;
284   G7 = calloc(nn2+nn2,sizeof(int*));
285   GBar7 = calloc(nn2+nn2,sizeof(int*));
286   h7 = calloc(nn2+nn2,sizeof(int));
287   D7 = calloc(kk2+kk2,sizeof(int));
288   J7 = calloc(kk2+kk2,sizeof(int*));
289   for(i=0; i<nn2+nn2; i++) {
290     G7[i] = calloc(nn2+nn2, sizeof(int)); GBar7[i] = calloc(nn2+nn2, sizeof(int));
291   }
292   for(i=0; i<kk2+kk2; i++)
293      J7[i] = calloc(kk2+kk2, sizeof(int));
294   //appendBlockMatrix(GG2, GG2, G9, nn2, nn2, nn2, nn2);
295   addSubMatrix(GG2, G7, kk2, nn2, 0, 0, 0, 0);
296   addSubMatrix(GG2, G7, kk2, nn2, 0, 0, kk2, nn2);
297   addSubMatrix(GG2, G7, nn2-kk2, nn2, kk2, 0, kk2+kk2, 0); // put the out-of-subspace vectors at the end
298   addSubMatrix(GG2, G7, nn2-kk2, nn2, kk2, 0, kk2+kk2+nn2-kk2, nn2);
299   //appendBlockMatrix(GGBar2, GGBar2, GBar9, nn2, nn2, nn2, nn2);
300   addSubMatrix(GGBar2, GBar7, kk2, nn2, 0, 0, 0, 0);
301   addSubMatrix(GGBar2, GBar7, kk2, nn2, 0, 0, kk2, nn2);
302   addSubMatrix(GGBar2, GBar7, nn2-kk2, nn2, kk2, 0, kk2+kk2, 0); // put the out-of-subspace vectors at the end
303   addSubMatrix(GGBar2, GBar7, nn2-kk2, nn2, kk2, 0, kk2+kk2+nn2-kk2, nn2);
304   appendVector(hh2, hh2, h7, nn2, nn2);
305   Q7 = (QQ2+QQ2);
306   appendVector(DD2, DD2, D7, kk2, kk2);
307   appendBlockMatrix(JJ2, JJ2, J7, kk2, kk2, kk2, kk2);
308
309   // e6 * b66
310   int n8 = nn2+nn3; int k8 = kk2+kk3; int **G8; int **GBar8; int *h8; int Q8; int *D8; int **J8;
311   G8 = calloc(nn2+nn3,sizeof(int*));
312   GBar8 = calloc(nn2+nn3,sizeof(int*));
313   h8 = calloc(nn2+nn3,sizeof(int));
314   D8 = calloc(kk2+kk3,sizeof(int));
315   J8 = calloc(kk2+kk3,sizeof(int*));
316   for(i=0; i<nn2+nn3; i++) {
317     G8[i] = calloc(nn2+nn3, sizeof(int)); GBar8[i] = calloc(nn2+nn3, sizeof(int));
318   }
319   for(i=0; i<kk2+kk3; i++)
320      J8[i] = calloc(kk2+kk3, sizeof(int));
321   //appendBlockMatrix(GG3, GG2, G10, nn3, nn3, nn2, nn2);
322   addSubMatrix(GG3, G8, kk3, nn3, 0, 0, 0, 0);
323   addSubMatrix(GG2, G8, kk2, nn2, 0, 0, kk3, nn3);
324   addSubMatrix(GG3, G8, nn3-kk3, nn3, kk3, 0, kk3+kk2, 0); // put the out-of-subspace vectors at the end
325   addSubMatrix(GG2, G8, nn2-kk2, nn2, kk2, 0, kk3+kk2+nn3-kk3, nn2);
326   //appendBlockMatrix(GGBar3, GGBar2, GBar10, nn3, nn3, nn2, nn2);
327   addSubMatrix(GGBar3, GBar8, kk3, nn3, 0, 0, 0, 0);
328   addSubMatrix(GGBar2, GBar8, kk2, nn2, 0, 0, kk3, nn3);
329   addSubMatrix(GGBar3, GBar8, nn3-kk3, nn3, kk3, 0, kk3+kk2, 0); // put the out-of-subspace vectors at the end
330   addSubMatrix(GGBar2, GBar8, nn2-kk2, nn2, kk2, 0, kk3+kk2+nn3-kk3, nn2);
331   appendVector(hh3, hh2, h8, nn3, nn2);
332   Q8 = (QQ2+QQ3);
333   appendVector(DD3, DD2, D8, kk3, kk2);
334   appendBlockMatrix(JJ3, JJ2, J8, kk3, kk3, kk2, kk2);
335
336   // o6 * b66
337   int n9 = nn2+nn4; int k9 = kk2+kk4; int **G9; int **GBar9; int *h9; int Q9; int *D9; int **J9;
338   G9 = calloc(nn2+nn4,sizeof(int*));
339   GBar9 = calloc(nn2+nn4,sizeof(int*));
340   h9 = calloc(nn2+nn4,sizeof(int));
341   D9 = calloc(kk2+kk4,sizeof(int));
342   J9 = calloc(kk2+kk4,sizeof(int*));
343   for(i=0; i<nn2+nn4; i++) {
344     G9[i] = calloc(nn2+nn4, sizeof(int)); GBar9[i] = calloc(nn2+nn4, sizeof(int));
345   }
346   for(i=0; i<kk2+kk4; i++)
347      J9[i] = calloc(kk2+kk4, sizeof(int));
348   //appendBlockMatrix(GG4, GG2, G11, nn4, nn4, nn2, nn2);
349   addSubMatrix(GG4, G9, kk4, nn4, 0, 0, 0, 0);
350   addSubMatrix(GG2, G9, kk2, nn2, 0, 0, kk4, nn4);
351   addSubMatrix(GG4, G9, nn4-kk4, nn4, kk4, 0, kk4+kk2, 0); // put the out-of-subspace vectors at the end
352   addSubMatrix(GG2, G9, nn2-kk2, nn2, kk2, 0, kk4+kk2+nn4-kk4, nn2);
353   //appendBlockMatrix(GGBar4, GGBar2, GBar11, nn4, nn4, nn2, nn2);
354   addSubMatrix(GGBar4, GBar9, kk4, nn4, 0, 0, 0, 0);
355   addSubMatrix(GGBar2, GBar9, kk2, nn2, 0, 0, kk4, nn4);
356   addSubMatrix(GGBar4, GBar9, nn4-kk4, nn4, kk4, 0, kk4+kk2, 0); // put the out-of-subspace vectors at the end
357   addSubMatrix(GGBar2, GBar9, nn2-kk2, nn2, kk2, 0, kk4+kk2+nn4-kk4, nn2);
358   appendVector(hh4, hh2, h9, nn4, nn2);
359   Q9 = (QQ2+QQ4);
360   appendVector(DD4, DD2, D9, kk4, kk2);
361   appendBlockMatrix(JJ4, JJ2, J9, kk4, kk4, kk2, kk2);
362
363   // k6 * b66
364   int n10 = nn2+nn5; int k10 = kk2+kk5; int **G10; int **GBar10; int *h10; int Q10; int *D10; int **J10;
365   G10 = calloc(nn2+nn5,sizeof(int*));
366   GBar10 = calloc(nn2+nn5,sizeof(int*));
367   h10 = calloc(nn2+nn5,sizeof(int));
368   D10 = calloc(kk2+kk5,sizeof(int));
369   J10 = calloc(kk2+kk5,sizeof(int*));
370   for(i=0; i<nn2+nn5; i++) {
371     G10[i] = calloc(nn2+nn5, sizeof(int)); GBar10[i] = calloc(nn2+nn5, sizeof(int));
372   }
373   for(i=0; i<kk2+kk5; i++)
374      J10[i] = calloc(kk2+kk5, sizeof(int));
375   //appendBlockMatrix(GG5, GG2, G12, nn5, nn5, nn2, nn2);
376   addSubMatrix(GG5, G10, kk5, nn5, 0, 0, 0, 0);
377   addSubMatrix(GG2, G10, kk2, nn2, 0, 0, kk5, nn5);
378   addSubMatrix(GG5, G10, nn5-kk5, nn5, kk5, 0, kk5+kk2, 0); // put the out-of-subspace vectors at the end
379   addSubMatrix(GG2, G10, nn2-kk2, nn2, kk2, 0, kk5+kk2+nn5-kk5, nn2);
380   //appendBlockMatrix(GGBar5, GGBar2, GBar12, nn5, nn5, nn2, nn2);
381   addSubMatrix(GGBar5, GBar10, kk5, nn5, 0, 0, 0, 0);
382   addSubMatrix(GGBar2, GBar10, kk2, nn2, 0, 0, kk5, nn5);
383   addSubMatrix(GGBar5, GBar10, nn5-kk5, nn5, kk5, 0, kk5+kk2, 0); // put the out-of-subspace vectors at the end
384   addSubMatrix(GGBar2, GBar10, nn2-kk2, nn2, kk2, 0, kk5+kk2+nn5-kk5, nn2);
385   appendVector(hh5, hh2, h10, nn5, nn2);
386   Q10 = (QQ2+QQ5);
387   appendVector(DD5, DD2, D10, kk5, kk2);
388   appendBlockMatrix(JJ5, JJ2, J10, kk5, kk5, kk2, kk2);
389   
390   // phiprime * b66
391   int n11 = nn2+nn6; int k11 = kk2+kk6; int **G11; int **GBar11; int *h11; int Q11; int *D11; int **J11;
392   G11 = calloc(nn2+nn6,sizeof(int*));
393   GBar11 = calloc(nn2+nn6,sizeof(int*));
394   h11 = calloc(nn2+nn6,sizeof(int));
395   D11 = calloc(kk2+kk6,sizeof(int));
396   J11 = calloc(kk2+kk6,sizeof(int*));
397   for(i=0; i<nn2+nn6; i++) {
398     G11[i] = calloc(nn2+nn6, sizeof(int)); GBar11[i] = calloc(nn2+nn6, sizeof(int));
399   }
400   for(i=0; i<kk2+kk6; i++)
401      J11[i] = calloc(kk2+kk6, sizeof(int));
402   //appendBlockMatrix(GG6, GG2, G13, nn6, nn6, nn2, nn2);
403   addSubMatrix(GG6, G11, kk6, nn6, 0, 0, 0, 0);
404   addSubMatrix(GG2, G11, kk2, nn2, 0, 0, kk6, nn6);
405   addSubMatrix(GG6, G11, nn6-kk6, nn6, kk6, 0, kk6+kk2, 0); // put the out-of-subspace vectors at the end
406   addSubMatrix(GG2, G11, nn2-kk2, nn2, kk2, 0, kk6+kk2+nn6-kk6, nn2);
407   //appendBlockMatrix(GGBar6, GGBar2, GBar13, nn6, nn6, nn2, nn2);
408   addSubMatrix(GGBar6, GBar11, kk6, nn6, 0, 0, 0, 0);
409   addSubMatrix(GGBar2, GBar11, kk2, nn2, 0, 0, kk6, nn6);
410   addSubMatrix(GGBar6, GBar11, nn6-kk6, nn6, kk6, 0, kk6+kk2, 0); // put the out-of-subspace vectors at the end
411   addSubMatrix(GGBar2, GBar11, nn2-kk2, nn2, kk2, 0, kk6+kk2+nn6-kk6, nn2);
412   appendVector(hh6, hh2, h11, nn6, nn2);
413   Q11 = (QQ2+QQ6);
414   appendVector(DD6, DD2, D11, kk6, kk2);
415   appendBlockMatrix(JJ6, JJ2, J11, kk6, kk6, kk2, kk2);
416
417   // phidprime * b66
418   int n12 = nn2+nn7; int k12 = kk2+kk7; int **G12; int **GBar12; int *h12; int Q12; int *D12; int **J12;
419   G12 = calloc(nn2+nn7,sizeof(int*));
420   GBar12 = calloc(nn2+nn7,sizeof(int*));
421   h12 = calloc(nn2+nn7,sizeof(int));
422   D12 = calloc(kk2+kk7,sizeof(int));
423   J12 = calloc(kk2+kk7,sizeof(int*));
424   for(i=0; i<nn2+nn7; i++) {
425     G12[i] = calloc(nn2+nn7, sizeof(int)); GBar12[i] = calloc(nn2+nn7, sizeof(int));
426   }
427   for(i=0; i<kk2+kk7; i++)
428      J12[i] = calloc(kk2+kk7, sizeof(int));
429   //appendBlockMatrix(GG7, GG2, G14, nn7, nn7, nn2, nn2);
430   addSubMatrix(GG7, G12, kk7, nn7, 0, 0, 0, 0);
431   addSubMatrix(GG2, G12, kk2, nn2, 0, 0, kk7, nn7);
432   addSubMatrix(GG7, G12, nn7-kk7, nn7, kk7, 0, kk7+kk2, 0); // put the out-of-subspace vectors at the end
433   addSubMatrix(GG2, G12, nn2-kk2, nn2, kk2, 0, kk7+kk2+nn7-kk7, nn2);
434   //appendBlockMatrix(GGBar7, GGBar2, GBar14, nn7, nn7, nn2, nn2);
435   addSubMatrix(GGBar7, GBar12, kk7, nn7, 0, 0, 0, 0);
436   addSubMatrix(GGBar2, GBar12, kk2, nn2, 0, 0, kk7, nn7);
437   addSubMatrix(GGBar7, GBar12, nn7-kk7, nn7, kk7, 0, kk7+kk2, 0); // put the out-of-subspace vectors at the end
438   addSubMatrix(GGBar2, GBar12, nn2-kk2, nn2, kk2, 0, kk7+kk2+nn7-kk7, nn2);
439   appendVector(hh7, hh2, h12, nn7, nn2);
440   Q12 = (QQ2+QQ7);
441   appendVector(DD7, DD2, D12, kk7, kk2);
442   appendBlockMatrix(JJ7, JJ2, J12, kk7, kk7, kk2, kk2);
443
444   // b60 * e6
445   int n13 = nn3+nn1; int k13 = kk3+kk1; int **G13; int **GBar13; int *h13; int Q13; int *D13; int **J13;
446   G13 = calloc(nn3+nn1,sizeof(int*));
447   GBar13 = calloc(nn3+nn1,sizeof(int*));
448   h13 = calloc(nn3+nn1,sizeof(int));
449   D13 = calloc(kk3+kk1,sizeof(int));
450   J13 = calloc(kk3+kk1,sizeof(int*));
451   for(i=0; i<nn3+nn1; i++) {
452     G13[i] = calloc(nn3+nn1, sizeof(int)); GBar13[i] = calloc(nn3+nn1, sizeof(int));
453   }
454   for(i=0; i<kk3+kk1; i++)
455      J13[i] = calloc(kk3+kk1, sizeof(int));
456   //appendBlockMatrix(GG1, GG3, G15, nn1, nn1, nn3, nn3);
457   addSubMatrix(GG1, G13, kk1, nn1, 0, 0, 0, 0);
458   addSubMatrix(GG3, G13, kk3, nn3, 0, 0, kk1, nn1);
459   addSubMatrix(GG1, G13, nn1-kk1, nn1, kk1, 0, kk1+kk3, 0); // put the out-of-subspace vectors at the end
460   addSubMatrix(GG3, G13, nn3-kk3, nn3, kk3, 0, kk1+kk3+nn1-kk1, nn3);
461   //appendBlockMatrix(GGBar1, GGBar3, GBar15, nn1, nn1, nn3, nn3);
462   addSubMatrix(GGBar1, GBar13, kk1, nn1, 0, 0, 0, 0);
463   addSubMatrix(GGBar3, GBar13, kk3, nn3, 0, 0, kk1, nn1);
464   addSubMatrix(GGBar1, GBar13, nn1-kk1, nn1, kk1, 0, kk1+kk3, 0); // put the out-of-subspace vectors at the end
465   addSubMatrix(GGBar3, GBar13, nn3-kk3, nn3, kk3, 0, kk1+kk3+nn1-kk1, nn3);
466   appendVector(hh1, hh3, h13, nn1, nn3);
467   Q13 = (QQ3+QQ1);
468   appendVector(DD1, DD3, D13, kk1, kk3);
469   appendBlockMatrix(JJ1, JJ3, J13, kk1, kk1, kk3, kk3);
470
471   // b66 * e6
472   int n14 = nn3+nn2; int k14 = kk3+kk2; int **G14; int **GBar14; int *h14; int Q14; int *D14; int **J14;
473   G14 = calloc(nn3+nn2,sizeof(int*));
474   GBar14 = calloc(nn3+nn2,sizeof(int*));
475   h14 = calloc(nn3+nn2,sizeof(int));
476   D14 = calloc(kk3+kk2,sizeof(int));
477   J14 = calloc(kk3+kk2,sizeof(int*));
478   for(i=0; i<nn3+nn2; i++) {
479     G14[i] = calloc(nn3+nn2, sizeof(int)); GBar14[i] = calloc(nn3+nn2, sizeof(int));
480   }
481   for(i=0; i<kk3+kk2; i++)
482      J14[i] = calloc(kk3+kk2, sizeof(int));
483   //appendBlockMatrix(GG2, GG3, G16, nn2, nn2, nn3, nn3);
484   addSubMatrix(GG2, G14, kk2, nn2, 0, 0, 0, 0);
485   addSubMatrix(GG3, G14, kk3, nn3, 0, 0, kk2, nn2);
486   addSubMatrix(GG2, G14, nn2-kk2, nn2, kk2, 0, kk2+kk3, 0); // put the out-of-subspace vectors at the end
487   addSubMatrix(GG3, G14, nn3-kk3, nn3, kk3, 0, kk2+kk3+nn2-kk2, nn3);
488   //appendBlockMatrix(GGBar2, GGBar3, GBar16, nn2, nn2, nn3, nn3);
489   addSubMatrix(GGBar2, GBar14, kk2, nn2, 0, 0, 0, 0);
490   addSubMatrix(GGBar3, GBar14, kk3, nn3, 0, 0, kk2, nn2);
491   addSubMatrix(GGBar2, GBar14, nn2-kk2, nn2, kk2, 0, kk2+kk3, 0); // put the out-of-subspace vectors at the end
492   addSubMatrix(GGBar3, GBar14, nn3-kk3, nn3, kk3, 0, kk2+kk3+nn2-kk2, nn3);
493   appendVector(hh2, hh3, h14, nn2, nn3);
494   Q14 = (QQ3+QQ2);
495   appendVector(DD2, DD3, D14, kk2, kk3);
496   appendBlockMatrix(JJ2, JJ3, J14, kk2, kk2, kk3, kk3);
497
498   // e6 * e6
499   int n15 = nn3+nn3; int k15 = kk3+kk3; int **G15; int **GBar15; int *h15; int Q15; int *D15; int **J15;
500   G15 = calloc(nn3+nn3,sizeof(int*));
501   GBar15 = calloc(nn3+nn3,sizeof(int*));
502   h15 = calloc(nn3+nn3,sizeof(int));
503   D15 = calloc(kk3+kk3,sizeof(int));
504   J15 = calloc(kk3+kk3,sizeof(int*));
505   for(i=0; i<nn3+nn3; i++) {
506     G15[i] = calloc(nn3+nn3, sizeof(int)); GBar15[i] = calloc(nn3+nn3, sizeof(int));
507   }
508   for(i=0; i<kk3+kk3; i++)
509      J15[i] = calloc(kk3+kk3, sizeof(int));
510   //appendBlockMatrix(GG3, GG3, G17, nn3, nn3, nn3, nn3);
511   addSubMatrix(GG3, G15, kk3, nn3, 0, 0, 0, 0);
512   addSubMatrix(GG3, G15, kk3, nn3, 0, 0, kk3, nn3);
513   addSubMatrix(GG3, G15, nn3-kk3, nn3, kk3, 0, kk3+kk3, 0); // put the out-of-subspace vectors at the end
514   addSubMatrix(GG3, G15, nn3-kk3, nn3, kk3, 0, kk3+kk3+nn3-kk3, nn3);
515   //appendBlockMatrix(GGBar3, GGBar3, GBar17, nn3, nn3, nn3, nn3);
516   addSubMatrix(GGBar3, GBar15, kk3, nn3, 0, 0, 0, 0);
517   addSubMatrix(GGBar3, GBar15, kk3, nn3, 0, 0, kk3, nn3);
518   addSubMatrix(GGBar3, GBar15, nn3-kk3, nn3, kk3, 0, kk3+kk3, 0); // put the out-of-subspace vectors at the end
519   addSubMatrix(GGBar3, GBar15, nn3-kk3, nn3, kk3, 0, kk3+kk3+nn3-kk3, nn3);
520   appendVector(hh3, hh3, h15, nn3, nn3);
521   Q15 = (QQ3+QQ3);
522   appendVector(DD3, DD3, D15, kk3, kk3);
523   appendBlockMatrix(JJ3, JJ3, J15, kk3, kk3, kk3, kk3);
524
525   // o6 * e6
526   /*int n18 = nn3+nn4; int k18 = kk3+kk4; int **G18; int **GBar18; int *h18; int Q18; int *D18; int **J18;
527   G18 = calloc(nn3+nn4,sizeof(int*));
528   GBar18 = calloc(nn3+nn4,sizeof(int*));
529   h18 = calloc(nn3+nn4,sizeof(int));
530   D18 = calloc(kk3+kk4,sizeof(int));
531   J18 = calloc(kk3+kk4,sizeof(int*));
532   for(i=0; i<nn3+nn4; i++) {
533     G18[i] = calloc(nn3+nn4, sizeof(int)); GBar18[i] = calloc(nn3+nn4, sizeof(int));
534   }
535   for(i=0; i<kk3+kk4; i++)
536      J18[i] = calloc(kk3+kk4, sizeof(int));
537   //appendBlockMatrix(GG4, GG3, G18, nn4, nn4, nn3, nn3);
538   addSubMatrix(GG4, G18, kk4, nn4, 0, 0, 0, 0);
539   addSubMatrix(GG3, G18, kk3, nn3, 0, 0, kk4, nn4);
540   addSubMatrix(GG4, G18, nn4-kk4, nn4, kk4, 0, kk4+kk3, 0); // put the out-of-subspace vectors at the end
541   addSubMatrix(GG3, G18, nn3-kk3, nn3, kk3, 0, kk4+kk3+nn4-kk4, nn3);
542   //appendBlockMatrix(GGBar4, GGBar3, GBar18, nn4, nn4, nn3, nn3);
543   addSubMatrix(GGBar4, GBar18, kk4, nn4, 0, 0, 0, 0);
544   addSubMatrix(GGBar3, GBar18, kk3, nn3, 0, 0, kk4, nn4);
545   addSubMatrix(GGBar4, GBar18, nn4-kk4, nn4, kk4, 0, kk4+kk3, 0); // put the out-of-subspace vectors at the end
546   addSubMatrix(GGBar3, GBar18, nn3-kk3, nn3, kk3, 0, kk4+kk3+nn4-kk4, nn3);
547   appendVector(hh4, hh3, h18, nn4, nn3);
548   Q18 = (QQ3+QQ4);
549   appendVector(DD4, DD3, D18, kk4, kk3);
550   appendBlockMatrix(JJ4, JJ3, J18, kk4, kk4, kk3, kk3);*/
551
552   // k6 * e6
553   int n16 = nn3+nn5; int k16 = kk3+kk5; int **G16; int **GBar16; int *h16; int Q16; int *D16; int **J16;
554   G16 = calloc(nn3+nn5,sizeof(int*));
555   GBar16 = calloc(nn3+nn5,sizeof(int*));
556   h16 = calloc(nn3+nn5,sizeof(int));
557   D16 = calloc(kk3+kk5,sizeof(int));
558   J16 = calloc(kk3+kk5,sizeof(int*));
559   for(i=0; i<nn3+nn5; i++) {
560     G16[i] = calloc(nn3+nn5, sizeof(int)); GBar16[i] = calloc(nn3+nn5, sizeof(int));
561   }
562   for(i=0; i<kk3+kk5; i++)
563      J16[i] = calloc(kk3+kk5, sizeof(int));
564   //appendBlockMatrix(GG5, GG3, G19, nn5, nn5, nn3, nn3);
565   addSubMatrix(GG5, G16, kk5, nn5, 0, 0, 0, 0);
566   addSubMatrix(GG3, G16, kk3, nn3, 0, 0, kk5, nn5);
567   addSubMatrix(GG5, G16, nn5-kk5, nn5, kk5, 0, kk5+kk3, 0); // put the out-of-subspace vectors at the end
568   addSubMatrix(GG3, G16, nn3-kk3, nn3, kk3, 0, kk5+kk3+nn5-kk5, nn3);
569   //appendBlockMatrix(GGBar5, GGBar3, GBar19, nn5, nn5, nn3, nn3);
570   addSubMatrix(GGBar5, GBar16, kk5, nn5, 0, 0, 0, 0);
571   addSubMatrix(GGBar3, GBar16, kk3, nn3, 0, 0, kk5, nn5);
572   addSubMatrix(GGBar5, GBar16, nn5-kk5, nn5, kk5, 0, kk5+kk3, 0); // put the out-of-subspace vectors at the end
573   addSubMatrix(GGBar3, GBar16, nn3-kk3, nn3, kk3, 0, kk5+kk3+nn5-kk5, nn3);
574   appendVector(hh5, hh3, h16, nn5, nn3);
575   Q16 = (QQ3+QQ5);
576   appendVector(DD5, DD3, D16, kk5, kk3);
577   appendBlockMatrix(JJ5, JJ3, J16, kk5, kk5, kk3, kk3);
578   
579   // phiprime * e6
580   int n17 = nn3+nn6; int k17 = kk3+kk6; int **G17; int **GBar17; int *h17; int Q17; int *D17; int **J17;
581   G17 = calloc(nn3+nn6,sizeof(int*));
582   GBar17 = calloc(nn3+nn6,sizeof(int*));
583   h17 = calloc(nn3+nn6,sizeof(int));
584   D17 = calloc(kk3+kk6,sizeof(int));
585   J17 = calloc(kk3+kk6,sizeof(int*));
586   for(i=0; i<nn3+nn6; i++) {
587     G17[i] = calloc(nn3+nn6, sizeof(int)); GBar17[i] = calloc(nn3+nn6, sizeof(int));
588   }
589   for(i=0; i<kk3+kk6; i++)
590      J17[i] = calloc(kk3+kk6, sizeof(int));
591   //appendBlockMatrix(GG6, GG3, G20, nn6, nn6, nn3, nn3);
592   addSubMatrix(GG6, G17, kk6, nn6, 0, 0, 0, 0);
593   addSubMatrix(GG3, G17, kk3, nn3, 0, 0, kk6, nn6);
594   addSubMatrix(GG6, G17, nn6-kk6, nn6, kk6, 0, kk6+kk3, 0); // put the out-of-subspace vectors at the end
595   addSubMatrix(GG3, G17, nn3-kk3, nn3, kk3, 0, kk6+kk3+nn6-kk6, nn3);
596   //appendBlockMatrix(GGBar6, GGBar3, GBar20, nn6, nn6, nn3, nn3);
597   addSubMatrix(GGBar6, GBar17, kk6, nn6, 0, 0, 0, 0);
598   addSubMatrix(GGBar3, GBar17, kk3, nn3, 0, 0, kk6, nn6);
599   addSubMatrix(GGBar6, GBar17, nn6-kk6, nn6, kk6, 0, kk6+kk3, 0); // put the out-of-subspace vectors at the end
600   addSubMatrix(GGBar3, GBar17, nn3-kk3, nn3, kk3, 0, kk6+kk3+nn6-kk6, nn3);
601   appendVector(hh6, hh3, h17, nn6, nn3);
602   Q17 = (QQ3+QQ6);
603   appendVector(DD6, DD3, D17, kk6, kk3);
604   appendBlockMatrix(JJ6, JJ3, J17, kk6, kk6, kk3, kk3);
605
606   // phidprime * e6
607   int n18 = nn3+nn7; int k18 = kk3+kk7; int **G18; int **GBar18; int *h18; int Q18; int *D18; int **J18;
608   G18 = calloc(nn3+nn7,sizeof(int*));
609   GBar18 = calloc(nn3+nn7,sizeof(int*));
610   h18 = calloc(nn3+nn7,sizeof(int));
611   D18 = calloc(kk3+kk7,sizeof(int));
612   J18 = calloc(kk3+kk7,sizeof(int*));
613   for(i=0; i<nn3+nn7; i++) {
614     G18[i] = calloc(nn3+nn7, sizeof(int)); GBar18[i] = calloc(nn3+nn7, sizeof(int));
615   }
616   for(i=0; i<kk3+kk7; i++)
617      J18[i] = calloc(kk3+kk7, sizeof(int));
618   //appendBlockMatrix(GG7, GG3, G21, nn7, nn7, nn3, nn3);
619   addSubMatrix(GG7, G18, kk7, nn7, 0, 0, 0, 0);
620   addSubMatrix(GG3, G18, kk3, nn3, 0, 0, kk7, nn7);
621   addSubMatrix(GG7, G18, nn7-kk7, nn7, kk7, 0, kk7+kk3, 0); // put the out-of-subspace vectors at the end
622   addSubMatrix(GG3, G18, nn3-kk3, nn3, kk3, 0, kk7+kk3+nn7-kk7, nn3);
623   //appendBlockMatrix(GGBar7, GGBar3, GBar21, nn7, nn7, nn3, nn3);
624   addSubMatrix(GGBar7, GBar18, kk7, nn7, 0, 0, 0, 0);
625   addSubMatrix(GGBar3, GBar18, kk3, nn3, 0, 0, kk7, nn7);
626   addSubMatrix(GGBar7, GBar18, nn7-kk7, nn7, kk7, 0, kk7+kk3, 0); // put the out-of-subspace vectors at the end
627   addSubMatrix(GGBar3, GBar18, nn3-kk3, nn3, kk3, 0, kk7+kk3+nn7-kk7, nn3);
628   appendVector(hh7, hh3, h18, nn7, nn3);
629   Q18 = (QQ3+QQ7);
630   appendVector(DD7, DD3, D18, kk7, kk3);
631   appendBlockMatrix(JJ7, JJ3, J18, kk7, kk7, kk3, kk3);
632
633   // b60 * o6
634   int n19 = nn4+nn1; int k19 = kk4+kk1; int **G19; int **GBar19; int *h19; int Q19; int *D19; int **J19;
635   G19 = calloc(nn4+nn1,sizeof(int*));
636   GBar19 = calloc(nn4+nn1,sizeof(int*));
637   h19 = calloc(nn4+nn1,sizeof(int));
638   D19 = calloc(kk4+kk1,sizeof(int));
639   J19 = calloc(kk4+kk1,sizeof(int*));
640   for(i=0; i<nn4+nn1; i++) {
641     G19[i] = calloc(nn4+nn1, sizeof(int)); GBar19[i] = calloc(nn4+nn1, sizeof(int));
642   }
643   for(i=0; i<kk4+kk1; i++)
644      J19[i] = calloc(kk4+kk1, sizeof(int));
645   //appendBlockMatrix(GG1, GG4, G22, nn1, nn1, nn4, nn4);
646   addSubMatrix(GG1, G19, kk1, nn1, 0, 0, 0, 0);
647   addSubMatrix(GG4, G19, kk4, nn4, 0, 0, kk1, nn1);
648   addSubMatrix(GG1, G19, nn1-kk1, nn1, kk1, 0, kk1+kk4, 0); // put the out-of-subspace vectors at the end
649   addSubMatrix(GG4, G19, nn4-kk4, nn4, kk4, 0, kk1+kk4+nn1-kk1, nn4);
650   //appendBlockMatrix(GGBar1, GGBar4, GBar22, nn1, nn1, nn4, nn4);
651   addSubMatrix(GGBar1, GBar19, kk1, nn1, 0, 0, 0, 0);
652   addSubMatrix(GGBar4, GBar19, kk4, nn4, 0, 0, kk1, nn1);
653   addSubMatrix(GGBar1, GBar19, nn1-kk1, nn1, kk1, 0, kk1+kk4, 0); // put the out-of-subspace vectors at the end
654   addSubMatrix(GGBar4, GBar19, nn4-kk4, nn4, kk4, 0, kk1+kk4+nn1-kk1, nn4);
655   appendVector(hh1, hh4, h19, nn1, nn4);
656   Q19 = (QQ4+QQ1);
657   appendVector(DD1, DD4, D19, kk1, kk4);
658   appendBlockMatrix(JJ1, JJ4, J19, kk1, kk1, kk4, kk4);
659
660   // b66 * o6
661   int n20 = nn4+nn2; int k20 = kk4+kk2; int **G20; int **GBar20; int *h20; int Q20; int *D20; int **J20;
662   G20 = calloc(nn4+nn2,sizeof(int*));
663   GBar20 = calloc(nn4+nn2,sizeof(int*));
664   h20 = calloc(nn4+nn2,sizeof(int));
665   D20 = calloc(kk4+kk2,sizeof(int));
666   J20 = calloc(kk4+kk2,sizeof(int*));
667   for(i=0; i<nn4+nn2; i++) {
668     G20[i] = calloc(nn4+nn2, sizeof(int)); GBar20[i] = calloc(nn4+nn2, sizeof(int));
669   }
670   for(i=0; i<kk4+kk2; i++)
671      J20[i] = calloc(kk4+kk2, sizeof(int));
672   //appendBlockMatrix(GG2, GG4, G23, nn2, nn2, nn4, nn4);
673   addSubMatrix(GG2, G20, kk2, nn2, 0, 0, 0, 0);
674   addSubMatrix(GG4, G20, kk4, nn4, 0, 0, kk2, nn2);
675   addSubMatrix(GG2, G20, nn2-kk2, nn2, kk2, 0, kk2+kk4, 0); // put the out-of-subspace vectors at the end
676   addSubMatrix(GG4, G20, nn4-kk4, nn4, kk4, 0, kk2+kk4+nn2-kk2, nn4);
677   //appendBlockMatrix(GGBar2, GGBar4, GBar23, nn2, nn2, nn4, nn4);
678   addSubMatrix(GGBar2, GBar20, kk2, nn2, 0, 0, 0, 0);
679   addSubMatrix(GGBar4, GBar20, kk4, nn4, 0, 0, kk2, nn2);
680   addSubMatrix(GGBar2, GBar20, nn2-kk2, nn2, kk2, 0, kk2+kk4, 0); // put the out-of-subspace vectors at the end
681   addSubMatrix(GGBar4, GBar20, nn4-kk4, nn4, kk4, 0, kk2+kk4+nn2-kk2, nn4);
682   appendVector(hh2, hh4, h20, nn2, nn4);
683   Q20 = (QQ4+QQ2);
684   appendVector(DD2, DD4, D20, kk2, kk4);
685   appendBlockMatrix(JJ2, JJ4, J20, kk2, kk2, kk4, kk4);
686   
687   // e6 * o6
688   /*int n24 = nn4+nn3; int k24 = kk4+kk3; int **G24; int **GBar24; int *h24; int Q24; int *D24; int **J24;
689   G24 = calloc(nn4+nn3,sizeof(int*));
690   GBar24 = calloc(nn4+nn3,sizeof(int*));
691   h24 = calloc(nn4+nn3,sizeof(int));
692   D24 = calloc(kk4+kk3,sizeof(int));
693   J24 = calloc(kk4+kk3,sizeof(int*));
694   for(i=0; i<nn4+nn3; i++) {
695     G24[i] = calloc(nn4+nn3, sizeof(int)); GBar24[i] = calloc(nn4+nn3, sizeof(int));
696   }
697   for(i=0; i<kk4+kk3; i++)
698      J24[i] = calloc(kk4+kk3, sizeof(int));
699   //appendBlockMatrix(GG3, GG4, G24, nn3, nn3, nn4, nn4);
700   addSubMatrix(GG3, G24, kk3, nn3, 0, 0, 0, 0);
701   addSubMatrix(GG4, G24, kk4, nn4, 0, 0, kk3, nn3);
702   addSubMatrix(GG3, G24, nn3-kk3, nn3, kk3, 0, kk3+kk4, 0); // put the out-of-subspace vectors at the end
703   addSubMatrix(GG4, G24, nn4-kk4, nn4, kk4, 0, kk3+kk4+nn3-kk3, nn4);
704   //appendBlockMatrix(GGBar3, GGBar4, GBar24, nn3, nn3, nn4, nn4);
705   addSubMatrix(GGBar3, GBar24, kk3, nn3, 0, 0, 0, 0);
706   addSubMatrix(GGBar4, GBar24, kk4, nn4, 0, 0, kk3, nn3);
707   addSubMatrix(GGBar3, GBar24, nn3-kk3, nn3, kk3, 0, kk3+kk4, 0); // put the out-of-subspace vectors at the end
708   addSubMatrix(GGBar4, GBar24, nn4-kk4, nn4, kk4, 0, kk3+kk4+nn3-kk3, nn4);
709   appendVector(hh3, hh4, h24, nn3, nn4);
710   Q24 = (QQ4+QQ3);
711   appendVector(DD3, DD4, D24, kk3, kk4);
712   appendBlockMatrix(JJ3, JJ4, J24, kk3, kk3, kk4, kk4);*/
713
714   // o6 * o6
715   int n21 = nn4+nn4; int k21 = kk4+kk4; int **G21; int **GBar21; int *h21; int Q21; int *D21; int **J21;
716   G21 = calloc(nn4+nn4,sizeof(int*));
717   GBar21 = calloc(nn4+nn4,sizeof(int*));
718   h21 = calloc(nn4+nn4,sizeof(int));
719   D21 = calloc(kk4+kk4,sizeof(int));
720   J21 = calloc(kk4+kk4,sizeof(int*));
721   for(i=0; i<nn4+nn4; i++) {
722     G21[i] = calloc(nn4+nn4, sizeof(int)); GBar21[i] = calloc(nn4+nn4, sizeof(int));
723   }
724   for(i=0; i<kk4+kk4; i++)
725      J21[i] = calloc(kk4+kk4, sizeof(int));
726   //appendBlockMatrix(GG4, GG4, G25, nn4, nn4, nn4, nn4);
727   addSubMatrix(GG4, G21, kk4, nn4, 0, 0, 0, 0);
728   addSubMatrix(GG4, G21, kk4, nn4, 0, 0, kk4, nn4);
729   addSubMatrix(GG4, G21, nn4-kk4, nn4, kk4, 0, kk4+kk4, 0); // put the out-of-subspace vectors at the end
730   addSubMatrix(GG4, G21, nn4-kk4, nn4, kk4, 0, kk4+kk4+nn4-kk4, nn4);
731   //appendBlockMatrix(GGBar4, GGBar4, GBar25, nn4, nn4, nn4, nn4);
732   addSubMatrix(GGBar4, GBar21, kk4, nn4, 0, 0, 0, 0);
733   addSubMatrix(GGBar4, GBar21, kk4, nn4, 0, 0, kk4, nn4);
734   addSubMatrix(GGBar4, GBar21, nn4-kk4, nn4, kk4, 0, kk4+kk4, 0); // put the out-of-subspace vectors at the end
735   addSubMatrix(GGBar4, GBar21, nn4-kk4, nn4, kk4, 0, kk4+kk4+nn4-kk4, nn4);
736   appendVector(hh4, hh4, h21, nn4, nn4);
737   Q21 = (QQ4+QQ4);
738   appendVector(DD4, DD4, D21, kk4, kk4);
739   appendBlockMatrix(JJ4, JJ4, J21, kk4, kk4, kk4, kk4);
740
741   // k6 * o6
742   int n22 = nn4+nn5; int k22 = kk4+kk5; int **G22; int **GBar22; int *h22; int Q22; int *D22; int **J22;
743   G22 = calloc(nn4+nn5,sizeof(int*));
744   GBar22 = calloc(nn4+nn5,sizeof(int*));
745   h22 = calloc(nn4+nn5,sizeof(int));
746   D22 = calloc(kk4+kk5,sizeof(int));
747   J22 = calloc(kk4+kk5,sizeof(int*));
748   for(i=0; i<nn4+nn5; i++) {
749     G22[i] = calloc(nn4+nn5, sizeof(int)); GBar22[i] = calloc(nn4+nn5, sizeof(int));
750   }
751   for(i=0; i<kk4+kk5; i++)
752      J22[i] = calloc(kk4+kk5, sizeof(int));
753   //appendBlockMatrix(GG5, GG4, G26, nn5, nn5, nn4, nn4);
754   addSubMatrix(GG5, G22, kk5, nn5, 0, 0, 0, 0);
755   addSubMatrix(GG4, G22, kk4, nn4, 0, 0, kk5, nn5);
756   addSubMatrix(GG5, G22, nn5-kk5, nn5, kk5, 0, kk5+kk4, 0); // put the out-of-subspace vectors at the end
757   addSubMatrix(GG4, G22, nn4-kk4, nn4, kk4, 0, kk5+kk4+nn5-kk5, nn4);
758   //appendBlockMatrix(GGBar5, GGBar4, GBar26, nn5, nn5, nn4, nn4);
759   addSubMatrix(GGBar5, GBar22, kk5, nn5, 0, 0, 0, 0);
760   addSubMatrix(GGBar4, GBar22, kk4, nn4, 0, 0, kk5, nn5);
761   addSubMatrix(GGBar5, GBar22, nn5-kk5, nn5, kk5, 0, kk5+kk4, 0); // put the out-of-subspace vectors at the end
762   addSubMatrix(GGBar4, GBar22, nn4-kk4, nn4, kk4, 0, kk5+kk4+nn5-kk5, nn4);
763   appendVector(hh5, hh4, h22, nn5, nn4);
764   Q22 = (QQ4+QQ5);
765   appendVector(DD5, DD4, D22, kk5, kk4);
766   appendBlockMatrix(JJ5, JJ4, J22, kk5, kk5, kk4, kk4);
767   
768   // phiprime * o6
769   int n23 = nn4+nn6; int k23 = kk4+kk6; int **G23; int **GBar23; int *h23; int Q23; int *D23; int **J23;
770   G23 = calloc(nn4+nn6,sizeof(int*));
771   GBar23 = calloc(nn4+nn6,sizeof(int*));
772   h23 = calloc(nn4+nn6,sizeof(int));
773   D23 = calloc(kk4+kk6,sizeof(int));
774   J23 = calloc(kk4+kk6,sizeof(int*));
775   for(i=0; i<nn4+nn6; i++) {
776     G23[i] = calloc(nn4+nn6, sizeof(int)); GBar23[i] = calloc(nn4+nn6, sizeof(int));
777   }
778   for(i=0; i<kk4+kk6; i++)
779      J23[i] = calloc(kk4+kk6, sizeof(int));
780   //appendBlockMatrix(GG6, GG4, G27, nn6, nn6, nn4, nn4);
781   addSubMatrix(GG6, G23, kk6, nn6, 0, 0, 0, 0);
782   addSubMatrix(GG4, G23, kk4, nn4, 0, 0, kk6, nn6);
783   addSubMatrix(GG6, G23, nn6-kk6, nn6, kk6, 0, kk6+kk4, 0); // put the out-of-subspace vectors at the end
784   addSubMatrix(GG4, G23, nn4-kk4, nn4, kk4, 0, kk6+kk4+nn6-kk6, nn4);
785   //appendBlockMatrix(GGBar6, GGBar4, GBar27, nn6, nn6, nn4, nn4);
786   addSubMatrix(GGBar6, GBar23, kk6, nn6, 0, 0, 0, 0);
787   addSubMatrix(GGBar4, GBar23, kk4, nn4, 0, 0, kk6, nn6);
788   addSubMatrix(GGBar6, GBar23, nn6-kk6, nn6, kk6, 0, kk6+kk4, 0); // put the out-of-subspace vectors at the end
789   addSubMatrix(GGBar4, GBar23, nn4-kk4, nn4, kk4, 0, kk6+kk4+nn6-kk6, nn4);
790   appendVector(hh6, hh4, h23, nn6, nn4);
791   Q23 = (QQ4+QQ6);
792   appendVector(DD6, DD4, D23, kk6, kk4);
793   appendBlockMatrix(JJ6, JJ4, J23, kk6, kk6, kk4, kk4);
794
795   // phidprime * o6
796   int n24 = nn4+nn7; int k24 = kk4+kk7; int **G24; int **GBar24; int *h24; int Q24; int *D24; int **J24;
797   G24 = calloc(nn4+nn7,sizeof(int*));
798   GBar24 = calloc(nn4+nn7,sizeof(int*));
799   h24 = calloc(nn4+nn7,sizeof(int));
800   D24 = calloc(kk4+kk7,sizeof(int));
801   J24 = calloc(kk4+kk7,sizeof(int*));
802   for(i=0; i<nn4+nn7; i++) {
803     G24[i] = calloc(nn4+nn7, sizeof(int)); GBar24[i] = calloc(nn4+nn7, sizeof(int));
804   }
805   for(i=0; i<kk4+kk7; i++)
806      J24[i] = calloc(kk4+kk7, sizeof(int));
807   //appendBlockMatrix(GG7, GG4, G28, nn7, nn7, nn4, nn4);
808   addSubMatrix(GG7, G24, kk7, nn7, 0, 0, 0, 0);
809   addSubMatrix(GG4, G24, kk4, nn4, 0, 0, kk7, nn7);
810   addSubMatrix(GG7, G24, nn7-kk7, nn7, kk7, 0, kk7+kk4, 0); // put the out-of-subspace vectors at the end
811   addSubMatrix(GG4, G24, nn4-kk4, nn4, kk4, 0, kk7+kk4+nn7-kk7, nn4);
812   //appendBlockMatrix(GGBar7, GGBar4, GBar28, nn7, nn7, nn4, nn4);
813   addSubMatrix(GGBar7, GBar24, kk7, nn7, 0, 0, 0, 0);
814   addSubMatrix(GGBar4, GBar24, kk4, nn4, 0, 0, kk7, nn7);
815   addSubMatrix(GGBar7, GBar24, nn7-kk7, nn7, kk7, 0, kk7+kk4, 0); // put the out-of-subspace vectors at the end
816   addSubMatrix(GGBar4, GBar24, nn4-kk4, nn4, kk4, 0, kk7+kk4+nn7-kk7, nn4);
817   appendVector(hh7, hh4, h24, nn7, nn4);
818   Q24 = (QQ4+QQ7);
819   appendVector(DD7, DD4, D24, kk7, kk4);
820   appendBlockMatrix(JJ7, JJ4, J24, kk7, kk7, kk4, kk4);
821
822   // b60 * k6
823   int n25 = nn5+nn1; int k25 = kk5+kk1; int **G25; int **GBar25; int *h25; int Q25; int *D25; int **J25;
824   G25 = calloc(nn5+nn1,sizeof(int*));
825   GBar25 = calloc(nn5+nn1,sizeof(int*));
826   h25 = calloc(nn5+nn1,sizeof(int));
827   D25 = calloc(kk5+kk1,sizeof(int));
828   J25 = calloc(kk5+kk1,sizeof(int*));
829   for(i=0; i<nn5+nn1; i++) {
830     G25[i] = calloc(nn5+nn1, sizeof(int)); GBar25[i] = calloc(nn5+nn1, sizeof(int));
831   }
832   for(i=0; i<kk5+kk1; i++)
833      J25[i] = calloc(kk5+kk1, sizeof(int));
834   //appendBlockMatrix(GG1, GG5, G29, nn1, nn1, nn5, nn5);
835   addSubMatrix(GG1, G25, kk1, nn1, 0, 0, 0, 0);
836   addSubMatrix(GG5, G25, kk5, nn5, 0, 0, kk1, nn1);
837   addSubMatrix(GG1, G25, nn1-kk1, nn1, kk1, 0, kk1+kk5, 0); // put the out-of-subspace vectors at the end
838   addSubMatrix(GG5, G25, nn5-kk5, nn5, kk5, 0, kk1+kk5+nn1-kk1, nn5);
839   //appendBlockMatrix(GGBar1, GGBar5, GBar29, nn1, nn1, nn5, nn5);
840   addSubMatrix(GGBar1, GBar25, kk1, nn1, 0, 0, 0, 0);
841   addSubMatrix(GGBar5, GBar25, kk5, nn5, 0, 0, kk1, nn1);
842   addSubMatrix(GGBar1, GBar25, nn1-kk1, nn1, kk1, 0, kk1+kk5, 0); // put the out-of-subspace vectors at the end
843   addSubMatrix(GGBar5, GBar25, nn5-kk5, nn5, kk5, 0, kk1+kk5+nn1-kk1, nn5);
844   appendVector(hh1, hh5, h25, nn1, nn5);
845   Q25 = (QQ5+QQ1);
846   appendVector(DD1, DD5, D25, kk1, kk5);
847   appendBlockMatrix(JJ1, JJ5, J25, kk1, kk1, kk5, kk5);
848
849   // b66 * k6
850   int n26 = nn5+nn2; int k26 = kk5+kk2; int **G26; int **GBar26; int *h26; int Q26; int *D26; int **J26;
851   G26 = calloc(nn5+nn2,sizeof(int*));
852   GBar26 = calloc(nn5+nn2,sizeof(int*));
853   h26 = calloc(nn5+nn2,sizeof(int));
854   D26 = calloc(kk5+kk2,sizeof(int));
855   J26 = calloc(kk5+kk2,sizeof(int*));
856   for(i=0; i<nn5+nn2; i++) {
857     G26[i] = calloc(nn5+nn2, sizeof(int)); GBar26[i] = calloc(nn5+nn2, sizeof(int));
858   }
859   for(i=0; i<kk5+kk2; i++)
860      J26[i] = calloc(kk5+kk2, sizeof(int));
861   //appendBlockMatrix(GG2, GG5, G30, nn2, nn2, nn5, nn5);
862   addSubMatrix(GG2, G26, kk2, nn2, 0, 0, 0, 0);
863   addSubMatrix(GG5, G26, kk5, nn5, 0, 0, kk2, nn2);
864   addSubMatrix(GG2, G26, nn2-kk2, nn2, kk2, 0, kk2+kk5, 0); // put the out-of-subspace vectors at the end
865   addSubMatrix(GG5, G26, nn5-kk5, nn5, kk5, 0, kk2+kk5+nn2-kk2, nn5);
866   //appendBlockMatrix(GGBar2, GGBar5, GBar30, nn2, nn2, nn5, nn5);
867   addSubMatrix(GGBar2, GBar26, kk2, nn2, 0, 0, 0, 0);
868   addSubMatrix(GGBar5, GBar26, kk5, nn5, 0, 0, kk2, nn2);
869   addSubMatrix(GGBar2, GBar26, nn2-kk2, nn2, kk2, 0, kk2+kk5, 0); // put the out-of-subspace vectors at the end
870   addSubMatrix(GGBar5, GBar26, nn5-kk5, nn5, kk5, 0, kk2+kk5+nn2-kk2, nn5);
871   appendVector(hh2, hh5, h26, nn2, nn5);
872   Q26 = (QQ5+QQ2);
873   appendVector(DD2, DD5, D26, kk2, kk5);
874   appendBlockMatrix(JJ2, JJ5, J26, kk2, kk2, kk5, kk5);
875   
876   // e6 * k6
877   int n27 = nn5+nn3; int k27 = kk5+kk3; int **G27; int **GBar27; int *h27; int Q27; int *D27; int **J27;
878   G27 = calloc(nn5+nn3,sizeof(int*));
879   GBar27 = calloc(nn5+nn3,sizeof(int*));
880   h27 = calloc(nn5+nn3,sizeof(int));
881   D27 = calloc(kk5+kk3,sizeof(int));
882   J27 = calloc(kk5+kk3,sizeof(int*));
883   for(i=0; i<nn5+nn3; i++) {
884     G27[i] = calloc(nn5+nn3, sizeof(int)); GBar27[i] = calloc(nn5+nn3, sizeof(int));
885   }
886   for(i=0; i<kk5+kk3; i++)
887      J27[i] = calloc(kk5+kk3, sizeof(int));
888   //appendBlockMatrix(GG3, GG5, G31, nn3, nn3, nn5, nn5);
889   addSubMatrix(GG3, G27, kk3, nn3, 0, 0, 0, 0);
890   addSubMatrix(GG5, G27, kk5, nn5, 0, 0, kk3, nn3);
891   addSubMatrix(GG3, G27, nn3-kk3, nn3, kk3, 0, kk3+kk5, 0); // put the out-of-subspace vectors at the end
892   addSubMatrix(GG5, G27, nn5-kk5, nn5, kk5, 0, kk3+kk5+nn3-kk3, nn5);
893   //appendBlockMatrix(GGBar3, GGBar5, GBar31, nn3, nn3, nn5, nn5);
894   addSubMatrix(GGBar3, GBar27, kk3, nn3, 0, 0, 0, 0);
895   addSubMatrix(GGBar5, GBar27, kk5, nn5, 0, 0, kk3, nn3);
896   addSubMatrix(GGBar3, GBar27, nn3-kk3, nn3, kk3, 0, kk3+kk5, 0); // put the out-of-subspace vectors at the end
897   addSubMatrix(GGBar5, GBar27, nn5-kk5, nn5, kk5, 0, kk3+kk5+nn3-kk3, nn5);
898   appendVector(hh3, hh5, h27, nn3, nn5);
899   Q27 = (QQ5+QQ3);
900   appendVector(DD3, DD5, D27, kk3, kk5);
901   appendBlockMatrix(JJ3, JJ5, J27, kk3, kk3, kk5, kk5);
902
903   // o6 * k6
904   int n28 = nn5+nn4; int k28 = kk5+kk4; int **G28; int **GBar28; int *h28; int Q28; int *D28; int **J28;
905   G28 = calloc(nn5+nn4,sizeof(int*));
906   GBar28 = calloc(nn5+nn4,sizeof(int*));
907   h28 = calloc(nn5+nn4,sizeof(int));
908   D28 = calloc(kk5+kk4,sizeof(int));
909   J28 = calloc(kk5+kk4,sizeof(int*));
910   for(i=0; i<nn5+nn4; i++) {
911     G28[i] = calloc(nn5+nn4, sizeof(int)); GBar28[i] = calloc(nn5+nn4, sizeof(int));
912   }
913   for(i=0; i<kk5+kk4; i++)
914      J28[i] = calloc(kk5+kk4, sizeof(int));
915   //appendBlockMatrix(GG4, GG5, G32, nn4, nn4, nn5, nn5);
916   addSubMatrix(GG4, G28, kk4, nn4, 0, 0, 0, 0);
917   addSubMatrix(GG5, G28, kk5, nn5, 0, 0, kk4, nn4);
918   addSubMatrix(GG4, G28, nn4-kk4, nn4, kk4, 0, kk4+kk5, 0); // put the out-of-subspace vectors at the end
919   addSubMatrix(GG5, G28, nn5-kk5, nn5, kk5, 0, kk4+kk5+nn4-kk4, nn5);
920   //appendBlockMatrix(GGBar4, GGBar5, GBar32, nn4, nn4, nn5, nn5);
921   addSubMatrix(GGBar4, GBar28, kk4, nn4, 0, 0, 0, 0);
922   addSubMatrix(GGBar5, GBar28, kk5, nn5, 0, 0, kk4, nn4);
923   addSubMatrix(GGBar4, GBar28, nn4-kk4, nn4, kk4, 0, kk4+kk5, 0); // put the out-of-subspace vectors at the end
924   addSubMatrix(GGBar5, GBar28, nn5-kk5, nn5, kk5, 0, kk4+kk5+nn4-kk4, nn5);
925   appendVector(hh4, hh5, h28, nn4, nn5);
926   Q28 = (QQ5+QQ4);
927   appendVector(DD4, DD5, D28, kk4, kk5);
928   appendBlockMatrix(JJ4, JJ5, J28, kk4, kk4, kk5, kk5);
929
930   // k6 * k6
931   int n29 = nn5+nn5; int k29 = kk5+kk5; int **G29; int **GBar29; int *h29; int Q29; int *D29; int **J29;
932   G29 = calloc(nn5+nn5,sizeof(int*));
933   GBar29 = calloc(nn5+nn5,sizeof(int*));
934   h29 = calloc(nn5+nn5,sizeof(int));
935   D29 = calloc(kk5+kk5,sizeof(int));
936   J29 = calloc(kk5+kk5,sizeof(int*));
937   for(i=0; i<nn5+nn5; i++) {
938     G29[i] = calloc(nn5+nn5, sizeof(int)); GBar29[i] = calloc(nn5+nn5, sizeof(int));
939   }
940   for(i=0; i<kk5+kk5; i++)
941      J29[i] = calloc(kk5+kk5, sizeof(int));
942   //appendBlockMatrix(GG5, GG5, G33, nn5, nn5, nn5, nn5);
943   addSubMatrix(GG5, G29, kk5, nn5, 0, 0, 0, 0);
944   addSubMatrix(GG5, G29, kk5, nn5, 0, 0, kk5, nn5);
945   addSubMatrix(GG5, G29, nn5-kk5, nn5, kk5, 0, kk5+kk5, 0); // put the out-of-subspace vectors at the end
946   addSubMatrix(GG5, G29, nn5-kk5, nn5, kk5, 0, kk5+kk5+nn5-kk5, nn5);
947   //appendBlockMatrix(GGBar5, GGBar5, GBar33, nn5, nn5, nn5, nn5);
948   addSubMatrix(GGBar5, GBar29, kk5, nn5, 0, 0, 0, 0);
949   addSubMatrix(GGBar5, GBar29, kk5, nn5, 0, 0, kk5, nn5);
950   addSubMatrix(GGBar5, GBar29, nn5-kk5, nn5, kk5, 0, kk5+kk5, 0); // put the out-of-subspace vectors at the end
951   addSubMatrix(GGBar5, GBar29, nn5-kk5, nn5, kk5, 0, kk5+kk5+nn5-kk5, nn5);
952   appendVector(hh5, hh5, h29, nn5, nn5);
953   Q29 = (QQ5+QQ5);
954   appendVector(DD5, DD5, D29, kk5, kk5);
955   appendBlockMatrix(JJ5, JJ5, J29, kk5, kk5, kk5, kk5);
956
957   // phiprime * k6
958   int n30 = nn5+nn6; int k30 = kk5+kk6; int **G30; int **GBar30; int *h30; int Q30; int *D30; int **J30;
959   G30 = calloc(nn5+nn6,sizeof(int*));
960   GBar30 = calloc(nn5+nn6,sizeof(int*));
961   h30 = calloc(nn5+nn6,sizeof(int));
962   D30 = calloc(kk5+kk6,sizeof(int));
963   J30 = calloc(kk5+kk6,sizeof(int*));
964   for(i=0; i<nn5+nn6; i++) {
965     G30[i] = calloc(nn5+nn6, sizeof(int)); GBar30[i] = calloc(nn5+nn6, sizeof(int));
966   }
967   for(i=0; i<kk5+kk6; i++)
968      J30[i] = calloc(kk5+kk6, sizeof(int));
969   //appendBlockMatrix(GG6, GG5, G34, nn6, nn6, nn5, nn5);
970   addSubMatrix(GG6, G30, kk6, nn6, 0, 0, 0, 0);
971   addSubMatrix(GG5, G30, kk5, nn5, 0, 0, kk6, nn6);
972   addSubMatrix(GG6, G30, nn6-kk6, nn6, kk6, 0, kk6+kk5, 0); // put the out-of-subspace vectors at the end
973   addSubMatrix(GG5, G30, nn5-kk5, nn5, kk5, 0, kk6+kk5+nn6-kk6, nn5);
974   //appendBlockMatrix(GGBar6, GGBar5, GBar34, nn6, nn6, nn5, nn5);
975   addSubMatrix(GGBar6, GBar30, kk6, nn6, 0, 0, 0, 0);
976   addSubMatrix(GGBar5, GBar30, kk5, nn5, 0, 0, kk6, nn6);
977   addSubMatrix(GGBar6, GBar30, nn6-kk6, nn6, kk6, 0, kk6+kk5, 0); // put the out-of-subspace vectors at the end
978   addSubMatrix(GGBar5, GBar30, nn5-kk5, nn5, kk5, 0, kk6+kk5+nn6-kk6, nn5);
979   appendVector(hh6, hh5, h30, nn6, nn5);
980   Q30 = (QQ5+QQ6);
981   appendVector(DD6, DD5, D30, kk6, kk5);
982   appendBlockMatrix(JJ6, JJ5, J30, kk6, kk6, kk5, kk5);
983   
984   // phidprime * k6
985   int n31 = nn5+nn7; int k31 = kk5+kk7; int **G31; int **GBar31; int *h31; int Q31; int *D31; int **J31;
986   G31 = calloc(nn5+nn7,sizeof(int*));
987   GBar31 = calloc(nn5+nn7,sizeof(int*));
988   h31 = calloc(nn5+nn7,sizeof(int));
989   D31 = calloc(kk5+kk7,sizeof(int));
990   J31 = calloc(kk5+kk7,sizeof(int*));
991   for(i=0; i<nn5+nn7; i++) {
992     G31[i] = calloc(nn5+nn7, sizeof(int)); GBar31[i] = calloc(nn5+nn7, sizeof(int));
993   }
994   for(i=0; i<kk5+kk7; i++)
995      J31[i] = calloc(kk5+kk7, sizeof(int));
996   //appendBlockMatrix(GG7, GG5, G35, nn7, nn7, nn5, nn5);
997   addSubMatrix(GG7, G31, kk7, nn7, 0, 0, 0, 0);
998   addSubMatrix(GG5, G31, kk5, nn5, 0, 0, kk7, nn7);
999   addSubMatrix(GG7, G31, nn7-kk7, nn7, kk7, 0, kk7+kk5, 0); // put the out-of-subspace vectors at the end
1000   addSubMatrix(GG5, G31, nn5-kk5, nn5, kk5, 0, kk7+kk5+nn7-kk7, nn5);
1001   //appendBlockMatrix(GGBar7, GGBar5, GBar35, nn7, nn7, nn5, nn5);
1002   addSubMatrix(GGBar7, GBar31, kk7, nn7, 0, 0, 0, 0);
1003   addSubMatrix(GGBar5, GBar31, kk5, nn5, 0, 0, kk7, nn7);
1004   addSubMatrix(GGBar7, GBar31, nn7-kk7, nn7, kk7, 0, kk7+kk5, 0); // put the out-of-subspace vectors at the end
1005   addSubMatrix(GGBar5, GBar31, nn5-kk5, nn5, kk5, 0, kk7+kk5+nn7-kk7, nn5);
1006   appendVector(hh7, hh5, h31, nn7, nn5);
1007   Q31 = (QQ5+QQ7);
1008   appendVector(DD7, DD5, D31, kk7, kk5);
1009   appendBlockMatrix(JJ7, JJ5, J31, kk7, kk7, kk5, kk5);
1010
1011   // b60 * phiprime
1012   int n32 = nn6+nn1; int k32 = kk6+kk1; int **G32; int **GBar32; int *h32; int Q32; int *D32; int **J32;
1013   G32 = calloc(nn6+nn1,sizeof(int*));
1014   GBar32 = calloc(nn6+nn1,sizeof(int*));
1015   h32 = calloc(nn6+nn1,sizeof(int));
1016   D32 = calloc(kk6+kk1,sizeof(int));
1017   J32 = calloc(kk6+kk1,sizeof(int*));
1018   for(i=0; i<nn6+nn1; i++) {
1019     G32[i] = calloc(nn6+nn1, sizeof(int)); GBar32[i] = calloc(nn6+nn1, sizeof(int));
1020   }
1021   for(i=0; i<kk6+kk1; i++)
1022      J32[i] = calloc(kk6+kk1, sizeof(int));
1023   //appendBlockMatrix(GG1, GG6, G36, nn1, nn1, nn6, nn6);
1024   addSubMatrix(GG1, G32, kk1, nn1, 0, 0, 0, 0);
1025   addSubMatrix(GG6, G32, kk6, nn6, 0, 0, kk1, nn1);
1026   addSubMatrix(GG1, G32, nn1-kk1, nn1, kk1, 0, kk1+kk6, 0); // put the out-of-subspace vectors at the end
1027   addSubMatrix(GG6, G32, nn6-kk6, nn6, kk6, 0, kk1+kk6+nn1-kk1, nn6);
1028   //appendBlockMatrix(GGBar1, GGBar6, GBar36, nn1, nn1, nn6, nn6);
1029   addSubMatrix(GGBar1, GBar32, kk1, nn1, 0, 0, 0, 0);
1030   addSubMatrix(GGBar6, GBar32, kk6, nn6, 0, 0, kk1, nn1);
1031   addSubMatrix(GGBar1, GBar32, nn1-kk1, nn1, kk1, 0, kk1+kk6, 0); // put the out-of-subspace vectors at the end
1032   addSubMatrix(GGBar6, GBar32, nn6-kk6, nn6, kk6, 0, kk1+kk6+nn1-kk1, nn6);
1033   appendVector(hh1, hh6, h32, nn1, nn6);
1034   Q32 = (QQ6+QQ1);
1035   appendVector(DD1, DD6, D32, kk1, kk6);
1036   appendBlockMatrix(JJ1, JJ6, J32, kk1, kk1, kk6, kk6);
1037
1038   // b66 * phiprime
1039   int n33 = nn6+nn2; int k33 = kk6+kk2; int **G33; int **GBar33; int *h33; int Q33; int *D33; int **J33;
1040   G33 = calloc(nn6+nn2,sizeof(int*));
1041   GBar33 = calloc(nn6+nn2,sizeof(int*));
1042   h33 = calloc(nn6+nn2,sizeof(int));
1043   D33 = calloc(kk6+kk2,sizeof(int));
1044   J33 = calloc(kk6+kk2,sizeof(int*));
1045   for(i=0; i<nn6+nn2; i++) {
1046     G33[i] = calloc(nn6+nn2, sizeof(int)); GBar33[i] = calloc(nn6+nn2, sizeof(int));
1047   }
1048   for(i=0; i<kk6+kk2; i++)
1049      J33[i] = calloc(kk6+kk2, sizeof(int));
1050   //appendBlockMatrix(GG2, GG6, G37, nn2, nn2, nn6, nn6);
1051   addSubMatrix(GG2, G33, kk2, nn2, 0, 0, 0, 0);
1052   addSubMatrix(GG6, G33, kk6, nn6, 0, 0, kk2, nn2);
1053   addSubMatrix(GG2, G33, nn2-kk2, nn2, kk2, 0, kk2+kk6, 0); // put the out-of-subspace vectors at the end
1054   addSubMatrix(GG6, G33, nn6-kk6, nn6, kk6, 0, kk2+kk6+nn2-kk2, nn6);
1055   //appendBlockMatrix(GGBar2, GGBar6, GBar37, nn2, nn2, nn6, nn6);
1056   addSubMatrix(GGBar2, GBar33, kk2, nn2, 0, 0, 0, 0);
1057   addSubMatrix(GGBar6, GBar33, kk6, nn6, 0, 0, kk2, nn2);
1058   addSubMatrix(GGBar2, GBar33, nn2-kk2, nn2, kk2, 0, kk2+kk6, 0); // put the out-of-subspace vectors at the end
1059   addSubMatrix(GGBar6, GBar33, nn6-kk6, nn6, kk6, 0, kk2+kk6+nn2-kk2, nn6);
1060   appendVector(hh2, hh6, h33, nn2, nn6);
1061   Q33 = (QQ6+QQ2);
1062   appendVector(DD2, DD6, D33, kk2, kk6);
1063   appendBlockMatrix(JJ2, JJ6, J33, kk2, kk2, kk6, kk6);
1064
1065   // e6 * phiprime
1066   int n34 = nn6+nn3; int k34 = kk6+kk3; int **G34; int **GBar34; int *h34; int Q34; int *D34; int **J34;
1067   G34 = calloc(nn6+nn3,sizeof(int*));
1068   GBar34 = calloc(nn6+nn3,sizeof(int*));
1069   h34 = calloc(nn6+nn3,sizeof(int));
1070   D34 = calloc(kk6+kk3,sizeof(int));
1071   J34 = calloc(kk6+kk3,sizeof(int*));
1072   for(i=0; i<nn6+nn3; i++) {
1073     G34[i] = calloc(nn6+nn3, sizeof(int)); GBar34[i] = calloc(nn6+nn3, sizeof(int));
1074   }
1075   for(i=0; i<kk6+kk3; i++)
1076      J34[i] = calloc(kk6+kk3, sizeof(int));
1077   //appendBlockMatrix(GG3, GG6, G38, nn3, nn3, nn6, nn6);
1078   addSubMatrix(GG3, G34, kk3, nn3, 0, 0, 0, 0);
1079   addSubMatrix(GG6, G34, kk6, nn6, 0, 0, kk3, nn3);
1080   addSubMatrix(GG3, G34, nn3-kk3, nn3, kk3, 0, kk3+kk6, 0); // put the out-of-subspace vectors at the end
1081   addSubMatrix(GG6, G34, nn6-kk6, nn6, kk6, 0, kk3+kk6+nn3-kk3, nn6);
1082   //appendBlockMatrix(GGBar3, GGBar6, GBar38, nn3, nn3, nn6, nn6);
1083   addSubMatrix(GGBar3, GBar34, kk3, nn3, 0, 0, 0, 0);
1084   addSubMatrix(GGBar6, GBar34, kk6, nn6, 0, 0, kk3, nn3);
1085   addSubMatrix(GGBar3, GBar34, nn3-kk3, nn3, kk3, 0, kk3+kk6, 0); // put the out-of-subspace vectors at the end
1086   addSubMatrix(GGBar6, GBar34, nn6-kk6, nn6, kk6, 0, kk3+kk6+nn3-kk3, nn6);
1087   appendVector(hh3, hh6, h34, nn3, nn6);
1088   Q34 = (QQ6+QQ3);
1089   appendVector(DD3, DD6, D34, kk3, kk6);
1090   appendBlockMatrix(JJ3, JJ6, J34, kk3, kk3, kk6, kk6);
1091
1092   // o6 * phiprime
1093   int n35 = nn6+nn4; int k35 = kk6+kk4; int **G35; int **GBar35; int *h35; int Q35; int *D35; int **J35;
1094   G35 = calloc(nn6+nn4,sizeof(int*));
1095   GBar35 = calloc(nn6+nn4,sizeof(int*));
1096   h35 = calloc(nn6+nn4,sizeof(int));
1097   D35 = calloc(kk6+kk4,sizeof(int));
1098   J35 = calloc(kk6+kk4,sizeof(int*));
1099   for(i=0; i<nn6+nn4; i++) {
1100     G35[i] = calloc(nn6+nn4, sizeof(int)); GBar35[i] = calloc(nn6+nn4, sizeof(int));
1101   }
1102   for(i=0; i<kk6+kk4; i++)
1103      J35[i] = calloc(kk6+kk4, sizeof(int));
1104   //appendBlockMatrix(GG4, GG6, G39, nn4, nn4, nn6, nn6);
1105   addSubMatrix(GG4, G35, kk4, nn4, 0, 0, 0, 0);
1106   addSubMatrix(GG6, G35, kk6, nn6, 0, 0, kk4, nn4);
1107   addSubMatrix(GG4, G35, nn4-kk4, nn4, kk4, 0, kk4+kk6, 0); // put the out-of-subspace vectors at the end
1108   addSubMatrix(GG6, G35, nn6-kk6, nn6, kk6, 0, kk4+kk6+nn4-kk4, nn6);
1109   //appendBlockMatrix(GGBar4, GGBar6, GBar39, nn4, nn4, nn6, nn6);
1110   addSubMatrix(GGBar4, GBar35, kk4, nn4, 0, 0, 0, 0);
1111   addSubMatrix(GGBar6, GBar35, kk6, nn6, 0, 0, kk4, nn4);
1112   addSubMatrix(GGBar4, GBar35, nn4-kk4, nn4, kk4, 0, kk4+kk6, 0); // put the out-of-subspace vectors at the end
1113   addSubMatrix(GGBar6, GBar35, nn6-kk6, nn6, kk6, 0, kk4+kk6+nn4-kk4, nn6);
1114   appendVector(hh4, hh6, h35, nn4, nn6);
1115   Q35 = (QQ6+QQ4);
1116   appendVector(DD4, DD6, D35, kk4, kk6);
1117   appendBlockMatrix(JJ4, JJ6, J35, kk4, kk4, kk6, kk6);
1118
1119   // k6 * phiprime
1120   int n36 = nn6+nn5; int k36 = kk6+kk5; int **G36; int **GBar36; int *h36; int Q36; int *D36; int **J36;
1121   G36 = calloc(nn6+nn5,sizeof(int*));
1122   GBar36 = calloc(nn6+nn5,sizeof(int*));
1123   h36 = calloc(nn6+nn5,sizeof(int));
1124   D36 = calloc(kk6+kk5,sizeof(int));
1125   J36 = calloc(kk6+kk5,sizeof(int*));
1126   for(i=0; i<nn6+nn5; i++) {
1127     G36[i] = calloc(nn6+nn5, sizeof(int)); GBar36[i] = calloc(nn6+nn5, sizeof(int));
1128   }
1129   for(i=0; i<kk6+kk5; i++)
1130      J36[i] = calloc(kk6+kk5, sizeof(int));
1131   //appendBlockMatrix(GG5, GG6, G40, nn5, nn5, nn6, nn6);
1132   addSubMatrix(GG5, G36, kk5, nn5, 0, 0, 0, 0);
1133   addSubMatrix(GG6, G36, kk6, nn6, 0, 0, kk5, nn5);
1134   addSubMatrix(GG5, G36, nn5-kk5, nn5, kk5, 0, kk5+kk6, 0); // put the out-of-subspace vectors at the end
1135   addSubMatrix(GG6, G36, nn6-kk6, nn6, kk6, 0, kk5+kk6+nn5-kk5, nn6);
1136   //appendBlockMatrix(GGBar5, GGBar6, GBar40, nn5, nn5, nn6, nn6);
1137   addSubMatrix(GGBar5, GBar36, kk5, nn5, 0, 0, 0, 0);
1138   addSubMatrix(GGBar6, GBar36, kk6, nn6, 0, 0, kk5, nn5);
1139   addSubMatrix(GGBar5, GBar36, nn5-kk5, nn5, kk5, 0, kk5+kk6, 0); // put the out-of-subspace vectors at the end
1140   addSubMatrix(GGBar6, GBar36, nn6-kk6, nn6, kk6, 0, kk5+kk6+nn5-kk5, nn6);
1141   appendVector(hh5, hh6, h36, nn5, nn6);
1142   Q36 = (QQ6+QQ5);
1143   appendVector(DD5, DD6, D36, kk5, kk6);
1144   appendBlockMatrix(JJ5, JJ6, J36, kk5, kk5, kk6, kk6);
1145
1146   // phiprime * phiprime
1147   int n37 = nn6+nn6; int k37 = kk6+kk6; int **G37; int **GBar37; int *h37; int Q37; int *D37; int **J37;
1148   G37 = calloc(nn6+nn6,sizeof(int*));
1149   GBar37 = calloc(nn6+nn6,sizeof(int*));
1150   h37 = calloc(nn6+nn6,sizeof(int));
1151   D37 = calloc(kk6+kk6,sizeof(int));
1152   J37 = calloc(kk6+kk6,sizeof(int*));
1153   for(i=0; i<nn6+nn6; i++) {
1154     G37[i] = calloc(nn6+nn6, sizeof(int)); GBar37[i] = calloc(nn6+nn6, sizeof(int));
1155   }
1156   for(i=0; i<kk6+kk6; i++)
1157      J37[i] = calloc(kk6+kk6, sizeof(int));
1158   //appendBlockMatrix(GG6, GG6, G41, nn6, nn6, nn6, nn6);
1159   addSubMatrix(GG6, G37, kk6, nn6, 0, 0, 0, 0);
1160   addSubMatrix(GG6, G37, kk6, nn6, 0, 0, kk6, nn6);
1161   addSubMatrix(GG6, G37, nn6-kk6, nn6, kk6, 0, kk6+kk6, 0); // put the out-of-subspace vectors at the end
1162   addSubMatrix(GG6, G37, nn6-kk6, nn6, kk6, 0, kk6+kk6+nn6-kk6, nn6);
1163   //appendBlockMatrix(GGBar6, GGBar6, GBar41, nn6, nn6, nn6, nn6);
1164   addSubMatrix(GGBar6, GBar37, kk6, nn6, 0, 0, 0, 0);
1165   addSubMatrix(GGBar6, GBar37, kk6, nn6, 0, 0, kk6, nn6);
1166   addSubMatrix(GGBar6, GBar37, nn6-kk6, nn6, kk6, 0, kk6+kk6, 0); // put the out-of-subspace vectors at the end
1167   addSubMatrix(GGBar6, GBar37, nn6-kk6, nn6, kk6, 0, kk6+kk6+nn6-kk6, nn6);
1168   appendVector(hh6, hh6, h37, nn6, nn6);
1169   Q37 = (QQ6+QQ6);
1170   appendVector(DD6, DD6, D37, kk6, kk6);
1171   appendBlockMatrix(JJ6, JJ6, J37, kk6, kk6, kk6, kk6);
1172
1173   // phidprime * phiprime
1174   int n38 = nn6+nn7; int k38 = kk6+kk7; int **G38; int **GBar38; int *h38; int Q38; int *D38; int **J38;
1175   G38 = calloc(nn6+nn7,sizeof(int*));
1176   GBar38 = calloc(nn6+nn7,sizeof(int*));
1177   h38 = calloc(nn6+nn7,sizeof(int));
1178   D38 = calloc(kk6+kk7,sizeof(int));
1179   J38 = calloc(kk6+kk7,sizeof(int*));
1180   for(i=0; i<nn6+nn7; i++) {
1181     G38[i] = calloc(nn6+nn7, sizeof(int)); GBar38[i] = calloc(nn6+nn7, sizeof(int));
1182   }
1183   for(i=0; i<kk6+kk7; i++)
1184      J38[i] = calloc(kk6+kk7, sizeof(int));
1185   //appendBlockMatrix(GG7, GG6, G42, nn7, nn7, nn6, nn6);
1186   addSubMatrix(GG7, G38, kk7, nn7, 0, 0, 0, 0);
1187   addSubMatrix(GG6, G38, kk6, nn6, 0, 0, kk7, nn7);
1188   addSubMatrix(GG7, G38, nn7-kk7, nn7, kk7, 0, kk7+kk6, 0); // put the out-of-subspace vectors at the end
1189   addSubMatrix(GG6, G38, nn6-kk6, nn6, kk6, 0, kk7+kk6+nn7-kk7, nn6);
1190   //appendBlockMatrix(GGBar7, GGBar6, GBar42, nn7, nn7, nn6, nn6);
1191   addSubMatrix(GGBar7, GBar38, kk7, nn7, 0, 0, 0, 0);
1192   addSubMatrix(GGBar6, GBar38, kk6, nn6, 0, 0, kk7, nn7);
1193   addSubMatrix(GGBar7, GBar38, nn7-kk7, nn7, kk7, 0, kk7+kk6, 0); // put the out-of-subspace vectors at the end
1194   addSubMatrix(GGBar6, GBar38, nn6-kk6, nn6, kk6, 0, kk7+kk6+nn7-kk7, nn6);
1195   appendVector(hh7, hh6, h38, nn7, nn6);
1196   Q38 = (QQ6+QQ7);
1197   appendVector(DD7, DD6, D38, kk7, kk6);
1198   appendBlockMatrix(JJ7, JJ6, J38, kk7, kk7, kk6, kk6);
1199
1200   // b60 * phidprime
1201   int n39 = nn7+nn1; int k39 = kk7+kk1; int **G39; int **GBar39; int *h39; int Q39; int *D39; int **J39;
1202   G39 = calloc(nn7+nn1,sizeof(int*));
1203   GBar39 = calloc(nn7+nn1,sizeof(int*));
1204   h39 = calloc(nn7+nn1,sizeof(int));
1205   D39 = calloc(kk7+kk1,sizeof(int));
1206   J39 = calloc(kk7+kk1,sizeof(int*));
1207   for(i=0; i<nn7+nn1; i++) {
1208     G39[i] = calloc(nn7+nn1, sizeof(int)); GBar39[i] = calloc(nn7+nn1, sizeof(int));
1209   }
1210   for(i=0; i<kk7+kk1; i++)
1211      J39[i] = calloc(kk7+kk1, sizeof(int));
1212   //appendBlockMatrix(GG1, GG7, G43, nn1, nn1, nn7, nn7);
1213   addSubMatrix(GG1, G39, kk1, nn1, 0, 0, 0, 0);
1214   addSubMatrix(GG7, G39, kk7, nn7, 0, 0, kk1, nn1);
1215   addSubMatrix(GG1, G39, nn1-kk1, nn1, kk1, 0, kk1+kk7, 0); // put the out-of-subspace vectors at the end
1216   addSubMatrix(GG7, G39, nn7-kk7, nn7, kk7, 0, kk1+kk7+nn1-kk1, nn7);
1217   //appendBlockMatrix(GGBar1, GGBar7, GBar43, nn1, nn1, nn7, nn7);
1218   addSubMatrix(GGBar1, GBar39, kk1, nn1, 0, 0, 0, 0);
1219   addSubMatrix(GGBar7, GBar39, kk7, nn7, 0, 0, kk1, nn1);
1220   addSubMatrix(GGBar1, GBar39, nn1-kk1, nn1, kk1, 0, kk1+kk7, 0); // put the out-of-subspace vectors at the end
1221   addSubMatrix(GGBar7, GBar39, nn7-kk7, nn7, kk7, 0, kk1+kk7+nn1-kk1, nn7);
1222   appendVector(hh1, hh7, h39, nn1, nn7);
1223   Q39 = (QQ7+QQ1);
1224   appendVector(DD1, DD7, D39, kk1, kk7);
1225   appendBlockMatrix(JJ1, JJ7, J39, kk1, kk1, kk7, kk7);
1226   
1227   // b66 * phidprime
1228   int n40 = nn7+nn2; int k40 = kk7+kk2; int **G40; int **GBar40; int *h40; int Q40; int *D40; int **J40;
1229   G40 = calloc(nn7+nn2,sizeof(int*));
1230   GBar40 = calloc(nn7+nn2,sizeof(int*));
1231   h40 = calloc(nn7+nn2,sizeof(int));
1232   D40 = calloc(kk7+kk2,sizeof(int));
1233   J40 = calloc(kk7+kk2,sizeof(int*));
1234   for(i=0; i<nn7+nn2; i++) {
1235     G40[i] = calloc(nn7+nn2, sizeof(int)); GBar40[i] = calloc(nn7+nn2, sizeof(int));
1236   }
1237   for(i=0; i<kk7+kk2; i++)
1238      J40[i] = calloc(kk7+kk2, sizeof(int));
1239   //appendBlockMatrix(GG2, GG7, G44, nn2, nn2, nn7, nn7);
1240   addSubMatrix(GG2, G40, kk2, nn2, 0, 0, 0, 0);
1241   addSubMatrix(GG7, G40, kk7, nn7, 0, 0, kk2, nn2);
1242   addSubMatrix(GG1, G40, nn2-kk2, nn2, kk2, 0, kk2+kk7, 0); // put the out-of-subspace vectors at the end
1243   addSubMatrix(GG7, G40, nn7-kk7, nn7, kk7, 0, kk2+kk7+nn2-kk2, nn7);
1244   //appendBlockMatrix(GGBar2, GGBar7, GBar44, nn2, nn2, nn7, nn7);
1245   addSubMatrix(GGBar2, GBar40, kk2, nn2, 0, 0, 0, 0);
1246   addSubMatrix(GGBar7, GBar40, kk7, nn7, 0, 0, kk2, nn2);
1247   addSubMatrix(GGBar1, GBar40, nn2-kk2, nn2, kk2, 0, kk2+kk7, 0); // put the out-of-subspace vectors at the end
1248   addSubMatrix(GGBar7, GBar40, nn7-kk7, nn7, kk7, 0, kk2+kk7+nn2-kk2, nn7);
1249   appendVector(hh2, hh7, h40, nn2, nn7);
1250   Q40 = (QQ7+QQ2);
1251   appendVector(DD2, DD7, D40, kk2, kk7);
1252   appendBlockMatrix(JJ2, JJ7, J40, kk2, kk2, kk7, kk7);
1253   
1254   // e6 * phidprime
1255   int n41 = nn7+nn3; int k41 = kk7+kk3; int **G41; int **GBar41; int *h41; int Q41; int *D41; int **J41;
1256   G41 = calloc(nn7+nn3,sizeof(int*));
1257   GBar41 = calloc(nn7+nn3,sizeof(int*));
1258   h41 = calloc(nn7+nn3,sizeof(int));
1259   D41 = calloc(kk7+kk3,sizeof(int));
1260   J41 = calloc(kk7+kk3,sizeof(int*));
1261   for(i=0; i<nn7+nn3; i++) {
1262     G41[i] = calloc(nn7+nn3, sizeof(int)); GBar41[i] = calloc(nn7+nn3, sizeof(int));
1263   }
1264   for(i=0; i<kk7+kk3; i++)
1265      J41[i] = calloc(kk7+kk3, sizeof(int));
1266   //appendBlockMatrix(GG3, GG7, G45, nn3, nn3, nn7, nn7);
1267   addSubMatrix(GG3, G41, kk3, nn3, 0, 0, 0, 0);
1268   addSubMatrix(GG7, G41, kk7, nn7, 0, 0, kk3, nn3);
1269   addSubMatrix(GG3, G41, nn3-kk3, nn3, kk3, 0, kk3+kk7, 0); // put the out-of-subspace vectors at the end
1270   addSubMatrix(GG7, G41, nn7-kk7, nn7, kk7, 0, kk3+kk7+nn3-kk3, nn7);
1271   //appendBlockMatrix(GGBar3, GGBar7, GBar45, nn3, nn3, nn7, nn7);
1272   addSubMatrix(GGBar3, GBar41, kk3, nn3, 0, 0, 0, 0);
1273   addSubMatrix(GGBar7, GBar41, kk7, nn7, 0, 0, kk3, nn3);
1274   addSubMatrix(GGBar3, GBar41, nn3-kk3, nn3, kk3, 0, kk3+kk7, 0); // put the out-of-subspace vectors at the end
1275   addSubMatrix(GGBar7, GBar41, nn7-kk7, nn7, kk7, 0, kk3+kk7+nn3-kk3, nn7);
1276   appendVector(hh3, hh7, h41, nn3, nn7);
1277   Q41 = (QQ7+QQ3);
1278   appendVector(DD3, DD7, D41, kk3, kk7);
1279   appendBlockMatrix(JJ3, JJ7, J41, kk3, kk3, kk7, kk7);
1280
1281   // o6 * phidprime
1282   int n42 = nn7+nn4; int k42 = kk7+kk4; int **G42; int **GBar42; int *h42; int Q42; int *D42; int **J42;
1283   G42 = calloc(nn7+nn4,sizeof(int*));
1284   GBar42 = calloc(nn7+nn4,sizeof(int*));
1285   h42 = calloc(nn7+nn4,sizeof(int));
1286   D42 = calloc(kk7+kk4,sizeof(int));
1287   J42 = calloc(kk7+kk4,sizeof(int*));
1288   for(i=0; i<nn7+nn4; i++) {
1289     G42[i] = calloc(nn7+nn4, sizeof(int)); GBar42[i] = calloc(nn7+nn4, sizeof(int));
1290   }
1291   for(i=0; i<kk7+kk4; i++)
1292      J42[i] = calloc(kk7+kk4, sizeof(int));
1293   //appendBlockMatrix(GG4, GG7, G46, nn4, nn4, nn7, nn7);
1294   addSubMatrix(GG4, G42, kk4, nn4, 0, 0, 0, 0);
1295   addSubMatrix(GG7, G42, kk7, nn7, 0, 0, kk4, nn4);
1296   addSubMatrix(GG4, G42, nn4-kk4, nn4, kk4, 0, kk4+kk7, 0); // put the out-of-subspace vectors at the end
1297   addSubMatrix(GG7, G42, nn7-kk7, nn7, kk7, 0, kk4+kk7+nn4-kk4, nn7);
1298   //appendBlockMatrix(GGBar4, GGBar7, GBar46, nn4, nn4, nn7, nn7);
1299   addSubMatrix(GGBar4, GBar42, kk4, nn4, 0, 0, 0, 0);
1300   addSubMatrix(GGBar7, GBar42, kk7, nn7, 0, 0, kk4, nn4);
1301   addSubMatrix(GGBar4, GBar42, nn4-kk4, nn4, kk4, 0, kk4+kk7, 0); // put the out-of-subspace vectors at the end
1302   addSubMatrix(GGBar7, GBar42, nn7-kk7, nn7, kk7, 0, kk4+kk7+nn4-kk4, nn7);
1303   appendVector(hh4, hh7, h42, nn4, nn7);
1304   Q42 = (QQ7+QQ4);
1305   appendVector(DD4, DD7, D42, kk4, kk7);
1306   appendBlockMatrix(JJ4, JJ7, J42, kk4, kk4, kk7, kk7);
1307
1308   // k6 * phidprime
1309   int n43 = nn7+nn5; int k43 = kk7+kk5; int **G43; int **GBar43; int *h43; int Q43; int *D43; int **J43;
1310   G43 = calloc(nn7+nn5,sizeof(int*));
1311   GBar43 = calloc(nn7+nn5,sizeof(int*));
1312   h43 = calloc(nn7+nn5,sizeof(int));
1313   D43 = calloc(kk7+kk5,sizeof(int));
1314   J43 = calloc(kk7+kk5,sizeof(int*));
1315   for(i=0; i<nn7+nn5; i++) {
1316     G43[i] = calloc(nn7+nn5, sizeof(int)); GBar43[i] = calloc(nn7+nn5, sizeof(int));
1317   }
1318   for(i=0; i<kk7+kk5; i++)
1319      J43[i] = calloc(kk7+kk5, sizeof(int));
1320   //appendBlockMatrix(GG5, GG7, G47, nn5, nn5, nn7, nn7);
1321   addSubMatrix(GG5, G43, kk5, nn5, 0, 0, 0, 0);
1322   addSubMatrix(GG7, G43, kk7, nn7, 0, 0, kk5, nn5);
1323   addSubMatrix(GG5, G43, nn5-kk5, nn5, kk5, 0, kk5+kk7, 0); // put the out-of-subspace vectors at the end
1324   addSubMatrix(GG7, G43, nn7-kk7, nn7, kk7, 0, kk5+kk7+nn5-kk5, nn7);
1325   //appendBlockMatrix(GGBar5, GGBar7, GBar47, nn5, nn5, nn7, nn7);
1326   addSubMatrix(GGBar5, GBar43, kk5, nn5, 0, 0, 0, 0);
1327   addSubMatrix(GGBar7, GBar43, kk7, nn7, 0, 0, kk5, nn5);
1328   addSubMatrix(GGBar5, GBar43, nn5-kk5, nn5, kk5, 0, kk5+kk7, 0); // put the out-of-subspace vectors at the end
1329   addSubMatrix(GGBar7, GBar43, nn7-kk7, nn7, kk7, 0, kk5+kk7+nn5-kk5, nn7);
1330   appendVector(hh5, hh7, h43, nn5, nn7);
1331   Q43 = (QQ7+QQ5);
1332   appendVector(DD5, DD7, D43, kk5, kk7);
1333   appendBlockMatrix(JJ5, JJ7, J43, kk5, kk5, kk7, kk7);
1334
1335   // phiprime * phidprime
1336   int n44 = nn7+nn6; int k44 = kk7+kk6; int **G44; int **GBar44; int *h44; int Q44; int *D44; int **J44;
1337   G44 = calloc(nn7+nn6,sizeof(int*));
1338   GBar44 = calloc(nn7+nn6,sizeof(int*));
1339   h44 = calloc(nn7+nn6,sizeof(int));
1340   D44 = calloc(kk7+kk6,sizeof(int));
1341   J44 = calloc(kk7+kk6,sizeof(int*));
1342   for(i=0; i<nn7+nn6; i++) {
1343     G44[i] = calloc(nn7+nn6, sizeof(int)); GBar44[i] = calloc(nn7+nn6, sizeof(int));
1344   }
1345   for(i=0; i<kk7+kk6; i++)
1346      J44[i] = calloc(kk7+kk6, sizeof(int));
1347   //appendBlockMatrix(GG6, GG7, G48, nn6, nn6, nn7, nn7);
1348   addSubMatrix(GG6, G44, kk6, nn6, 0, 0, 0, 0);
1349   addSubMatrix(GG7, G44, kk7, nn7, 0, 0, kk6, nn6);
1350   addSubMatrix(GG6, G44, nn6-kk6, nn6, kk6, 0, kk6+kk7, 0); // put the out-of-subspace vectors at the end
1351   addSubMatrix(GG7, G44, nn7-kk7, nn7, kk7, 0, kk6+kk7+nn6-kk6, nn7);
1352   //appendBlockMatrix(GGBar6, GGBar7, GBar48, nn6, nn6, nn7, nn7);
1353   addSubMatrix(GGBar6, GBar44, kk6, nn6, 0, 0, 0, 0);
1354   addSubMatrix(GGBar7, GBar44, kk7, nn7, 0, 0, kk6, nn6);
1355   addSubMatrix(GGBar6, GBar44, nn6-kk6, nn6, kk6, 0, kk6+kk7, 0); // put the out-of-subspace vectors at the end
1356   addSubMatrix(GGBar7, GBar44, nn7-kk7, nn7, kk7, 0, kk6+kk7+nn6-kk6, nn7);
1357   appendVector(hh6, hh7, h44, nn6, nn7);
1358   Q44 = (QQ7+QQ6);
1359   appendVector(DD6, DD7, D44, kk6, kk7);
1360   appendBlockMatrix(JJ6, JJ7, J44, kk6, kk6, kk7, kk7);
1361
1362   // phidprime * phidprime
1363   int n45 = nn7+nn7; int k45 = kk7+kk7; int **G45; int **GBar45; int *h45; int Q45; int *D45; int **J45;
1364   G45 = calloc(nn7+nn7,sizeof(int*));
1365   GBar45 = calloc(nn7+nn7,sizeof(int*));
1366   h45 = calloc(nn7+nn7,sizeof(int));
1367   D45 = calloc(kk7+kk7,sizeof(int));
1368   J45 = calloc(kk7+kk7,sizeof(int*));
1369   for(i=0; i<nn7+nn7; i++) {
1370     G45[i] = calloc(nn7+nn7, sizeof(int)); GBar45[i] = calloc(nn7+nn7, sizeof(int));
1371   }
1372   for(i=0; i<kk7+kk7; i++)
1373      J45[i] = calloc(kk7+kk7, sizeof(int));
1374   //appendBlockMatrix(GG7, GG7, G49, nn7, nn7, nn7, nn7);
1375   addSubMatrix(GG7, G45, kk7, nn7, 0, 0, 0, 0);
1376   addSubMatrix(GG7, G45, kk7, nn7, 0, 0, kk7, nn7);
1377   addSubMatrix(GG7, G45, nn7-kk7, nn7, kk7, 0, kk7+kk7, 0); // put the out-of-subspace vectors at the end
1378   addSubMatrix(GG7, G45, nn7-kk7, nn7, kk7, 0, kk7+kk7+nn7-kk7, nn7);
1379   //appendBlockMatrix(GGBar7, GGBar7, GBar49, nn7, nn7, nn7, nn7);
1380   addSubMatrix(GGBar7, GBar45, kk7, nn7, 0, 0, 0, 0);
1381   addSubMatrix(GGBar7, GBar45, kk7, nn7, 0, 0, kk7, nn7);
1382   addSubMatrix(GGBar7, GBar45, nn7-kk7, nn7, kk7, 0, kk7+kk7, 0); // put the out-of-subspace vectors at the end
1383   addSubMatrix(GGBar7, GBar45, nn7-kk7, nn7, kk7, 0, kk7+kk7+nn7-kk7, nn7);
1384   appendVector(hh7, hh7, h45, nn7, nn7);
1385   Q45 = (QQ7+QQ7);
1386   appendVector(DD7, DD7, D45, kk7, kk7);
1387   appendBlockMatrix(JJ7, JJ7, J45, kk7, kk7, kk7, kk7);
1388
1389   // b60 * b66 + b66 * b60
1390   int n46 = 12; int k46 = 11;
1391   int (*(G46[])) = { (int[]) {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, (int[]) {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, (int[]) {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, (int[]) {1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, (int[]) {1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, (int[]) {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, (int[]) {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0}, (int[]) {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, (int[]) {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
1392   int (*(GBar46[])) = { (int[]) {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, (int[]) {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};
1393   int h46[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1394   int Q46 = 4;
1395   int D46[] = {0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4};
1396   int (*(J46[])) = { (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
1397
1398   // e6 * o6 + e6 * o6
1399   int n47 = 12; int k47 = 11;
1400   int (*(G47[])) = { (int[]) {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, (int[]) {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, (int[]) {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, (int[]) {1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, (int[]) {1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, (int[]) {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, (int[]) {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0}, (int[]) {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, (int[]) {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
1401   int (*(GBar47[])) = { (int[]) {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0}, (int[]) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, (int[]) {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};
1402   int h47[] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1403   int Q47 = 0;
1404   int D47[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1405   int (*(J47[])) = { (int[]) {0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, (int[]) {4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4}, (int[]) {4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4}, (int[]) {4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4}, (int[]) {4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4}, (int[]) {4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4}, (int[]) {4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4}, (int[]) {4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4}, (int[]) {4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4}, (int[]) {4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4}, (int[]) {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0}};
1406   
1407
1408   
1409   int *K; int ***G; int ***GBar; int **h; int *Q; int **D; int ***J;
1410   double complex Gamma[(int)pow(47,N/12)]; // prefactor in front of resultant state
1411   G = calloc(pow(47,N/12),sizeof(int*)); GBar = calloc(pow(47,N/12),sizeof(int*));
1412   h = calloc(pow(47,N/12),sizeof(int*));
1413   
1414   J = calloc(pow(47,N/12),sizeof(int*)); D = calloc(pow(47,N/12),sizeof(int*)); Q = calloc(pow(47,N/12),sizeof(int));
1415
1416   K = calloc(pow(47,N/12), sizeof(int));
1417
1418   double complex origGamma[(int)pow(47,N/12)];
1419   int *origK, *origQ, **origD;
1420   int ***origJ;
1421   int ***origG, ***origGBar;
1422   int **origh;
1423
1424   origG = calloc(pow(47,N/12),sizeof(int*)); origGBar = calloc(pow(47,N/12),sizeof(int*));
1425   origh = calloc(pow(47,N/12),sizeof(int*));
1426   
1427   origJ = calloc(pow(47,N/12),sizeof(int*)); origD = calloc(pow(47,N/12),sizeof(int*)); origQ = calloc(pow(47,N/12),sizeof(int));
1428
1429   origK = calloc(pow(47,N/12), sizeof(int));
1430
1431   int combination; // a particular combination from the linear combo of stabilizer states making up the tensor factors multiplied together
1432   
1433
1434   for(j=0; j<pow(47,N/12); j++) { // there will be 47^(N/12) combinations when using k=12 tensor factors
1435
1436     combination = j;
1437
1438     K[j] = 0.0;
1439     
1440     for(k=0; k<N/12; k++) {
1441       K[j] += (((combination%47)==46)*k47 + ((combination%47)==45)*k46 + ((combination%47)==44)*k45 + ((combination%47)==43)*k44 + ((combination%47)==42)*k43 + ((combination%47)==41)*k42 + ((combination%47)==40)*k41 + ((combination%47)==39)*k40 +
1442                ((combination%47)==38)*k39 + ((combination%47)==37)*k38 + ((combination%47)==36)*k37 + ((combination%47)==35)*k36 + ((combination%47)==34)*k35 + ((combination%47)==33)*k34 + ((combination%47)==32)*k33 + ((combination%47)==31)*k32 + ((combination%47)==30)*k31 + ((combination%47)==29)*k30 +
1443                ((combination%47)==28)*k29 + ((combination%47)==27)*k28 + ((combination%47)==26)*k27 + ((combination%47)==25)*k26 + ((combination%47)==24)*k25 + ((combination%47)==23)*k24 + ((combination%47)==22)*k23 + ((combination%47)==21)*k22 + ((combination%47)==20)*k21 + ((combination%47)==19)*k20 +
1444                ((combination%47)==18)*k19 + ((combination%47)==17)*k18 + ((combination%47)==16)*k17 + ((combination%47)==15)*k16 + ((combination%47)==14)*k15 + ((combination%47)==13)*k14 + ((combination%47)==12)*k13 + ((combination%47)==11)*k12 + ((combination%47)==10)*k11 + ((combination%47)==9)*k10 +
1445                ((combination%47)==8)*k9 + ((combination%47)==7)*k8 + ((combination%47)==6)*k7 + ((combination%47)==5)*k6 + ((combination%47)==4)*k5 + ((combination%47)==3)*k4 + ((combination%47)==2)*k3 + ((combination%47)==1)*k2 + ((combination%47)==0)*k1);
1446       combination /= 47;
1447     }
1448     combination = j;
1449     origK[j] = K[j];
1450
1451     Gamma[j] = 1.0;
1452
1453     G[j] = calloc(N, sizeof(int*)); GBar[j] = calloc(N, sizeof(int*));
1454     h[j] = calloc(N, sizeof(int));
1455
1456     if(K[j] > 0) {
1457       J[j] = calloc(K[j], sizeof(int*)); D[j] = calloc(K[j], sizeof(int));
1458       for(k=0; k<K[j]; k++)
1459         J[j][k] = calloc(K[j], sizeof(int));
1460     }
1461
1462     origG[j] = calloc(N, sizeof(int*)); origGBar[j] = calloc(N, sizeof(int*));
1463     origh[j] = calloc(N, sizeof(int));
1464
1465     if(K[j] > 0) {
1466       origJ[j] = calloc(K[j], sizeof(int*)); origD[j] = calloc(K[j], sizeof(int));
1467       for(k=0; k<K[j]; k++)
1468         origJ[j][k] = calloc(K[j], sizeof(int));
1469     }
1470
1471     for(k=0; k<N; k++) {
1472       G[j][k] = calloc(N, sizeof(int)); GBar[j][k] = calloc(N, sizeof(int));
1473       origG[j][k] = calloc(N, sizeof(int)); origGBar[j][k] = calloc(N, sizeof(int));
1474     }
1475
1476     int Kcounter = 0; // Kcounter keeps track of the K<=N that we have added already to the G rows etc. for each combination that is indexed by the digits (base 3) of 'j' in that we go through with 'k'
1477     int Kcombo; // Kcombo stores the k<(n1=n2=n3) dimension of the member of the combination that we are currently adding
1478     for(k=0; k<N/12; k++) {
1479
1480       Q[j] += (((combination%47)==46)*Q47 + ((combination%47)==45)*Q46 + ((combination%47)==44)*Q45 + ((combination%47)==43)*Q44 + ((combination%47)==42)*Q43 + ((combination%47)==41)*Q42 + ((combination%47)==40)*Q41 + ((combination%47)==39)*Q40 +
1481                ((combination%47)==38)*Q39 + ((combination%47)==37)*Q38 + ((combination%47)==36)*Q37 + ((combination%47)==35)*Q36 + ((combination%47)==34)*Q35 + ((combination%47)==33)*Q34 + ((combination%47)==32)*Q33 + ((combination%47)==31)*Q32 + ((combination%47)==30)*Q31 + ((combination%47)==29)*Q30 +
1482                ((combination%47)==28)*Q29 + ((combination%47)==27)*Q28 + ((combination%47)==26)*Q27 + ((combination%47)==25)*Q26 + ((combination%47)==24)*Q25 + ((combination%47)==23)*Q24 + ((combination%47)==22)*Q23 + ((combination%47)==21)*Q22 + ((combination%47)==20)*Q21 + ((combination%47)==19)*Q20 +
1483                ((combination%47)==18)*Q19 + ((combination%47)==17)*Q18 + ((combination%47)==16)*Q17 + ((combination%47)==15)*Q16 + ((combination%47)==14)*Q15 + ((combination%47)==13)*Q14 + ((combination%47)==12)*Q13 + ((combination%47)==11)*Q12 + ((combination%47)==10)*Q11 + ((combination%47)==9)*Q10 +
1484                ((combination%47)==8)*Q9 + ((combination%47)==7)*Q8 + ((combination%47)==6)*Q7 + ((combination%47)==5)*Q6 + ((combination%47)==4)*Q5 + ((combination%47)==3)*Q4 + ((combination%47)==2)*Q3 + ((combination%47)==1)*Q2 + ((combination%47)==0)*Q1);
1485       
1486
1487       Gamma[j] *= (((combination%47)==46)*coeffe6*coeffo6*sqrt(2.0) + ((combination%47)==45)*coeffb60*coeffb66*sqrt(2.0) + ((combination%47)==44)*coeffphidprime*coeffphidprime + ((combination%47)==43)*coeffphiprime*coeffphidprime + ((combination%47)==42)*coeffk6*coeffphidprime + ((combination%47)==41)*coeffo6*coeffphidprime + ((combination%47)==40)*coeffe6*coeffphidprime + ((combination%47)==39)*coeffb66*coeffphidprime + ((combination%47)==38)*coeffb60*coeffphidprime
1488                    + ((combination%47)==37)*coeffphidprime*coeffphiprime + ((combination%47)==36)*coeffphiprime*coeffphiprime + ((combination%47)==35)*coeffk6*coeffphiprime + ((combination%47)==34)*coeffo6*coeffphiprime + ((combination%47)==33)*coeffe6*coeffphiprime + ((combination%47)==32)*coeffb66*coeffphiprime + ((combination%47)==31)*coeffb60*coeffphiprime
1489                    + ((combination%47)==30)*coeffphidprime*coeffk6 + ((combination%47)==29)*coeffphiprime*coeffk6 + ((combination%47)==28)*coeffk6*coeffk6 + ((combination%47)==27)*coeffo6*coeffk6 + ((combination%47)==26)*coeffe6*coeffk6 + ((combination%47)==25)*coeffb66*coeffk6 + ((combination%47)==24)*coeffb60*coeffk6
1490                    + ((combination%47)==23)*coeffphidprime*coeffo6 + ((combination%47)==22)*coeffphiprime*coeffo6 + ((combination%47)==21)*coeffk6*coeffo6 + ((combination%47)==20)*coeffo6*coeffo6  + ((combination%47)==19)*coeffb66*coeffo6 + ((combination%47)==18)*coeffb60*coeffo6
1491                    + ((combination%47)==17)*coeffphidprime*coeffe6 + ((combination%47)==16)*coeffphiprime*coeffe6 + ((combination%47)==15)*coeffk6*coeffe6 + ((combination%47)==14)*coeffe6*coeffe6 + ((combination%47)==13)*coeffb66*coeffe6 + ((combination%47)==12)*coeffb60*coeffe6
1492                    + ((combination%47)==11)*coeffphidprime*coeffb66 + ((combination%47)==10)*coeffphiprime*coeffb66 + ((combination%47)==9)*coeffk6*coeffb66 + ((combination%47)==8)*coeffo6*coeffb66 + ((combination%47)==7)*coeffe6*coeffb66 + ((combination%47)==6)*coeffb66*coeffb66
1493                    + ((combination%47)==5)*coeffphidprime*coeffb60 + ((combination%47)==4)*coeffphiprime*coeffb60 + ((combination%47)==3)*coeffk6*coeffb60 + ((combination%47)==2)*coeffo6*coeffb60 + ((combination%47)==1)*coeffe6*coeffb60 + ((combination%47)==0)*coeffb60*coeffb60);
1494
1495       Kcombo = (((combination%47)==46)*k47 + ((combination%47)==45)*k46 + ((combination%47)==44)*k45 + ((combination%47)==43)*k44 + ((combination%47)==42)*k43 + ((combination%47)==41)*k42 + ((combination%47)==40)*k41 + ((combination%47)==39)*k40 +
1496                ((combination%47)==38)*k39 + ((combination%47)==37)*k38 + ((combination%47)==36)*k37 + ((combination%47)==35)*k36 + ((combination%47)==34)*k35 + ((combination%47)==33)*k34 + ((combination%47)==32)*k33 + ((combination%47)==31)*k32 + ((combination%47)==30)*k31 + ((combination%47)==29)*k30 +
1497                ((combination%47)==28)*k29 + ((combination%47)==27)*k28 + ((combination%47)==26)*k27 + ((combination%47)==25)*k26 + ((combination%47)==24)*k25 + ((combination%47)==23)*k24 + ((combination%47)==22)*k23 + ((combination%47)==21)*k22 + ((combination%47)==20)*k21 + ((combination%47)==19)*k20 +
1498                ((combination%47)==18)*k19 + ((combination%47)==17)*k18 + ((combination%47)==16)*k17 + ((combination%47)==15)*k16 + ((combination%47)==14)*k15 + ((combination%47)==13)*k14 + ((combination%47)==12)*k13 + ((combination%47)==11)*k12 + ((combination%47)==10)*k11 + ((combination%47)==9)*k10 +
1499                ((combination%47)==8)*k9 + ((combination%47)==7)*k8 + ((combination%47)==6)*k7 + ((combination%47)==5)*k6 + ((combination%47)==4)*k5 + ((combination%47)==3)*k4 + ((combination%47)==2)*k3 + ((combination%47)==1)*k2 + ((combination%47)==0)*k1);
1500       for(l=0; l<Kcombo; l++) {
1501         // D1 has a different number of rows 'l' than D2 and D3 so you need to use something like 'switch' to check combination%3 without going out of bound of J1
1502         switch(combination%47) {
1503         case 0:
1504           D[j][Kcounter+l] = D1[l];
1505           break;
1506         case 1:
1507           D[j][Kcounter+l] = D2[l];
1508           break;
1509         case 2:
1510           D[j][Kcounter+l] = D3[l];
1511           break;
1512         case 3:
1513           D[j][Kcounter+l] = D4[l];
1514             break;
1515         case 4:
1516           D[j][Kcounter+l] = D5[l];
1517           break;
1518         case 5:
1519           D[j][Kcounter+l] = D6[l];
1520           break;
1521         case 6:
1522           D[j][Kcounter+l] = D7[l];
1523           break;
1524         case 7:
1525           D[j][Kcounter+l] = D8[l];
1526           break;
1527         case 8:
1528           D[j][Kcounter+l] = D9[l];
1529           break;
1530         case 9:
1531           D[j][Kcounter+l] = D10[l];
1532           break;
1533         case 10:
1534           D[j][Kcounter+l] = D11[l];
1535           break;
1536         case 11:
1537           D[j][Kcounter+l] = D12[l];
1538           break;
1539         case 12:
1540           D[j][Kcounter+l] = D13[l];
1541           break;
1542         case 13:
1543           D[j][Kcounter+l] = D14[l];
1544             break;
1545         case 14:
1546           D[j][Kcounter+l] = D15[l];
1547           break;
1548         case 15:
1549           D[j][Kcounter+l] = D16[l];
1550           break;
1551         case 16:
1552           D[j][Kcounter+l] = D17[l];
1553           break;
1554         case 17:
1555           D[j][Kcounter+l] = D18[l];
1556           break;
1557         case 18:
1558           D[j][Kcounter+l] = D19[l];
1559           break;
1560         case 19:
1561           D[j][Kcounter+l] = D20[l];
1562           break;
1563         case 20:
1564           D[j][Kcounter+l] = D21[l];
1565           break;
1566         case 21:
1567           D[j][Kcounter+l] = D22[l];
1568           break;
1569         case 22:
1570           D[j][Kcounter+l] = D23[l];
1571           break;
1572         case 23:
1573           D[j][Kcounter+l] = D24[l];
1574             break;
1575         case 24:
1576           D[j][Kcounter+l] = D25[l];
1577           break;
1578         case 25:
1579           D[j][Kcounter+l] = D26[l];
1580           break;
1581         case 26:
1582           D[j][Kcounter+l] = D27[l];
1583           break;
1584         case 27:
1585           D[j][Kcounter+l] = D28[l];
1586           break;
1587         case 28:
1588           D[j][Kcounter+l] = D29[l];
1589           break;
1590         case 29:
1591           D[j][Kcounter+l] = D30[l];
1592           break;
1593         case 30:
1594           D[j][Kcounter+l] = D31[l];
1595           break;
1596         case 31:
1597           D[j][Kcounter+l] = D32[l];
1598           break;
1599         case 32:
1600           D[j][Kcounter+l] = D33[l];
1601           break;
1602         case 33:
1603           D[j][Kcounter+l] = D34[l];
1604             break;
1605         case 34:
1606           D[j][Kcounter+l] = D35[l];
1607           break;
1608         case 35:
1609           D[j][Kcounter+l] = D36[l];
1610           break;
1611         case 36:
1612           D[j][Kcounter+l] = D37[l];
1613           break;
1614         case 37:
1615           D[j][Kcounter+l] = D38[l];
1616           break;
1617         case 38:
1618           D[j][Kcounter+l] = D39[l];
1619           break;
1620         case 39:
1621           D[j][Kcounter+l] = D40[l];
1622           break;
1623         case 40:
1624           D[j][Kcounter+l] = D41[l];
1625           break;
1626         case 41:
1627           D[j][Kcounter+l] = D42[l];
1628           break;
1629         case 42:
1630           D[j][Kcounter+l] = D43[l];
1631           break;
1632         case 43:
1633           D[j][Kcounter+l] = D44[l];
1634             break;
1635         case 44:
1636           D[j][Kcounter+l] = D45[l];
1637           break;
1638         case 45:
1639           D[j][Kcounter+l] = D46[l];
1640           break;
1641         case 46:
1642           D[j][Kcounter+l] = D47[l];
1643           break;
1644         default:
1645           printf("error");
1646           return 1;
1647           }
1648         for(m=0; m<Kcombo; m++) {
1649           // J1 has a different number of rows 'l' than J2 and J3 so you need to use something like 'switch' to check combination%3 without going out of bound of J1
1650           switch(combination%47) {
1651           case 0:
1652             J[j][Kcounter+l][Kcounter+m] = J1[l][m];
1653             break;
1654           case 1:
1655             J[j][Kcounter+l][Kcounter+m] = J2[l][m];
1656             break;
1657           case 2:
1658             J[j][Kcounter+l][Kcounter+m] = J3[l][m];
1659             break;
1660           case 3:
1661             J[j][Kcounter+l][Kcounter+m] = J4[l][m];
1662             break;
1663           case 4:
1664             J[j][Kcounter+l][Kcounter+m] = J5[l][m];
1665             break;
1666           case 5:
1667             J[j][Kcounter+l][Kcounter+m] = J6[l][m];
1668             break;
1669           case 6:
1670             J[j][Kcounter+l][Kcounter+m] = J7[l][m];
1671             break;
1672           case 7:
1673             J[j][Kcounter+l][Kcounter+m] = J8[l][m];
1674             break;
1675           case 8:
1676             J[j][Kcounter+l][Kcounter+m] = J9[l][m];
1677             break;
1678           case 9:
1679             J[j][Kcounter+l][Kcounter+m] = J10[l][m];
1680             break;
1681           case 10:
1682             J[j][Kcounter+l][Kcounter+m] = J11[l][m];
1683             break;
1684           case 11:
1685             J[j][Kcounter+l][Kcounter+m] = J12[l][m];
1686             break;
1687           case 12:
1688             J[j][Kcounter+l][Kcounter+m] = J13[l][m];
1689             break;
1690           case 13:
1691             J[j][Kcounter+l][Kcounter+m] = J14[l][m];
1692             break;
1693           case 14:
1694             J[j][Kcounter+l][Kcounter+m] = J15[l][m];
1695             break;
1696           case 15:
1697             J[j][Kcounter+l][Kcounter+m] = J16[l][m];
1698             break;
1699           case 16:
1700             J[j][Kcounter+l][Kcounter+m] = J17[l][m];
1701             break;
1702           case 17:
1703             J[j][Kcounter+l][Kcounter+m] = J18[l][m];
1704             break;
1705           case 18:
1706             J[j][Kcounter+l][Kcounter+m] = J19[l][m];
1707             break;
1708           case 19:
1709             J[j][Kcounter+l][Kcounter+m] = J20[l][m];
1710             break;
1711           case 20:
1712             J[j][Kcounter+l][Kcounter+m] = J21[l][m];
1713             break;
1714           case 21:
1715             J[j][Kcounter+l][Kcounter+m] = J22[l][m];
1716             break;
1717           case 22:
1718             J[j][Kcounter+l][Kcounter+m] = J23[l][m];
1719             break;
1720           case 23:
1721             J[j][Kcounter+l][Kcounter+m] = J24[l][m];
1722             break;
1723           case 24:
1724             J[j][Kcounter+l][Kcounter+m] = J25[l][m];
1725             break;
1726           case 25:
1727             J[j][Kcounter+l][Kcounter+m] = J26[l][m];
1728             break;
1729           case 26:
1730             J[j][Kcounter+l][Kcounter+m] = J27[l][m];
1731             break;
1732           case 27:
1733             J[j][Kcounter+l][Kcounter+m] = J28[l][m];
1734             break;
1735           case 28:
1736             J[j][Kcounter+l][Kcounter+m] = J29[l][m];
1737             break;
1738           case 29:
1739             J[j][Kcounter+l][Kcounter+m] = J30[l][m];
1740             break;
1741           case 30:
1742             J[j][Kcounter+l][Kcounter+m] = J31[l][m];
1743             break;
1744           case 31:
1745             J[j][Kcounter+l][Kcounter+m] = J32[l][m];
1746             break;
1747           case 32:
1748             J[j][Kcounter+l][Kcounter+m] = J33[l][m];
1749             break;
1750           case 33:
1751             J[j][Kcounter+l][Kcounter+m] = J34[l][m];
1752             break;
1753           case 34:
1754             J[j][Kcounter+l][Kcounter+m] = J35[l][m];
1755             break;
1756           case 35:
1757             J[j][Kcounter+l][Kcounter+m] = J36[l][m];
1758             break;
1759           case 36:
1760             J[j][Kcounter+l][Kcounter+m] = J37[l][m];
1761             break;
1762           case 37:
1763             J[j][Kcounter+l][Kcounter+m] = J38[l][m];
1764             break;
1765           case 38:
1766             J[j][Kcounter+l][Kcounter+m] = J39[l][m];
1767             break;
1768           case 39:
1769             J[j][Kcounter+l][Kcounter+m] = J40[l][m];
1770             break;
1771           case 40:
1772             J[j][Kcounter+l][Kcounter+m] = J41[l][m];
1773             break;
1774           case 41:
1775             J[j][Kcounter+l][Kcounter+m] = J42[l][m];
1776             break;
1777           case 42:
1778             J[j][Kcounter+l][Kcounter+m] = J43[l][m];
1779             break;
1780           case 43:
1781             J[j][Kcounter+l][Kcounter+m] = J44[l][m];
1782             break;
1783           case 44:
1784             J[j][Kcounter+l][Kcounter+m] = J45[l][m];
1785             break;
1786           case 45:
1787             J[j][Kcounter+l][Kcounter+m] = J46[l][m];
1788             break;
1789           case 46:
1790             J[j][Kcounter+l][Kcounter+m] = J47[l][m];
1791             break;
1792           default:
1793             printf("error");
1794             return 1;
1795           }
1796         }
1797       }
1798
1799       for(l=0; l<n1; l++) { // assuming n1=n2=n3
1800         h[j][k*n1+l] = (((combination%47)==46)*h47[l] + ((combination%47)==45)*h46[l] + ((combination%47)==44)*h45[l] + ((combination%47)==43)*h44[l] + ((combination%47)==42)*h43[l] + ((combination%47)==41)*h42[l] + ((combination%47)==40)*h41[l] + ((combination%47)==39)*h40[l] +
1801                         ((combination%47)==38)*h39[l] + ((combination%47)==37)*h38[l] + ((combination%47)==36)*h37[l] + ((combination%47)==35)*h36[l] + ((combination%47)==34)*h35[l] + ((combination%47)==33)*h34[l] + ((combination%47)==32)*h33[l] + ((combination%47)==31)*h32[l] + ((combination%47)==30)*h31[l] + ((combination%47)==29)*h30[l] +
1802                         ((combination%47)==28)*h29[l] + ((combination%47)==27)*h28[l] + ((combination%47)==26)*h27[l] + ((combination%47)==25)*h26[l] + ((combination%47)==24)*h25[l] + ((combination%47)==23)*h24[l] + ((combination%47)==22)*h23[l] + ((combination%47)==21)*h22[l] + ((combination%47)==20)*h21[l] + ((combination%47)==19)*h20[l] +
1803                         ((combination%47)==18)*h19[l] + ((combination%47)==17)*h18[l] + ((combination%47)==16)*h17[l] + ((combination%47)==15)*h16[l] + ((combination%47)==14)*h15[l] + ((combination%47)==13)*h14[l] + ((combination%47)==12)*h13[l] + ((combination%47)==11)*h12[l] + ((combination%47)==10)*h11[l] + ((combination%47)==9)*h10[l] +
1804                         ((combination%47)==8)*h9[l] + ((combination%47)==7)*h8[l] + ((combination%47)==6)*h7[l] + ((combination%47)==5)*h6[l] + ((combination%47)==4)*h5[l] + ((combination%47)==3)*h4[l] + ((combination%47)==2)*h3[l] + ((combination%47)==1)*h2[l] + ((combination%47)==0)*h1[l]);
1805       }
1806       // only filling the K[j] first rows of G and GBar here corresponding to the basis for D and J
1807       for(l=0; l<Kcombo; l++) {
1808         for(m=0; m<n1; m++) { // assuming n1=n2=n3
1809           G[j][Kcounter+l][k*n1+m] = (((combination%47)==46)*G47[l][m] + ((combination%47)==45)*G46[l][m] + ((combination%47)==44)*G45[l][m] + ((combination%47)==43)*G44[l][m] + ((combination%47)==42)*G43[l][m] + ((combination%47)==41)*G42[l][m] + ((combination%47)==40)*G41[l][m] + ((combination%47)==39)*G40[l][m] +
1810                                       ((combination%47)==38)*G39[l][m] + ((combination%47)==37)*G38[l][m] + ((combination%47)==36)*G37[l][m] + ((combination%47)==35)*G36[l][m] + ((combination%47)==34)*G35[l][m] + ((combination%47)==33)*G34[l][m] + ((combination%47)==32)*G33[l][m] + ((combination%47)==31)*G32[l][m] + ((combination%47)==30)*G31[l][m] + ((combination%47)==29)*G30[l][m] +
1811                                       ((combination%47)==28)*G29[l][m] + ((combination%47)==27)*G28[l][m] + ((combination%47)==26)*G27[l][m] + ((combination%47)==25)*G26[l][m] + ((combination%47)==24)*G25[l][m] + ((combination%47)==23)*G24[l][m] + ((combination%47)==22)*G23[l][m] + ((combination%47)==21)*G22[l][m] + ((combination%47)==20)*G21[l][m] + ((combination%47)==19)*G20[l][m] +
1812                                       ((combination%47)==18)*G19[l][m] + ((combination%47)==17)*G18[l][m] + ((combination%47)==16)*G17[l][m] + ((combination%47)==15)*G16[l][m] + ((combination%47)==14)*G15[l][m] + ((combination%47)==13)*G14[l][m] + ((combination%47)==12)*G13[l][m] + ((combination%47)==11)*G12[l][m] + ((combination%47)==10)*G11[l][m] + ((combination%47)==9)*G10[l][m] +
1813                                       ((combination%47)==8)*G9[l][m] + ((combination%47)==7)*G8[l][m] + ((combination%47)==6)*G7[l][m] + ((combination%47)==5)*G6[l][m] + ((combination%47)==4)*G5[l][m] + ((combination%47)==3)*G4[l][m] + ((combination%47)==2)*G3[l][m] + ((combination%47)==1)*G2[l][m] + ((combination%47)==0)*G1[l][m]);
1814           GBar[j][Kcounter+l][k*n1+m] = (((combination%47)==46)*GBar47[l][m] + ((combination%47)==45)*GBar46[l][m] + ((combination%47)==44)*GBar45[l][m] + ((combination%47)==43)*GBar44[l][m] + ((combination%47)==42)*GBar43[l][m] + ((combination%47)==41)*GBar42[l][m] + ((combination%47)==40)*GBar41[l][m] + ((combination%47)==39)*GBar40[l][m] +
1815                                          ((combination%47)==38)*GBar39[l][m] + ((combination%47)==37)*GBar38[l][m] + ((combination%47)==36)*GBar37[l][m] + ((combination%47)==35)*GBar36[l][m] + ((combination%47)==34)*GBar35[l][m] + ((combination%47)==33)*GBar34[l][m] + ((combination%47)==32)*GBar33[l][m] + ((combination%47)==31)*GBar32[l][m] + ((combination%47)==30)*GBar31[l][m] + ((combination%47)==29)*GBar30[l][m] +
1816                                          ((combination%47)==28)*GBar29[l][m] + ((combination%47)==27)*GBar28[l][m] + ((combination%47)==26)*GBar27[l][m] + ((combination%47)==25)*GBar26[l][m] + ((combination%47)==24)*GBar25[l][m] + ((combination%47)==23)*GBar24[l][m] + ((combination%47)==22)*GBar23[l][m] + ((combination%47)==21)*GBar22[l][m] + ((combination%47)==20)*GBar21[l][m] + ((combination%47)==19)*GBar20[l][m] +
1817                                          ((combination%47)==18)*GBar19[l][m] + ((combination%47)==17)*GBar18[l][m] + ((combination%47)==16)*GBar17[l][m] + ((combination%47)==15)*GBar16[l][m] + ((combination%47)==14)*GBar15[l][m] + ((combination%47)==13)*GBar14[l][m] + ((combination%47)==12)*GBar13[l][m] + ((combination%47)==11)*GBar12[l][m] + ((combination%47)==10)*GBar11[l][m] + ((combination%47)==9)*GBar10[l][m] +
1818                                          ((combination%47)==8)*GBar9[l][m] + ((combination%47)==7)*GBar8[l][m] + ((combination%47)==6)*GBar7[l][m] + ((combination%47)==5)*GBar6[l][m] + ((combination%47)==4)*GBar5[l][m] + ((combination%47)==3)*GBar4[l][m] + ((combination%47)==2)*GBar3[l][m] + ((combination%47)==1)*GBar2[l][m] + ((combination%47)==0)*GBar1[l][m]);
1819         }
1820       }
1821       Kcounter = Kcounter + Kcombo;
1822       
1823       /* printf("intermediate G[%d]:\n", j); */
1824       /* printMatrix(G[j], N, N); */
1825       /* printf("intermediate GBar[%d]:\n", j); */
1826       /* printMatrix(GBar[j], N, N); */
1827       //memcpy(origG[j][k], G[j][k], N*sizeof(int)); memcpy(origGBar[j][k], GBar[j][k], N*sizeof(int));
1828
1829       //memcpy(origJ[j][k], J[j][k], K[j]*sizeof(int));
1830       
1831       combination /= 47; // shift to the right by one (in base-47 arithmetic)
1832     }
1833     //printf("!\n");
1834
1835     // now need to fill the N-Kcounter remaining rows of G and GBar that are outside the spanning basis states of D and J
1836     combination = j;
1837     for(k=0; k<(N/12); k++) {
1838       Kcombo = (((combination%47)==46)*k47 + ((combination%47)==45)*k46 + ((combination%47)==44)*k45 + ((combination%47)==43)*k44 + ((combination%47)==42)*k43 + ((combination%47)==41)*k42 + ((combination%47)==40)*k41 + ((combination%47)==39)*k40 +
1839                ((combination%47)==38)*k39 + ((combination%47)==37)*k38 + ((combination%47)==36)*k37 + ((combination%47)==35)*k36 + ((combination%47)==34)*k35 + ((combination%47)==33)*k34 + ((combination%47)==32)*k33 + ((combination%47)==31)*k32 + ((combination%47)==30)*k31 + ((combination%47)==29)*k30 +
1840                ((combination%47)==28)*k29 + ((combination%47)==27)*k28 + ((combination%47)==26)*k27 + ((combination%47)==25)*k26 + ((combination%47)==24)*k25 + ((combination%47)==23)*k24 + ((combination%47)==22)*k23 + ((combination%47)==21)*k22 + ((combination%47)==20)*k21 + ((combination%47)==19)*k20 +
1841                ((combination%47)==18)*k19 + ((combination%47)==17)*k18 + ((combination%47)==16)*k17 + ((combination%47)==15)*k16 + ((combination%47)==14)*k15 + ((combination%47)==13)*k14 + ((combination%47)==12)*k13 + ((combination%47)==11)*k12 + ((combination%47)==10)*k11 + ((combination%47)==9)*k10 +
1842                ((combination%47)==8)*k9 + ((combination%47)==7)*k8 + ((combination%47)==6)*k7 + ((combination%47)==5)*k6 + ((combination%47)==4)*k5 + ((combination%47)==3)*k4 + ((combination%47)==2)*k3 + ((combination%47)==1)*k2 + ((combination%47)==0)*k1);
1843       //printf("Kcounter=%d\n", Kcounter);
1844       // G and GBar rows that are outside the first 'k' spanning basis states
1845       for(l=Kcombo; l<n1; l++) { // assuming n1=n2=n3
1846         //printf("l=%d\n", l);
1847         for(m=0; m<n1; m++) { // assuming n1=n2=n3
1848           /* printf("m=%d\n", m); */
1849           /* printf("Kcounter+l=%d\n", Kcounter+l); */
1850           /* printf("k*n1+m=%d\n", k*n1+m); */
1851           G[j][Kcounter+l-Kcombo][k*n1+m] = (((combination%47)==46)*G47[l][m] + ((combination%47)==45)*G46[l][m] + ((combination%47)==44)*G45[l][m] + ((combination%47)==43)*G44[l][m] + ((combination%47)==42)*G43[l][m] + ((combination%47)==41)*G42[l][m] + ((combination%47)==40)*G41[l][m] + ((combination%47)==39)*G40[l][m] +
1852                                       ((combination%47)==38)*G39[l][m] + ((combination%47)==37)*G38[l][m] + ((combination%47)==36)*G37[l][m] + ((combination%47)==35)*G36[l][m] + ((combination%47)==34)*G35[l][m] + ((combination%47)==33)*G34[l][m] + ((combination%47)==32)*G33[l][m] + ((combination%47)==31)*G32[l][m] + ((combination%47)==30)*G31[l][m] + ((combination%47)==29)*G30[l][m] +
1853                                       ((combination%47)==28)*G29[l][m] + ((combination%47)==27)*G28[l][m] + ((combination%47)==26)*G27[l][m] + ((combination%47)==25)*G26[l][m] + ((combination%47)==24)*G25[l][m] + ((combination%47)==23)*G24[l][m] + ((combination%47)==22)*G23[l][m] + ((combination%47)==21)*G22[l][m] + ((combination%47)==20)*G21[l][m] + ((combination%47)==19)*G20[l][m] +
1854                                       ((combination%47)==18)*G19[l][m] + ((combination%47)==17)*G18[l][m] + ((combination%47)==16)*G17[l][m] + ((combination%47)==15)*G16[l][m] + ((combination%47)==14)*G15[l][m] + ((combination%47)==13)*G14[l][m] + ((combination%47)==12)*G13[l][m] + ((combination%47)==11)*G12[l][m] + ((combination%47)==10)*G11[l][m] + ((combination%47)==9)*G10[l][m] +
1855                                       ((combination%47)==8)*G9[l][m] + ((combination%47)==7)*G8[l][m] + ((combination%47)==6)*G7[l][m] + ((combination%47)==5)*G6[l][m] + ((combination%47)==4)*G5[l][m] + ((combination%47)==3)*G4[l][m] + ((combination%47)==2)*G3[l][m] + ((combination%47)==1)*G2[l][m] + ((combination%47)==0)*G1[l][m]);
1856           GBar[j][Kcounter+l-Kcombo][k*n1+m] = (((combination%47)==46)*GBar47[l][m] + ((combination%47)==45)*GBar46[l][m] + ((combination%47)==44)*GBar45[l][m] + ((combination%47)==43)*GBar44[l][m] + ((combination%47)==42)*GBar43[l][m] + ((combination%47)==41)*GBar42[l][m] + ((combination%47)==40)*GBar41[l][m] + ((combination%47)==39)*GBar40[l][m] +
1857                                          ((combination%47)==38)*GBar39[l][m] + ((combination%47)==37)*GBar38[l][m] + ((combination%47)==36)*GBar37[l][m] + ((combination%47)==35)*GBar36[l][m] + ((combination%47)==34)*GBar35[l][m] + ((combination%47)==33)*GBar34[l][m] + ((combination%47)==32)*GBar33[l][m] + ((combination%47)==31)*GBar32[l][m] + ((combination%47)==30)*GBar31[l][m] + ((combination%47)==29)*GBar30[l][m] +
1858                                          ((combination%47)==28)*GBar29[l][m] + ((combination%47)==27)*GBar28[l][m] + ((combination%47)==26)*GBar27[l][m] + ((combination%47)==25)*GBar26[l][m] + ((combination%47)==24)*GBar25[l][m] + ((combination%47)==23)*GBar24[l][m] + ((combination%47)==22)*GBar23[l][m] + ((combination%47)==21)*GBar22[l][m] + ((combination%47)==20)*GBar21[l][m] + ((combination%47)==19)*GBar20[l][m] +
1859                                          ((combination%47)==18)*GBar19[l][m] + ((combination%47)==17)*GBar18[l][m] + ((combination%47)==16)*GBar17[l][m] + ((combination%47)==15)*GBar16[l][m] + ((combination%47)==14)*GBar15[l][m] + ((combination%47)==13)*GBar14[l][m] + ((combination%47)==12)*GBar13[l][m] + ((combination%47)==11)*GBar12[l][m] + ((combination%47)==10)*GBar11[l][m] + ((combination%47)==9)*GBar10[l][m] +
1860                                          ((combination%47)==8)*GBar9[l][m] + ((combination%47)==7)*GBar8[l][m] + ((combination%47)==6)*GBar7[l][m] + ((combination%47)==5)*GBar6[l][m] + ((combination%47)==4)*GBar5[l][m] + ((combination%47)==3)*GBar4[l][m] + ((combination%47)==2)*GBar3[l][m] + ((combination%47)==1)*GBar2[l][m] + ((combination%47)==0)*GBar1[l][m]);
1861         }
1862       }
1863       Kcounter = Kcounter + (n1-Kcombo);
1864
1865       /* printf("intermediate G[%d]:\n", j); */
1866       /* printMatrix(G[j], N, N); */
1867       /* printf("intermediate GBar[%d]:\n", j); */
1868       /* printMatrix(GBar[j], N, N); */
1869       
1870       combination /= 47;
1871     }
1872     for(k=0; k<N; k++) {
1873       memcpy(origG[j][k], G[j][k], N*sizeof(int)); memcpy(origGBar[j][k], GBar[j][k], N*sizeof(int));
1874     }
1875     for(k=0; k<K[j]; k++) {
1876       memcpy(origJ[j][k], J[j][k], K[j]*sizeof(int));      
1877     }
1878
1879     memcpy(origh[j], h[j], N*sizeof(int));
1880     memcpy(origD[j], D[j], K[j]*sizeof(int));
1881
1882     /*printf("G[%d]:\n", j);
1883     printMatrix(G[j], N, N);
1884     printf("GBar[%d]:\n", j);
1885     printMatrix(GBar[j], N, N);
1886
1887     printf("h[%d]:\n", j);
1888     printVector(h[j], N);
1889
1890     printf("J[%d]:\n", j);
1891     printMatrix(J[j], K[j], K[j]);
1892     
1893     printf("D[%d]:\n", j);
1894     printVector(D[j], K[j]);
1895
1896     printf("Q[%d]=%d\n", j, Q[j]);*/
1897
1898   }
1899   //exit(0);
1900   memcpy(origGamma, Gamma, pow(47,N/12)*sizeof(double complex));
1901
1902   memcpy(origQ, Q, pow(47,N/12)*sizeof(int));
1903
1904   while(readPaulicoeffs(&omega, alpha, beta, gamma, delta, N)) {
1905
1906     Paulicounter++;
1907     if(Paulicounter > N) {
1908       printf("Error: Number of Paulis is greater than N!\n");
1909       return 1;
1910     }
1911     
1912     // Let's break up the Ys into Xs and Zs in the order Z X, as required to pass to measurepauli()
1913     // Y_i = -I*Z*X
1914     for(i=0; i<N; i++) {
1915       if(delta[i]){
1916         omega += 3; // -I = I^3
1917         beta[i] = delta[i];
1918         gamma[i] = delta[i];
1919       }
1920     }
1921
1922     /*printf("*******\n");
1923     printf("*******\n");
1924     printf("omega=%d\n", omega);
1925     printf("X:\n");
1926     printVector(gamma, N);
1927     printf("Z:\n");
1928     printVector(beta, N);
1929     printf("*******\n");
1930     printf("*******\n");*/
1931
1932     for(j=0; j<pow(47,N/12); j++) { // the kets
1933
1934       /*printf("========\n");
1935       printf("before:\n");
1936       printf("K=%d\n", K[j]);
1937       printf("h:\n");
1938       printVector(h[j], N);
1939       printf("Gamma[%d]=%lf+%lf\n", j, creal(Gamma[j]), cimag(Gamma[j]));
1940       printf("G:\n");
1941       printMatrix(G[j], N, N);
1942       printf("GBar:\n");
1943       printMatrix(GBar[j], N, N);
1944       printf("Q=%d\n", Q[j]);
1945       printf("D:\n");
1946       printVector(D[j], K[j]);
1947       printf("J:\n");
1948       printMatrix(J[j], K[j], K[j]);*/
1949       Gamma[j] *= measurepauli(N, &K[j], h[j], G[j], GBar[j], &Q[j], &D[j], &J[j], omega, gamma, beta);
1950       /*printf("\nafter:\n");
1951       printf("K=%d\n", K[j]);
1952       printf("h:\n");
1953       printVector(h[j], N);
1954       printf("Gamma[%d]=%lf+%lf\n", j, creal(Gamma[j]), cimag(Gamma[j]));
1955       printf("G:\n");
1956       printMatrix(G[j], N, N);
1957       printf("GBar:\n");
1958       printMatrix(GBar[j], N, N);
1959       printf("Q=%d\n", Q[j]);
1960       printf("D:\n");
1961       printVector(D[j], K[j]);
1962       printf("J:\n");
1963       printMatrix(J[j], K[j], K[j]);*/
1964
1965     }
1966
1967   }
1968
1969   double complex amplitude = 0.0 + 0.0*I;
1970   for(i=0; i<pow(47,N/12); i++) { // the bras
1971     printf("i=%d\n", i);
1972     for(j=0; j<pow(47,N/12); j++) {
1973       double complex newamplitude = innerproduct(N, K[j], h[j], G[j], GBar[j], Q[j], D[j], J[j], N, origK[i], origh[i], origG[i], origGBar[i], origQ[i], origD[i], origJ[i]);
1974       amplitude = amplitude + conj(origGamma[i])*Gamma[j]*newamplitude;
1975     }
1976   }
1977
1978   printf("amplitude:\n");
1979   if(creal(amplitude+ZEROTHRESHOLD)>0)
1980     printf("%.10lf %c %.10lf I\n", cabs(creal(amplitude)), cimag(amplitude+ZEROTHRESHOLD)>0?'+':'-' , cabs(cimag(amplitude)));
1981   else
1982     printf("%.10lf %c %.10lf I\n", creal(amplitude), cimag(amplitude+ZEROTHRESHOLD)>0?'+':'-' , cabs(cimag(amplitude)));
1983
1984   return 0;
1985
1986 }
1987
1988
1989
1990 int readPaulicoeffs(int *omega, int *alpha, int *beta, int *gamma, int *delta, int numqubits)
1991 {
1992     
1993   int newomega, newalpha, newbeta, newgamma, newdelta;
1994   int i;
1995
1996   if(scanf("%d", &newomega) != EOF) {
1997     *omega = newomega;
1998     for(i=0; i<numqubits; i++) {
1999       if(scanf("%d %d %d %d", &newalpha, &newbeta, &newgamma, &newdelta) == EOF) {
2000         printf("Error: Too few input coeffs!\n");
2001         exit(0);
2002       }
2003       if(newalpha+newbeta+newgamma+newdelta > 1) {
2004         printf("Error: Too many coefficients are non-zero at Pauli %d!\n", i);
2005         exit(0);
2006       }
2007       alpha[i] = newalpha; beta[i] = newbeta; gamma[i] = newgamma; delta[i] = newdelta;
2008     }
2009     return 1;
2010   } else
2011     return 0;
2012     
2013 }