C code for Moser
From Polymath Wiki
Jump to navigationJump to search
#include <stdio.h> #include <stdlib.h> #include <string.h>
#define NUM_LINES_3D 49
/* stat[i] is 0,1,2,3 depending on whether i (represented base 3) is of type a,b,c,d. */
const int stat[27] = {0,1,0, 1,2,1, 0,1,0, 1,2,1, 2,3,2, 1,2,1, 0,1,0, 1,2,1, 0,1,0};
int main() { /* There are NUM_LINES_3D lines in [3]^3. Let's create their bitmasks... */
long line_bitmasks[NUM_LINES_3D];
int i,j,k,count=0; long i_bit, j_bit, k_bit;
for (i=0, i_bit=1; i < 27; i++, i_bit *= 2) for (j=0, j_bit=1; j < 27; j++, j_bit *= 2) for (k=0, k_bit=1; k<27; k++, k_bit *= 2) if (((i%3)+(k%3)-2*(j%3)) == 0) if ((((i/3)%3)+((k/3)%3)-2*((j/3)%3))==0) if ((((i/9)%3)+((k/9)%3)-2*((j/9)%3))==0) if (i < k) { line_bitmasks[count] = i_bit + j_bit + k_bit; count++; }
/* There are 2^27 sets in [3]^3. */ long NUM_SETS_3D = 1; for (i=0; i<27; i++) NUM_SETS_3D *= 2;
/* Now searching for line-free sets in [3]^3 by brute force. */ long set, num_linefree = 0, tmpset; long numstat[9][13][7][2]; /* numstat[a][b][c][d] is the number of Moser sets with statistics (a,b,c,d) */ int a,b,c,d,s[4];
/* Initialise numstat */ for (a=0; a<9; a++) for (b=0; b<13; b++) for (c=0; c<7; c++) for (d=0; d<2; d++) numstat[a][b][c][d]=0;
for (set=0; set<NUM_SETS_3D; set++) /* Loop through all sets */ { // it was marginally faster to put in these 49 lines in by hand rather than create a loop. if ((set & line_bitmasks[0]) == line_bitmasks[0]) continue; if ((set & line_bitmasks[1]) == line_bitmasks[1]) continue; if ((set & line_bitmasks[2]) == line_bitmasks[2]) continue; if ((set & line_bitmasks[3]) == line_bitmasks[3]) continue; if ((set & line_bitmasks[4]) == line_bitmasks[4]) continue; if ((set & line_bitmasks[5]) == line_bitmasks[5]) continue; if ((set & line_bitmasks[6]) == line_bitmasks[6]) continue; if ((set & line_bitmasks[7]) == line_bitmasks[7]) continue; if ((set & line_bitmasks[8]) == line_bitmasks[8]) continue; if ((set & line_bitmasks[9]) == line_bitmasks[9]) continue; if ((set & line_bitmasks[10]) == line_bitmasks[10]) continue; if ((set & line_bitmasks[11]) == line_bitmasks[11]) continue; if ((set & line_bitmasks[12]) == line_bitmasks[12]) continue; if ((set & line_bitmasks[13]) == line_bitmasks[13]) continue; if ((set & line_bitmasks[14]) == line_bitmasks[14]) continue; if ((set & line_bitmasks[15]) == line_bitmasks[15]) continue; if ((set & line_bitmasks[16]) == line_bitmasks[16]) continue; if ((set & line_bitmasks[17]) == line_bitmasks[17]) continue; if ((set & line_bitmasks[18]) == line_bitmasks[18]) continue; if ((set & line_bitmasks[19]) == line_bitmasks[19]) continue; if ((set & line_bitmasks[20]) == line_bitmasks[20]) continue; if ((set & line_bitmasks[21]) == line_bitmasks[21]) continue; if ((set & line_bitmasks[22]) == line_bitmasks[22]) continue; if ((set & line_bitmasks[23]) == line_bitmasks[23]) continue; if ((set & line_bitmasks[24]) == line_bitmasks[24]) continue; if ((set & line_bitmasks[25]) == line_bitmasks[25]) continue; if ((set & line_bitmasks[26]) == line_bitmasks[26]) continue; if ((set & line_bitmasks[27]) == line_bitmasks[27]) continue; if ((set & line_bitmasks[28]) == line_bitmasks[28]) continue; if ((set & line_bitmasks[29]) == line_bitmasks[29]) continue; if ((set & line_bitmasks[30]) == line_bitmasks[30]) continue; if ((set & line_bitmasks[31]) == line_bitmasks[31]) continue; if ((set & line_bitmasks[32]) == line_bitmasks[32]) continue; if ((set & line_bitmasks[33]) == line_bitmasks[33]) continue; if ((set & line_bitmasks[34]) == line_bitmasks[34]) continue; if ((set & line_bitmasks[35]) == line_bitmasks[35]) continue; if ((set & line_bitmasks[36]) == line_bitmasks[36]) continue; if ((set & line_bitmasks[37]) == line_bitmasks[37]) continue; if ((set & line_bitmasks[38]) == line_bitmasks[38]) continue; if ((set & line_bitmasks[39]) == line_bitmasks[39]) continue; if ((set & line_bitmasks[40]) == line_bitmasks[40]) continue; if ((set & line_bitmasks[41]) == line_bitmasks[41]) continue; if ((set & line_bitmasks[42]) == line_bitmasks[42]) continue; if ((set & line_bitmasks[43]) == line_bitmasks[43]) continue; if ((set & line_bitmasks[44]) == line_bitmasks[44]) continue; if ((set & line_bitmasks[45]) == line_bitmasks[45]) continue; if ((set & line_bitmasks[46]) == line_bitmasks[46]) continue; if ((set & line_bitmasks[47]) == line_bitmasks[47]) continue; if ((set & line_bitmasks[48]) == line_bitmasks[48]) continue;
/* We have a line-free set! */
/* now compute the a,b,c,d stats */ s[0]=s[1]=s[2]=s[3]=0; tmpset = set; for (j=0; j < 27; j++) { if (tmpset & 1l) s[stat[j]]++; tmpset /= 2; } numstat[s[0]][s[1]][s[2]][s[3]]++; num_linefree++; }
count=0; for (a=0; a<9; a++) for (b=0; b<13; b++) for (c=0; c<7; c++) for (d=0; d<2; d++) if (numstat[a][b][c][d] > 0) { count++; printf("%ld sets with stats (%d,%d,%d,%d)\n",numstat[a][b][c][d],a,b,c,d); }
printf("%ld line-free sets total, with %d different stats?\n",num_linefree,count); }