// Probing Golay Binary Codes #include #include // Wikipedia: http://en.wikipedia.org/wiki/Binary_Golay_code // Roberts: http://mathcs.pugetsound.edu/~bryans/Current/Journal_Spring_2006/ARoberts_LeechLattice.pdf // Brouwer: http://www.win.tue.nl/~aeb/preprints/udim24a.pdf int W[12] = { // From Wikipedia: 0x8009F1, 0x4004FA, 0x20027D, 0x10093E, 0x080C9D, 0x040E4E, 0x020F25, 0x010F92, 0x0087C9, 0x0043E6, 0x002557, 0x001AAB}; int r[12] = { // Roberts Page 13 0x800FFD, 0x4000FE, 0x20071E, 0x100B66, 0x080DAA, 0x040ED2, 0x0203CB, 0x010573, 0x0086A7, 0x004997, 0x002A3B, 0x001C4F}; int R[12] = { // Roberts Page 14 0xFF0000, 0xF0F000, 0xCCCC00, 0xAAAA00, 0x999900, 0xA9C0C0, 0x9ACAA0, 0xCA9090, 0x788888, 0x00CCCC, 0x00AAAA, 0x005555}; int B[12] = { // Brouwer Sec 5.5 0x0000FF, 0x000F0F, 0x003333, 0x005555, 0x009669, 0x030356, 0x050563, 0x09063A, 0x111178, 0x21121D, 0x41144E, 0x811724}; static int weight(int x) {int c=0; while(x){++c; x &= x-1;} return c;} int t[4096]; void tst(char * m, int * G){int c8=0; for(int k=0; k<12; ++k) if(weight(G[k])&1) exit(printf("par%s %d\n", m, k)); for(int j=0; j<4096; ++j) {int q=0; for(int k=0; k<12; ++k) if((j>>k)&1) q ^= G[k]; t[j] = q; if(weight(q)==8) ++c8;} for(int i=0; i<4096; ++i) for(int j=i+1; j<4096; ++j) if((0xefeeeff>>weight(t[i]^t[j]))&1) printf("%s Q%5d %5d %06X\n", m, i, j, t[i]^t[j]); printf("c8=%d for %s\n", c8, m);} int main(){ tst("rob1", r); if(0) tst("rob2", R); tst("WP", W); tst("B", B); return 0;} /* c8=759 for rob1 c8=759 for WP c8=759 for B R[6]: 1 0 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 R[3]: 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 t[72]: 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 (d=6) */