changed the test bash script to loop over more cases by default
[strong_simulation_gauss_sum_rank.git] / gausssums_multipleof1.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <complex.h>
4 #include <math.h>
5
6 int readPaulicoeffs(int* alpha, int* beta, int* gamma, int* delta, int numqubits);
7 complex double Gausssum1d(int quadraticcoeff, int linearcoeff);
8 complex double Kroneck(int arg);
9   
10 // order of matrix elements is [row][column]!!!
11
12 int main()
13 {
14
15   int i;
16   
17   int N;              // number of qubits
18   scanf("%d", &N);
19
20   int alpha[N], beta[N], gamma[N], delta[N];
21
22   double complex summand, sum;
23
24   while(readPaulicoeffs(alpha, beta, gamma, delta, N)) {
25
26     //    for(i=0; i<N; i++)
27     //      printf("%d %d %d %d\n", alpha[i], beta[i], gamma[i], delta[i]);
28
29     sum = 1.0 + 0.0*I;
30
31     for(i=0; i<N; i++) {
32       summand = 0.0*I;
33       summand += 0.5*(Kroneck(gamma[i]+delta[i]) + pow(-1,beta[i])*Kroneck(gamma[i]+delta[i])
34                            +csqrt(I)*cpow(-I,delta[i])*Kroneck(alpha[i]+beta[i]) + csqrt(-I)*cpow(I,delta[i])*Kroneck(alpha[i]+beta[i]));
35       sum *= summand;
36     }
37     //printf("%lf+%lfI\n", creal(sum), cimag(sum));
38     printf("%lf\n", cabs(creal(sum))); 
39
40
41   }
42
43   return 0;
44 }
45
46 complex double Kroneck(int arg)
47 {
48   arg = (arg+1)%2; // output 1 if argument is 0 mod 2 and 0 otherwise
49   return ((complex double)arg);
50 }
51
52 complex double Gausssum1d(int quadraticcoeff, int linearcoeff)
53 {
54   // we assume coeffs are either 0 or 1
55   quadraticcoeff %= 2;
56   linearcoeff %= 2;
57     
58   if(quadraticcoeff == 0)
59     if(linearcoeff == 0)
60       return 2.0+0.0*I;
61     else
62       return 0.0*I;
63   else
64     if(linearcoeff == 0)
65       return 1.0+1.0*I;
66     else
67       return 1.0-1.0*I;
68
69 }
70
71 int readPaulicoeffs(int *alpha, int *beta, int *gamma, int *delta, int numqubits)
72 {
73
74   int i;
75
76   if(scanf("%d %d %d %d", &alpha[0], &beta[0], &gamma[0], &delta[0]) != EOF) {
77     for(i=1; i<numqubits; i++) {
78       scanf("%d %d %d %d", &alpha[i], &beta[i], &gamma[i], &delta[i]);
79     }
80     return 1;
81   } else
82     return 0;
83
84 }
85
86
87