#include typedef unsigned long lword; #define BIT(B) (1 << B) #define GETBIT(V,B) (V & BIT(B)) void print(int size, lword v) { int i; for (i = size-1; i >= 0; i--) printf("%c", GETBIT(v, i) ? '1' : '0'); } void printstar(int size, lword v) { int i; for (i = size-1; i >= 0; i--) printf("%c", GETBIT(v, i) ? '*' : ' '); } #define ROTATE(S,V) ((V >> 1) | (GETBIT(V,0) ? BIT(S-1) : 0)) lword nextstep(int size, lword v) { int i; lword newv = 0; v = (v << 1); v |= (GETBIT(v, size) ? BIT(0) : 0); v |= (GETBIT(v, 1) ? BIT(size+1) : 0); for (i = 0; i < size; i++) { int triplet = (v >> i) & 7; if (GETBIT(30, triplet)) newv |= BIT(i); } return newv; } lword freq(int size, lword v) { lword v1 = v; lword f; for(f=1; ; f++) { v1 = nextstep(size, v1); if (v1 == v) break; } return f; } void printsol(int size, lword v) { lword v1 = v; for(;;) { printstar(size, v1); printf("\n"); v1 = nextstep(size, v1); if (v1 == v) break; } } lword normalize(int size, lword v) { lword v1 = v; lword vn = v1; int i; for (i = 0; i < size; i++) { v1 = ROTATE(size, v1); if (v1 < vn) vn = v1; } return vn; } main() { int size; for (size = 1; size <= 30; size++) { lword v; for (v = 0; v < (1 << size); v++) { #define MAXSEQ 1000000 lword seq[MAXSEQ]; lword vmin = v; lword vmax = v; lword v1 = v; lword f; int k; lword v2 = v; int reducable = 0; for (k = 1; k < size; k++) { v2 = ROTATE(size, v2); if (v2 <= v) { reducable = 1; break; } } if (!reducable) { seq[0] = v; for(f = 1; ; f++) { int k,rep = 0; v1 = normalize(size, nextstep(size, v1)); if (v1 < vmin) break; if (v1 == vmin) { int a; lword rf = freq(size, v); printf(""); print(size, v); printf("*%d%d", size, rf); if (f < rf) printf(" = %d x %d", f, rf/f); printf("\n"); if (rf <= 30) printsol(size, v); break; } if (v1 == vmax) break; if (v1 > vmax) vmax = v1; for (k = 1; k < f; k++) if (seq[k] == v1) rep = 1; if (rep) break; if (f >= MAXSEQ-1) { printf("!! sequence longer than %ld\n", MAXSEQ); break; } seq[f] = v1; } } } } }