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