#include"lib.h" int mot[MAX], m2[MAX], m5[MAX], P[100][100]; int i, a_i, a_o, j, k, size, mmx = 0; int64_t cc; FILE *out ; char prog[100]; void aff(int max){ printf("%d cc=%lld %s", max, cc, prog); date(""); }//*/ /*void aff(int max){ out = fopen(prog, "wt"); fprintf(out, "%d cc=%lld\n", max, cc); printf("%d cc=%lld %s", max, cc, prog); date(""); for(k = 0; k < max; k++) fprintf(out, "%d%s", mot[k], k % 100 == 99 ? "\n" : ""); fclose(out); }//*/ void permut(int *l, int *r, int *p){ for(k = 0; k < a_o; k++) r[k] = l[p[k]]; //printf("k=%d\n", k); }//*/ int check(int *m, int i){ permut(m5+(a_o+1)*i+1, m5+(a_o+1)*(i+1)+1, P[m[i]]); m5[(a_o+1)*(i+2)-1] = m5[(a_o+1)*(i+1)+1]; m5[(a_o+1)*(i+2)] = 0; for(k = (a_o+1)*(i+1)+1; k <= (a_o+1)*(i+2); k++) if(!rep(m5, k, a_o, a_o-1, 1, 1) /*|| !rep(m5, k, a_o, a_o-1, 0, a_o)*/) return 0; return 1; } int ok0(int *m, int i){ if(m[i-size+1] != i/size) return 0; if(m[i] != i/size) return 0; for(j = 1; j < a_o-1; j++) if(m5[(a_o+1)*(size-1)+j] != m5[j]) return 0; /*for(j = 0; j < size; j++){ m[size+j] = m[j]; if(!check(m, size+j)) return 0; }//*/ return 1; }//*/ int ok1(int *m, int i){ for(j = 0; j < 1000000; j++){ m2[j] = m[m2[j/size]*size+j%size]; if(j > mmx) if(!((mmx = j)%1000)){ printf("mmx=%d", mmx); date(""); for(k = 0; k < a_i*size; ){ printf("%d", mot[k]); if(!((++k)%size)) printf("\n"); } } if(!check(m2, j)) return 0; } return 1; }//*/ int A(){ printf("%s", prog); date(""); for(*mot = i = 0; ;) if(!check(mot, i)){ while(mot[i] == a_i-1) if(--i < 0) return 0; mot[i]++; }else{ if((mmx < i) && (!((mmx = i)%10000))) aff(mmx); mot[++i] = 0; if(!((++cc)%1000)) aff(mmx); //if(!((++cc)%10000000)) aff(mmx); } return 1; }//*/ int B(){ printf("size=%d", size); date(""); for(*mot = i = 0; ;) if(!check(mot, i)){ here: while(mot[i] == a_i-1) if(--i < 1) return 1; mot[i]++; }else if((i+1)%size) mot[++i] = 0; else if(!ok0(mot, i)) goto here; else if(i == a_i*size-1) if(!ok1(mot, i)) goto here; else break; else mot[++i] = 1; for(k = 0; k < a_i*size; ){ printf("%d", mot[k]); if(!((++k)%size)) printf("\n"); } printf("OK size=%d", size); date(""); return 0; }//*/ void usage(){ printf("Usage: dg- size a_o P[0] P[1]..\n"); printf("Result in the paper: dg- 63 5 2431 3214\n"); exit(0); } int main(int ac, char **av){ if(ac < 5) usage(); a_i = ac-3; size = atoi(av[1]); a_o = atoi(av[2]); for(i = 0; i < a_i; i++) for(j = 0; j < a_o; j++) P[i][j] = av[i+3][j]-'1'; sprintf(prog, "%s_%d_%d.txt", basename(*av), a_i, a_o); printf("P[0]=%s P[1]=%s %s\n", av[3], av[4], prog); for(i = 0; i < a_o; i++) m5[i] = i; m5[a_o] = 1; m5[a_o+1] = *m2 = 0; //if(A()) printf("OK"); else printf("FAILED mmx=%d cc=%lld", mmx, cc); date(""); for(; B() && size < 70; size++) printf("mmx=%d\n", mmx); }