#include #include #define GODFREY 0 #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 #define NPOS (2*n) mpz_t bigsum; mpz_t tmp; long long int prod[n]; unsigned int k, j; unsigned long long int sum, swp; 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); } inline void calc(unsigned long long int gray) { for (k=1; k <= n; k++) { sum = 0; swp = 1LL; for(j=1; j <= (NPOS-k); j++, swp<<=1) // n^2 calc of sum #if GODFREY sum += CHECK_BIT_G(gray,swp)*CHECK_BIT_G(gray,swp<>num_proc; unsigned long long int start= proc_id*length; unsigned long long int stop= start + length; gray = start^(start>>1LL); for (k=0; k < n; k++) prod[k] = 0LL; calc(gray); if(proc_id!=0) start++; for(x=start; x < stop; ++x) { min = x & (-x); // bit changed in graycode if (min>=hook) min<<=1; // fool the grey code to step over the hook gray ^= min; // graycode if(min&gray) // +1 { 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); } } else // 0 { 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); } } updatesum(x&1); } #if GODFREY gmp_printf("bigSum %Zd\n", bigsum); mpz_fdiv_q_2exp(bigsum, bigsum, NPOS); #endif if(hook>1) printf("hooked "); gmp_printf("skolem sequences of order %d: %Zd\n",n, bigsum); }