fixed two typos
[strong_simulation_gauss_sum_rank.git] / gausssums_multipleof2.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+=2) {
32       summand = 0.0*I;
33       summand += 0.25*((cpow(I,delta[i+1]-gamma[i])*Gausssum1d(0,beta[i]+beta[i+1]+gamma[i]+delta[i+1])
34                     +cpow(-1.0,beta[i]+delta[i])*cpow(I,delta[i]+delta[i+1])*Gausssum1d(0,beta[i]+beta[i+1]+delta[i]+delta[i+1]))
35                    *Kroneck(gamma[i]+delta[i]+gamma[i+1]+delta[i+1])
36                    +(csqrt(-I)*cpow(I,delta[i]+delta[i+1])*Gausssum1d(1,beta[i]+beta[i+1]+delta[i]+delta[i+1])
37                      +csqrt(I)*cpow(-1.0,beta[i+1]+gamma[i+1])*cpow(I,delta[i]-gamma[i+1])*(-I)*Gausssum1d(1,beta[i]+beta[i+1]+delta[i]+gamma[i+1]))
38                    *Kroneck(gamma[i]+delta[i]+gamma[i+1]+delta[i+1]+1));
39       sum *= summand;
40     }
41     //printf("%lf+%lfI\n", creal(sum), cimag(sum));
42     printf("%lf\n", cabs(creal(sum))); 
43
44
45   }
46
47   return 0;
48 }
49
50 complex double Kroneck(int arg)
51 {
52   arg = (arg+1)%2; // output 1 if argument is 0 mod 2 and 0 otherwise
53   return ((complex double)arg);
54 }
55
56 complex double Gausssum1d(int quadraticcoeff, int linearcoeff)
57 {
58   // we assume coeffs are either 0 or 1
59   quadraticcoeff %= 2;
60   linearcoeff %= 2;
61     
62   if(quadraticcoeff == 0)
63     if(linearcoeff == 0)
64       return 2.0+0.0*I;
65     else
66       return 0.0*I;
67   else
68     if(linearcoeff == 0)
69       return 1.0+1.0*I;
70     else
71       return 1.0-1.0*I;
72
73 }
74
75 int readPaulicoeffs(int *alpha, int *beta, int *gamma, int *delta, int numqubits)
76 {
77
78   int i;
79
80   if(scanf("%d %d %d %d", &alpha[0], &beta[0], &gamma[0], &delta[0]) != EOF) {
81     for(i=1; i<numqubits; i++) {
82       scanf("%d %d %d %d", &alpha[i], &beta[i], &gamma[i], &delta[i]);
83     }
84     return 1;
85   } else
86     return 0;
87
88 }
89
90
91