#include #include #define GODFREY 0 #define EXT 1 #if GODFREY #define CHECK_BIT(var,pos) (((var) & (pos)) ? 2LL : -2LL) #define CHECK_BIT_G(var,pos) (((var) & (pos)) ? 1LL : -1LL) #else #define CHECK_BIT(var,pos) (((var) & (pos)) ? 1LL : 0LL) #endif #define n 9 #if EXT #define NPOS (2*n+1) #else #define NPOS (2*n) #endif mpz_t bigsum; mpz_t tmp; unsigned int multiproc= 0; // are we running as one of several processes? unsigned int num_proc= 0; // log_2 of number of processes unsigned int proc_id= 0; // id of this proces. Range 0 .. 2^num_proc - 1 unsigned int j, k, p, odd, ones; unsigned long long int swp,min, inner, outer, sum, len, start, abortmul; unsigned long long int gray; unsigned long long int bigN = 1LL<num_proc) len = 1LL<<(2*(n-p-1)-num_proc+EXT); else { if (proc_id>0) continue; len = 1LL<<(2*(n-p-1)+EXT); } start = proc_id * len; // starting position used in multiproc if (proc_id!=0) { start--; len++; } gray ^= (start^(start>>1LL))<<(p+1); // initialise gray code calc(gray); for (inner=start+1; inner < len+start; inner++) { min = inner & (-inner); // bit changed in gray code min<<= p+1; // shift according to phase gray ^= min; if(min&gray) // 1 { ones++; swp=min>>1; for (k=0; k < n && swp; k++, swp>>=1) // updating bits to the left of min { prod[k] += CHECK_BIT(gray,swp); } swp=min<<1; for (k=0; k < n && swp < bigN; k++, swp<<=1) // updating bits to the right of min { prod[k] += CHECK_BIT(gray,swp); } } else // 0 { ones--; swp=min>>1; for (k=0; k < n && swp; k++, swp>>=1) { prod[k] -= CHECK_BIT(gray,swp); } swp=min<<1; for (k=0; k < n && swp < bigN; k++, swp<<=1) { prod[k] -= CHECK_BIT(gray,swp); } } odd = !odd; updatesum(odd,2); } } #if EXT if(p==n && proc_id==0) { gray |= 1LL<