#include #include #define GODFREY 0 #if GODFREY #define CHECK_BIT(var,pos) (((var) & (pos)) ? 2LL : -2LL) #else #define CHECK_BIT(var,pos) (((var) & (pos)) ? 1LL : 0LL) #endif #define n 4 #define NPOS (2*n) mpz_t bigsum; mpz_t tmp; long long int prod[n]; unsigned int k; inline void updatesum(unsigned int odd) { mpz_set_si(tmp,1); for(k=0; k < n; k++) { if(prod[k] == 0LL) { return; } mpz_mul_si(tmp,tmp,prod[k]); } if(odd) mpz_sub(bigsum,bigsum,tmp); else mpz_add(bigsum,bigsum,tmp); } int main(int argc, char *argv[]) { unsigned int delta[n] = {2,3,5,6}; unsigned long long int i,swp,min; unsigned long long int gray = 0; unsigned long long int bigN = (1LL<<(NPOS)); mpz_init(bigsum); mpz_init(tmp); for (k=0; k < n; k++) prod[k] = 0LL; for(i=0LL; i < bigN; i++) { min = i & (-i); // bit changed in graycode gray ^= min; // graycode if(min&gray) // +1 { swp=min>>delta[0]; for (k=0; k < n && swp; k++, swp=min>>delta[k]) { prod[k] += CHECK_BIT(gray,swp); } swp=min<>delta[0]; for (k=0; k < n && swp; k++, swp=min>>delta[k]) { prod[k] -= CHECK_BIT(gray,swp); } swp=min<