// This is for z=2. #include #include #include typedef struct{short int v; unsigned char sl;} Inv; static short f(short x){assert(0<=x && x<1024); return (1<<20)/(x+1024+1);} static Inv T[128]; static char In[8][128]; static short g(short n){assert(0<=n && n<1024); Inv x=T[n>>3]; int q = n&7; return (1<<9) + x.v - In[q][x.sl];} int main(){ for(int i = 0; i<128; ++i) {short int t[8]; for(int j=0; j<8; ++j) t[j] = f(8*i+j); {int c = 0; for(int j=1; j<8; ++j) c = 2*c + (t[j-1]>t[j]); T[i]=(Inv){t[0]-512, c}; if(0) {for(int j=0; j<8; ++j) printf("%5d", t[j]); printf(" %3d=c, %4d\n", c, i);} else {for(int j=1; j<8; ++j) printf("%d", t[j-1]-t[j]); printf(" 0x%02x\n", i);}}} for(int j = 1; j<128; ++j) assert(T[j].v+1>4)&15); printf("\n"); for(int j=0; j<128; ++j) printf("%x", j&15); printf("\n"); for(int k=0; k<8; ++k) {for(int j=0; j<128; ++j) printf("%d", In[k][j]); printf("In\n");} for(int j=0; j<1024; ++j) if(f(j) != g(j)) exit(printf("Bad %d %d %d\n", j, f(j), g(j))); return 0;}