X-Git-Url: https://s3miclassical.com/gitweb/?p=weak_simulation_stab_extent.git;a=blobdiff_plain;f=multipauli.c;fp=multipauli.c;h=2161b72083f676d3055279186392eb0f2d5707c4;hp=0000000000000000000000000000000000000000;hb=7bc25656311c391af6a4d5814cc82080981c63c4;hpb=d914e7c183347b1340988e0869a6e053dd573991 diff --git a/multipauli.c b/multipauli.c new file mode 100644 index 0000000..2161b72 --- /dev/null +++ b/multipauli.c @@ -0,0 +1,301 @@ +#include +#include +#include +#include + +void deallocate_mem(complex double ***arr, int rows); +void printMatrix(complex double** a, int rows, int cols); +complex double** multMatrix(complex double **A, complex double **B, int ro1, int co1, int ro2, int co2); +complex double** outerMatrix(complex double **A, complex double **B, int ro1, int co1, int ro2, int co2); +complex double** transp(complex double **a, int rows, int cols); +complex double** conjtransp(complex double **a, int rows, int cols); +complex double trace(complex double **a, int rows, int cols); +complex double** scalarmultMatrix(complex double scalar, complex double **a, int rows, int cols); +complex double** addMatrix(complex double **A, complex double **B, int rows, int cols); +int readPaulicoeffs(int* omega, int* alpha, int* beta, int* gamma, int* delta, int numqubits); + +// order of matrix elements is [row][column]!!! + +static complex double (*(I2[])) = { (double complex[]) {1.0+0.0*I, 0.0+0.0*I}, (double complex[]) {0.0+0.0*I, 1.0+0.0*I} }; +static complex double (*(X[])) = { (double complex[]) {0.0*I, 1.0+0.0*I}, (double complex[]) {1.0+0.0*I, 0.0*I} }; +static complex double (*(Y[])) = { (double complex[]) {0.0*I, 0.0-1.0*I}, (double complex[]) {0.0+1.0*I, 0.0*I} }; +static complex double (*(Z[])) = { (double complex[]) {1.0+0.0*I, 0.0+0.0*I}, (double complex[]) {0.0+0.0*I, -1.0+0.0*I} }; + +int main() +{ + + int i, j; + + int N; // number of qubits + scanf("%d", &N); + + int K; // 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) + scanf("%d", &K); + + complex double **IN; // N-qubit identity matrix + IN = I2; + for(i=1; i 0) { + psiN = psiT; + for(i=1; i N) { + printf("Error: Number of Paulis is greater than N!\n"); + return 1; + } + + + printf("%d\n", omega); + for(i=0; i0) + printf("%.10lf %c %.10lf I\n", cabs(creal(tr)), cimag(tr+0.00000001)>0?'+':'-' , cabs(cimag(tr))); + else + printf("%.10lf %c %.10lf I\n", creal(tr), cimag(tr+0.00000001)>0?'+':'-' , cabs(cimag(tr))); + //printf("%lf %c %lf I\n", creal(tr), cimag(tr)>0?'+':'-' , cabs(cimag(tr))); + //printf("%lf\n", cabs(creal(tr))); + /* cabs the creal part because it's always positive, but sometimes the 0.0 gets a minus sign which is annoying to see when comparing outputs */ + + deallocate_mem(&psiNfinal, pow(2,N)); + + + // deallocate_mem(&psiN, pow(2,N)); + + return 0; +} + + +complex double** addMatrix(complex double **A, complex double **B, int rows, int cols) +{ + int i, j; + + complex double** C; + + C = calloc(cols, sizeof(complex double*)); + for(i=0; i 1) { + printf("Error: Too many coefficients are non-zero at Pauli %d!\n", i); + exit(0); + } + } + return 1; + } else + return 0; + +} + + +