# include <stdio.h>
int m, mm1;
double mf, mf0;
double mf1, mf2;
double qc( int f , int t ){
int s[4], z;
z = s[3]=(( s[2]=(( s[1]=( s[0]=0 )+t )*f+t)&mm1 )*f+t)&mm1;
double dd[3]={0,0,0};
do {
double w=(( s[0]=s[1] )+0.5)*mf ;
double x=(( s[1]=s[2] )+0.5)*mf ;
double y=(( s[2]=s[3] )+0.5)*mf ;
double z=(( s[3]=(s[3]*f+t)&mm1 )+0.5)*mf ;
double t = 11*z - 18*y + 9*x - 2*w;
dd[0] += ( t<0 ? -t : t );
t = 2*z - 5*y + 4*x - w;
dd[1] += ( t<0 ? -t : t );
t = z - 3*y + 3*x - w;
dd[2] += ( t<0 ? -t : t );
} while( s[3]-z );
double p = dd[0]*mf0;
dd[0] = p > 1 ? 2-p : p ;
p = dd[1]*mf1 ;
dd[1] = p > 1 ? 2-p : p ;
p = dd[2]*mf2 ;
dd[2] = p > 1 ? 2-p : p ;
dd[0] = ( dd[0] < dd[1] ? dd[0] : dd[1] ) ;
return dd[0] < dd[2] ? dd[0] : dd[2] ;
}
int main(void) {
int b;
for( b=3 ; b<=8 ; b++ ){
int f, t, bc , bf[99], bt[99];
double q, bq=0;
mm1 = ( m=1<<b )-1;
mf = 1./m;
mf0 = mf/5.4534 ;
mf1 = mf/1.59917 ;
mf2 = mf/1.05185 ;
for( f=1 ; f<m ; f+=4 ){
for( t=1 ; t<m ; t+=2 ){
q = (1.0/(1LL<<40))*(long long)(qc(f,t)*(1LL<<40));
if( q >= bq ){
if( q > bq ){
bc = 0;
bq = q;
}
bf[bc] = f;
bt[bc++] = t;
}
}
}
printf("Bits=%i Quality=%.2f%%\n",b
,bq
*100); for( f=0 ; f<bc ; f++ )
printf("F=%i T=%i\n",bf
[f
],bt
[f
]); }
return 0;
}
IyBpbmNsdWRlIDxzdGRpby5oPgoKaW50IG0sIG1tMTsKZG91YmxlIG1mLCBtZjA7CmRvdWJsZSBtZjEsIG1mMjsKCmRvdWJsZSBxYyggaW50IGYgLCBpbnQgdCApewoJaW50IHNbNF0sIHo7Cgl6ID0gc1szXT0oKCBzWzJdPSgoIHNbMV09KCBzWzBdPTAgKSt0ICkqZit0KSZtbTEgKSpmK3QpJm1tMTsKCWRvdWJsZSBkZFszXT17MCwwLDB9OwoJZG8gewoJCWRvdWJsZSB3PSgoIHNbMF09c1sxXSApKzAuNSkqbWYgOwoJCWRvdWJsZSB4PSgoIHNbMV09c1syXSApKzAuNSkqbWYgOwoJCWRvdWJsZSB5PSgoIHNbMl09c1szXSApKzAuNSkqbWYgOwoJCWRvdWJsZSB6PSgoIHNbM109KHNbM10qZit0KSZtbTEgKSswLjUpKm1mIDsKCQlkb3VibGUgdCA9IDExKnogLSAxOCp5ICsgOSp4IC0gMip3OwoJCWRkWzBdICs9ICggdDwwID8gLXQgOiB0ICk7CgkJdCA9IDIqeiAtIDUqeSArIDQqeCAtIHc7CgkJZGRbMV0gKz0gKCB0PDAgPyAtdCA6IHQgKTsKCQl0ID0geiAtIDMqeSArIDMqeCAtIHc7CgkJZGRbMl0gKz0gKCB0PDAgPyAtdCA6IHQgKTsKCX0gd2hpbGUoIHNbM10teiApOwoJZG91YmxlIHAgPSBkZFswXSptZjA7CglkZFswXSA9IHAgPiAxID8gMi1wIDogcCA7CglwID0gZGRbMV0qbWYxIDsKCWRkWzFdID0gcCA+IDEgPyAyLXAgOiBwIDsKCXAgPSBkZFsyXSptZjIgOwoJZGRbMl0gPSBwID4gMSA/IDItcCA6IHAgOwoJZGRbMF0gPSAoIGRkWzBdIDwgZGRbMV0gPyBkZFswXSA6IGRkWzFdICkgOwoJcmV0dXJuIGRkWzBdIDwgZGRbMl0gPyBkZFswXSA6IGRkWzJdIDsKfQoKaW50IG1haW4odm9pZCkgewoJaW50IGI7Cglmb3IoIGI9MyA7IGI8PTggOyBiKysgKXsKCQlpbnQgZiwgdCwgYmMgLCBiZls5OV0sIGJ0Wzk5XTsKCQlkb3VibGUgcSwgYnE9MDsKCQltbTEgPSAoIG09MTw8YiApLTE7CgkJbWYgPSAxLi9tOwoJCW1mMCA9IG1mLzUuNDUzNCA7CgkJbWYxID0gbWYvMS41OTkxNyA7CgkJbWYyID0gbWYvMS4wNTE4NSA7CgkJZm9yKCBmPTEgOyBmPG0gOyBmKz00ICl7CgkJCWZvciggdD0xIDsgdDxtIDsgdCs9MiApewoJCQkJcSA9ICgxLjAvKDFMTDw8NDApKSoobG9uZyBsb25nKShxYyhmLHQpKigxTEw8PDQwKSk7CgkJCQlpZiggcSA+PSBicSApewoJCQkJCWlmKCBxID4gYnEgKXsKCQkJCQkJYmMgPSAwOwoJCQkJCQlicSA9IHE7CgkJCQkJfQoJCQkJCWJmW2JjXSA9IGY7CgkJCQkJYnRbYmMrK10gPSB0OwoJCQkJfQoJCQl9CgkJfQoJCXByaW50ZigiQml0cz0laSBRdWFsaXR5PSUuMmYlJVxuIixiLGJxKjEwMCk7CgkJZm9yKCBmPTAgOyBmPGJjIDsgZisrICkKCQkJcHJpbnRmKCJGPSVpIFQ9JWlcbiIsYmZbZl0sYnRbZl0pOwoJfQoJcmV0dXJuIDA7Cn0K