// gcc -O3 -o gen_c gen_c.c #include #include #include #include #include #include typedef int (*fc) (int*, int); fc fi, fo; int mot[1000000], code[100000], mot2[1000000]; int i, j, s, k, size, x, nb, mnb, pos, a_o, a_i, lim, l, n, d, p, bl, bn; void date(){ fflush(stdout); system("date \"+\%d/\%m/\%Y \%H/\%M/\%S\""); } int eq(int *g, int *d, int l){ for(; l--; ) if(g[l] != d[l]) return 0; return 1; } int ceq(int *g, int *d, int l){ for(; l--; ) if(g[l] == d[l]) return 0; return 1; } int ceil32(int a, int b){ return (a+b-1)/b; } int rep(int *m, int i, int n, int d, int plus, int lon){ int x, y; for(; (x = ceil32(lon*n+plus, d)) <= i+1; lon++){ for(y = i-lon; (y >= 0) && (m[y] == m[y+lon]); y--); if(i-y >= x) return 0; } return 1; }//*/ int forb(int *m, int i, char *ch){ int a, x, l = i+1; x = strlen(ch); if(l < x) return 0; for(a = 0; a < x && m[l-x+a] == ch[a]-'0'; a++); return a == x; } int tm3(int *m, int i){ if(i > 1 && m[i-1] == 1 && m[i] == m[i-2]) return 0; if(i > 2 && m[i]*m[i-3] == 1) return 0; return rep(m, i, 2, 1, 0, 1); }//*/ int sqf(int *m, int i){ return rep(m, i, 2, 1, 0, 1); }//*/ int rt3(int *m, int i){ return rep(m, i, 7, 4, 1, 1); }//*/ int pp(int *m, int i){ int c = 0, s, l = i+1, k, j; if(!rep(m, i, n, d, p, 1)) return 0; for(j = i-bl; j >= 0; j--) if(ceq(m+j, m+i+1-bl, bl)) return 0; for(j = 0; j < l; j++) if(!m[j]) for(k = 1; j+k <= l && k < bl; k++){ for(s = 0; s < j && !eq(m+s, m+j, k); s++); if(s < j) continue; for(s = 0; s+k <= l && !ceq(m+s, m+j, k); s++); if(s+k <= l && ++c > bn/2) return 0; } return 1; }//*/ int ok(){ if(mnb < nb) {printf("nb=%d ", mnb = nb); date("");} for(*code = x = 0; ;) if(!fi(code, x)){ ici: while(code[x] == nb-1) if(!x--) return 1; code[x]++; }else{ s = nb-1-code[x];//optimized version //s = code[x];//old version for(k = 0; k < size; k++){ mot2[pos = k+x*size] = mot[k+s*size]; if(x && !fo(mot2, pos)) return 0; } if(x == lim-1) goto ici; else code[++x] = 0; } } int other(){ if(i >= size) for(k = i-i%size; k <= i; k++) if(mot[k] < mot[k-size]) break; else if(mot[k] > mot[k-size]){ i -= i%size+1; return 0; } for(k = 0; k <= i%size; k++) mot2[size+k] = mot[i-i%size+k]; for(k = 0; k < i/size-1; k++){ for(j = 0; j < size; j++) mot2[j] = mot[k*size+j]; if(!fo(mot2, size+i%size)) return 0; } return 1; } int A(){ for(i = 0; i < size; i++) mot[i] = 0; mnb = nb = 0; printf("size=%d a_i=%d a_o=%d (%d/%d%s)-free length_bound=%d number_bound=%d lim=%d ", size, a_i, a_o, n, d, p ? "+" : "", bl, bn, lim); date(""); for(*mot = i = 0; ;) if(!fo(mot, i) || !other()){ here: while(mot[i] == a_o-1) if(!i--) return 1; //if(nb && i < 3) return 1;//optimisation au cas par cas mot[i]++; }else if((!((i+1)%size)) && ((nb = (i+1)/size) > 1)) if(!ok()) goto here; else if(nb == a_i) break; else goto there; else there: mot[++i] = 0; for(x = 0; x < a_i; x++, printf("\n")) for(k = 0; k < size; k++) printf("%d", mot[k+x*size]); printf("OK size=%d lim=%d ", size, lim); date(""); return 0; } void usage(){ printf("Usage: gen_c n d p bl bn size lim\n"); printf("(n/d)-free if p==0; (n/d^+)-free if p==1\n"); printf("bl: length with no complementary factors\n"); printf("bn: maximum number of complementary non-empty factors (thus an even number)\n"); printf("size: length q such that the morphism is q-uniform\n"); printf("lim: checks the morphic image of every ternary square-free of length lim\n"); exit(0); } int main(int ac, char **av){ if(ac != 8) usage(); n = atoi(av[1]); d = atoi(av[2]); p = atoi(av[3]); bl = atoi(av[4]); bn = atoi(av[5]); size = atoi(av[6]); lim = atoi(av[7]); a_i = 3; fi = sqf; a_o = 2; fo = pp; for(; A() && size < 2000; size++); }