diff --git a/optimal-gap-codes/optimal-gap-codes.csv b/optimal-gap-codes/optimal-gap-codes.csv index 394576e..fe27924 100644 --- a/optimal-gap-codes/optimal-gap-codes.csv +++ b/optimal-gap-codes/optimal-gap-codes.csv @@ -1,795 +1,795 @@ vbyte,precision,bit_size,hash_size,rice_coefficient,rate,mean_compressed_size,number_of_hashes,number_of_hashes_with_code,extra_hashes -false,4,4,8,0,0.6264,5.0109,8,12,4 -false,4,5,9,0,0.2870,4.5915,5,20,15 -false,4,5,10,4,0.5560,8.8952,5,10,5 -false,4,5,11,5,0.6292,10.0669,5,8,3 -false,4,5,12,6,0.7048,11.2776,5,7,2 -false,4,5,13,7,0.7838,12.5412,5,6,1 -false,4,5,14,8,0.8675,13.8802,5,6,1 -false,4,5,15,9,0.9581,15.3303,5,5,0 -false,4,5,16,10,1.0541,16.8656,5,5,0 -false,4,6,10,0,0.2723,4.3572,6,24,18 -false,4,6,11,5,0.6271,10.0336,6,9,3 -false,4,6,12,6,0.7011,11.2183,6,8,2 -false,4,6,13,7,0.7774,12.4386,6,8,2 -false,4,6,14,8,0.8569,13.7105,6,7,1 -false,4,6,15,9,0.9411,15.0572,6,6,0 -false,4,6,16,10,1.0271,16.4341,6,6,0 -false,5,4,9,1,0.3044,4.8711,8,32,24 -false,5,4,10,2,0.4388,7.0211,8,18,10 -false,5,4,11,3,0.5131,8.2094,8,16,8 -false,5,4,12,4,0.5892,9.4268,8,14,6 -false,5,4,13,5,0.6663,10.6606,8,12,4 -false,5,4,14,6,0.7443,11.9080,8,11,3 -false,5,4,15,8,0.8230,13.1672,8,9,1 -false,5,4,16,9,0.9002,14.4037,8,9,1 -false,5,5,10,0,0.2810,4.4955,10,40,30 -false,5,5,11,3,0.4936,7.8979,10,22,12 -false,5,5,12,4,0.5635,9.0165,10,17,7 -false,5,5,13,5,0.6347,10.1559,10,16,6 -false,5,5,14,6,0.7071,11.3134,10,14,4 -false,5,5,15,7,0.7803,12.4841,10,13,3 -false,5,5,16,8,0.8524,13.6376,10,12,2 -false,5,6,11,0,0.2653,4.2451,12,48,36 -false,5,6,12,5,0.5962,9.5395,12,21,9 -false,5,6,13,6,0.6656,10.6497,12,19,7 -false,5,6,14,7,0.7358,11.7730,12,17,5 -false,5,6,15,8,0.8068,12.9090,12,16,4 -false,5,6,16,9,0.8776,14.0409,12,13,1 -false,6,4,10,1,0.2988,4.7807,16,64,48 -false,6,4,11,2,0.4298,6.8773,16,42,26 -false,6,4,12,3,0.5009,8.0139,16,32,16 -false,6,4,13,4,0.5728,9.1653,16,28,12 -false,6,4,14,6,0.6446,10.3139,16,25,9 -false,6,4,15,7,0.7151,11.4415,16,23,7 -false,6,4,16,8,0.7861,12.5781,16,21,5 -false,6,5,11,0,0.2774,4.4385,20,80,60 -false,6,5,12,3,0.4832,7.7314,20,45,25 -false,6,5,13,4,0.5499,8.7987,20,40,20 -false,6,5,14,5,0.6173,9.8774,20,35,15 -false,6,5,15,6,0.6852,10.9632,20,32,12 -false,6,5,16,7,0.7535,12.0563,20,26,6 -false,6,6,12,0,0.2612,4.1795,24,96,72 -false,6,6,13,4,0.5434,8.6939,24,48,24 -false,6,6,14,5,0.6090,9.7440,24,42,18 -false,6,6,15,6,0.6750,10.8002,24,38,14 -false,6,6,16,7,0.7414,11.8626,24,34,10 -false,7,4,11,1,0.2953,4.7251,32,128,96 -false,7,4,12,2,0.4248,6.7963,32,85,53 -false,7,4,13,3,0.4941,7.9064,32,73,41 -false,7,4,14,5,0.5641,9.0262,32,56,24 -false,7,4,15,6,0.6314,10.1025,32,51,19 -false,7,4,16,7,0.6990,11.1845,32,46,14 -false,7,5,12,0,0.2752,4.4034,40,160,120 -false,7,5,13,3,0.4775,7.6394,40,91,51 -false,7,5,14,4,0.5426,8.6813,40,80,40 -false,7,5,15,5,0.6081,9.7296,40,71,31 -false,7,5,16,6,0.6739,10.7822,40,64,24 -false,7,6,13,0,0.2588,4.1409,48,192,144 -false,7,6,14,4,0.5371,8.5931,48,96,48 -false,7,6,15,5,0.6011,9.6182,48,85,37 -false,7,6,16,6,0.6654,10.6469,48,76,28 -false,8,4,12,1,0.2933,4.6926,64,256,192 -false,8,4,13,2,0.4218,6.7483,64,170,106 -false,8,4,14,3,0.4903,7.8453,64,146,82 -false,8,4,15,5,0.5583,8.9322,64,128,64 -false,8,4,16,6,0.6243,9.9884,64,113,49 -false,8,4,17,7,0.4603,11.0475,42,93,51 -false,8,4,18,8,0.5046,12.1100,42,85,43 -false,8,4,19,9,0.5490,13.1763,42,78,36 -false,8,4,20,10,0.5936,14.2464,42,73,31 -false,8,4,21,11,0.6384,15.3207,42,68,26 -false,8,4,22,12,0.6833,16.3982,42,64,22 -false,8,4,23,13,0.7283,17.4792,42,60,18 -false,8,4,24,14,0.7735,18.5636,42,56,14 -false,8,5,13,0,0.2740,4.3833,80,320,240 -false,8,5,14,3,0.4741,7.5859,80,182,102 -false,8,5,15,4,0.5384,8.6143,80,160,80 -false,8,5,16,5,0.6030,9.6478,80,142,62 -false,8,5,17,6,0.4452,10.6839,53,128,75 -false,8,5,18,7,0.4885,11.7232,53,116,63 -false,8,5,19,8,0.5319,12.7648,53,106,53 -false,8,5,20,9,0.5754,13.8092,53,98,45 -false,8,5,21,10,0.6190,14.8562,53,91,38 -false,8,5,22,11,0.6628,15.9061,53,85,32 -false,8,5,23,12,0.7066,16.9581,53,80,27 -false,8,5,24,13,0.7505,18.0131,53,71,18 -false,8,6,14,0,0.2575,4.1197,96,384,288 -false,8,6,15,4,0.5336,8.5369,96,192,96 -false,8,6,16,5,0.5968,9.5487,96,170,74 -false,8,6,17,6,0.4401,10.5631,64,153,89 -false,8,6,18,7,0.4825,11.5797,64,139,75 -false,8,6,19,8,0.5249,12.5975,64,128,64 -false,8,6,20,9,0.5674,13.6182,64,118,54 -false,8,6,21,10,0.6101,14.6414,64,109,45 -false,8,6,22,11,0.6528,15.6661,64,102,38 -false,8,6,23,12,0.6955,16.6928,64,96,32 -false,8,6,24,13,0.7384,17.7215,64,90,26 -false,9,4,13,1,0.2922,4.6748,128,512,384 -false,9,4,14,2,0.4201,6.7216,128,341,213 -false,9,4,15,3,0.4882,7.8110,128,292,164 -false,9,4,16,5,0.5551,8.8817,128,256,128 -false,9,4,17,6,0.4136,9.9259,85,227,142 -false,9,4,18,7,0.4572,10.9728,85,204,119 -false,9,4,19,8,0.5009,12.0224,85,170,85 -false,9,4,20,9,0.5448,13.0752,85,157,72 -false,9,4,21,10,0.5888,14.1304,85,146,61 -false,9,4,22,11,0.6329,15.1886,85,136,51 -false,9,4,23,12,0.6771,16.2495,85,128,43 -false,9,4,24,13,0.7214,17.3127,85,120,35 -false,9,5,14,0,0.2732,4.3711,160,640,480 -false,9,5,15,3,0.4724,7.5585,160,365,205 -false,9,5,16,4,0.5362,8.5791,160,320,160 -false,9,5,17,5,0.4002,9.6045,106,284,178 -false,9,5,18,6,0.4430,10.6318,106,256,150 -false,9,5,19,7,0.4859,11.6608,106,232,126 -false,9,5,20,8,0.5288,12.6913,106,213,107 -false,9,5,21,9,0.5718,13.7243,106,196,90 -false,9,5,22,10,0.6150,14.7595,106,182,76 -false,9,5,23,11,0.6582,15.7969,106,170,64 -false,9,5,24,12,0.7015,16.8355,106,160,54 -false,9,6,15,0,0.2567,4.1070,192,768,576 -false,9,6,16,4,0.5318,8.5081,192,384,192 -false,9,6,17,5,0.3964,9.5131,128,341,213 -false,9,6,18,6,0.4383,10.5195,128,307,179 -false,9,6,19,7,0.4803,11.5276,128,279,151 -false,9,6,20,8,0.5224,12.5373,128,256,128 -false,9,6,21,9,0.5645,13.5478,128,236,108 -false,9,6,22,10,0.6067,14.5599,128,219,91 -false,9,6,23,11,0.6489,15.5736,128,204,76 -false,9,6,24,12,0.6912,16.5890,128,192,64 -false,10,4,14,1,0.2915,4.6640,256,1024,768 -false,10,4,15,2,0.4192,6.7069,256,682,426 -false,10,4,16,3,0.4870,7.7923,256,585,329 -false,10,4,17,5,0.3689,8.8535,170,512,342 -false,10,4,18,6,0.4122,9.8921,170,455,285 -false,10,4,19,7,0.4555,10.9328,170,409,239 -false,10,4,20,8,0.4990,11.9758,170,372,202 -false,10,4,21,9,0.5426,13.0213,170,315,145 -false,10,4,22,10,0.5862,14.0693,170,292,122 -false,10,4,23,11,0.6300,15.1194,170,273,103 -false,10,4,24,12,0.6738,16.1718,170,256,86 -false,10,5,15,0,0.2728,4.3641,320,1280,960 -false,10,5,16,3,0.4714,7.5416,320,731,411 -false,10,5,17,4,0.3566,8.5593,213,640,427 -false,10,5,18,5,0.3992,9.5810,213,568,355 -false,10,5,19,6,0.4418,10.6038,213,512,299 -false,10,5,20,7,0.4845,11.6279,213,465,252 -false,10,5,21,8,0.5272,12.6536,213,426,213 -false,10,5,22,9,0.5700,13.6805,213,393,180 -false,10,5,23,10,0.6129,14.7090,213,365,152 -false,10,5,24,11,0.6558,15.7393,213,341,128 -false,10,6,16,0,0.2563,4.1006,384,1536,1152 -false,10,6,17,4,0.3537,8.4899,256,768,512 -false,10,6,18,5,0.3955,9.4915,256,682,426 -false,10,6,19,6,0.4373,10.4947,256,614,358 -false,10,6,20,7,0.4791,11.4993,256,558,302 -false,10,6,21,8,0.5210,12.5045,256,512,256 -false,10,6,22,9,0.5629,13.5106,256,472,216 -false,10,6,23,10,0.6049,14.5178,256,438,182 -false,10,6,24,11,0.6469,15.5264,256,409,153 -false,11,4,15,1,0.2911,4.6583,512,2048,1536 -false,11,4,16,2,0.4187,6.6985,512,1365,853 -false,11,4,17,3,0.3243,7.7824,341,1170,829 -false,11,4,18,5,0.3683,8.8390,341,1024,683 -false,11,4,19,6,0.4114,9.8748,341,910,569 -false,11,4,20,7,0.4547,10.9126,341,819,478 -false,11,4,21,8,0.4980,11.9522,341,744,403 -false,11,4,22,9,0.5414,12.9940,341,682,341 -false,11,4,23,10,0.5849,14.0383,341,585,244 -false,11,4,24,11,0.6285,15.0847,341,546,205 -false,11,5,16,0,0.2726,4.3609,640,2560,1920 -false,11,5,17,3,0.3139,7.5334,426,1462,1036 -false,11,5,18,4,0.3562,8.5488,426,1280,854 -false,11,5,19,5,0.3987,9.5678,426,1137,711 -false,11,5,20,6,0.4412,10.5888,426,1024,598 -false,11,5,21,7,0.4838,11.6107,426,930,504 -false,11,5,22,8,0.5264,12.6336,426,853,427 -false,11,5,23,9,0.5691,13.6577,426,787,361 -false,11,5,24,10,0.6118,14.6836,426,731,305 -false,11,6,17,0,0.1707,4.0969,512,3072,2560 -false,11,6,18,4,0.3534,8.4805,512,1536,1024 -false,11,6,19,5,0.3950,9.4803,512,1365,853 -false,11,6,20,6,0.4367,10.4817,512,1228,716 -false,11,6,21,7,0.4785,11.4837,512,1117,605 -false,11,6,22,8,0.5203,12.4871,512,1024,512 -false,11,6,23,9,0.5621,13.4908,512,945,433 -false,11,6,24,10,0.6040,14.4953,512,877,365 -false,12,4,16,1,0.2910,4.6554,1024,4096,3072 -false,12,4,17,2,0.2789,6.6940,682,2730,2048 -false,12,4,18,3,0.3240,7.7765,682,2340,1658 -false,12,4,19,5,0.3679,8.8303,682,2048,1366 -false,12,4,20,6,0.4110,9.8642,682,1820,1138 -false,12,4,21,7,0.4542,10.9000,682,1638,956 -false,12,4,22,8,0.4974,11.9381,682,1489,807 -false,12,4,23,9,0.5408,12.9783,682,1365,683 -false,12,4,24,10,0.5842,14.0206,682,1170,488 -false,12,5,17,0,0.1816,4.3582,853,5120,4267 -false,12,5,18,3,0.3137,7.5294,853,2925,2072 -false,12,5,19,4,0.3560,8.5441,853,2560,1707 -false,12,5,20,5,0.3984,9.5618,853,2275,1422 -false,12,5,21,6,0.4409,10.5811,853,2048,1195 -false,12,5,22,7,0.4834,11.6010,853,1861,1008 -false,12,5,23,8,0.5259,12.6224,853,1706,853 -false,12,5,24,9,0.5685,13.6450,853,1575,722 -false,12,6,18,0,0.1706,4.0946,1024,6144,5120 -false,12,6,19,4,0.3532,8.4769,1024,3072,2048 -false,12,6,20,5,0.3948,9.4757,1024,2730,1706 -false,12,6,21,6,0.4365,10.4758,1024,2457,1433 -false,12,6,22,7,0.4782,11.4763,1024,2234,1210 -false,12,6,23,8,0.5199,12.4776,1024,2048,1024 -false,12,6,24,9,0.5616,13.4796,1024,1890,866 -false,13,4,17,1,0.1939,4.6539,1365,8192,6827 -false,13,4,18,2,0.2788,6.6915,1365,5461,4096 -false,13,4,19,3,0.3239,7.7740,1365,4681,3316 -false,13,4,20,5,0.3678,8.8269,1365,4096,2731 -false,13,4,21,6,0.4108,9.8599,1365,3640,2275 -false,13,4,22,7,0.4540,10.8953,1365,3276,1911 -false,13,4,23,8,0.4972,11.9321,1365,2978,1613 -false,13,4,24,9,0.5404,12.9707,1365,2730,1365 -false,13,5,18,0,0.1816,4.3579,1706,10240,8534 -false,13,5,19,3,0.3136,7.5266,1706,5851,4145 -false,13,5,20,4,0.3558,8.5403,1706,5120,3414 -false,13,5,21,5,0.3982,9.5578,1706,4551,2845 -false,13,5,22,6,0.4407,10.5761,1706,4096,2390 -false,13,5,23,7,0.4832,11.5959,1706,3723,2017 -false,13,5,24,8,0.5257,12.6168,1706,3413,1707 -false,13,6,19,0,0.1706,4.0948,2048,12288,10240 -false,13,6,20,4,0.3531,8.4747,2048,6144,4096 -false,13,6,21,5,0.3947,9.4730,2048,5461,3413 -false,13,6,22,6,0.4364,10.4726,2048,4915,2867 -false,13,6,23,7,0.4780,11.4727,2048,4468,2420 -false,13,6,24,8,0.5197,12.4731,2048,4096,2048 -false,14,4,18,1,0.1939,4.6535,2730,16384,13654 -false,14,4,19,2,0.2787,6.6896,2730,10922,8192 -false,14,4,20,3,0.3238,7.7720,2730,9362,6632 -false,14,4,21,5,0.3677,8.8244,2730,8192,5462 -false,14,4,22,6,0.4107,9.8573,2730,7281,4551 -false,14,4,23,7,0.4538,10.8922,2730,6553,3823 -false,14,4,24,8,0.4970,11.9286,2730,5957,3227 -false,14,5,19,0,0.1816,4.3575,3413,20480,17067 -false,14,5,20,3,0.3135,7.5247,3413,11702,8289 -false,14,5,21,4,0.3558,8.5386,3413,10240,6827 -false,14,5,22,5,0.3982,9.5561,3413,9102,5689 -false,14,5,23,6,0.4406,10.5739,3413,8192,4779 -false,14,5,24,7,0.4831,11.5932,3413,7447,4034 -false,14,6,20,0,0.1706,4.0937,4096,24576,20480 -false,14,6,21,4,0.3530,8.4725,4096,12288,8192 -false,14,6,22,5,0.3946,9.4708,4096,10922,6826 -false,14,6,23,6,0.4363,10.4704,4096,9830,5734 -false,14,6,24,7,0.4779,11.4707,4096,8936,4840 -false,15,4,19,1,0.1938,4.6515,5461,32768,27307 -false,15,4,20,2,0.2787,6.6889,5461,21845,16384 -false,15,4,21,3,0.3238,7.7704,5461,18724,13263 -false,15,4,22,5,0.3676,8.8226,5461,16384,10923 -false,15,4,23,6,0.4106,9.8550,5461,14563,9102 -false,15,4,24,7,0.4537,10.8897,5461,13107,7646 -false,15,4,25,8,0.3727,11.9257,4096,11915,7819 -false,15,4,26,9,0.4051,12.9638,4096,10922,6826 -false,15,4,27,10,0.4376,14.0046,4096,9362,5266 -false,15,4,28,11,0.4702,15.0466,4096,8738,4642 -false,15,4,29,12,0.5028,16.0901,4096,8192,4096 -false,15,4,30,13,0.5355,17.1359,4096,7710,3614 -false,15,4,31,14,0.5682,18.1824,4096,7281,3185 -false,15,4,32,15,0.6009,19.2303,4096,6898,2802 -false,15,5,20,0,0.1815,4.3555,6826,40960,34134 -false,15,5,21,3,0.3135,7.5237,6826,23405,16579 -false,15,5,22,4,0.3557,8.5370,6826,20480,13654 -false,15,5,23,5,0.3981,9.5541,6826,18204,11378 -false,15,5,24,6,0.4405,10.5726,6826,16384,9558 -false,15,5,25,7,0.3622,11.5914,5120,14894,9774 -false,15,5,26,8,0.3941,12.6113,5120,13653,8533 -false,15,5,27,9,0.4260,13.6326,5120,12603,7483 -false,15,5,28,10,0.4580,14.6549,5120,11702,6582 -false,15,5,29,11,0.4900,15.6793,5120,10922,5802 -false,15,5,30,12,0.5220,16.7042,5120,10240,5120 -false,15,5,31,13,0.5541,17.7306,5120,9637,4517 -false,15,5,32,15,0.5860,18.7534,5120,9102,3982 -false,15,6,21,0,0.1705,4.0924,8192,49152,40960 -false,15,6,22,4,0.3530,8.4718,8192,24576,16384 -false,15,6,23,5,0.3946,9.4696,8192,21845,13653 -false,15,6,24,6,0.4362,10.4686,8192,19660,11468 -false,15,6,25,7,0.3584,11.4683,6144,17873,11729 -false,15,6,26,8,0.3896,12.4687,6144,16384,10240 -false,15,6,27,9,0.4209,13.4700,6144,15123,8979 -false,15,6,28,10,0.4522,14.4717,6144,14043,7899 -false,15,6,29,11,0.4836,15.4739,6144,13107,6963 -false,15,6,30,12,0.5149,16.4777,6144,12288,6144 -false,15,6,31,13,0.5463,17.4816,6144,11565,5421 -false,15,6,32,14,0.5777,18.4867,6144,10922,4778 -false,16,4,20,1,0.1938,4.6510,10922,65536,54614 -false,16,4,21,2,0.2787,6.6884,10922,43690,32768 -false,16,4,22,3,0.3237,7.7700,10922,37449,26527 -false,16,4,23,5,0.3676,8.8213,10922,32768,21846 -false,16,4,24,6,0.4106,9.8540,10922,29127,18205 -false,16,4,25,7,0.3403,10.8885,8192,26214,18022 -false,16,4,26,8,0.3726,11.9248,8192,23831,15639 -false,16,4,27,9,0.4051,12.9626,8192,21845,13653 -false,16,4,28,10,0.4376,14.0025,8192,18724,10532 -false,16,4,29,11,0.4701,15.0443,8192,17476,9284 -false,16,4,30,12,0.5027,16.0879,8192,16384,8192 -false,16,4,31,13,0.5354,17.1333,8192,15420,7228 -false,16,4,32,14,0.5681,18.1797,8192,14563,6371 -false,16,5,21,0,0.1815,4.3552,13653,81920,68267 -false,16,5,22,3,0.3135,7.5235,13653,46811,33158 -false,16,5,23,4,0.3557,8.5370,13653,40960,27307 -false,16,5,24,5,0.3981,9.5538,13653,36408,22755 -false,16,5,25,6,0.3303,10.5710,10240,32768,22528 -false,16,5,26,7,0.3622,11.5902,10240,29789,19549 -false,16,5,27,8,0.3941,12.6104,10240,27306,17066 -false,16,5,28,9,0.4260,13.6315,10240,25206,14966 -false,16,5,29,10,0.4579,14.6541,10240,23405,13165 -false,16,5,30,11,0.4899,15.6777,10240,21845,11605 -false,16,5,31,12,0.5220,16.7028,10240,20480,10240 -false,16,5,32,13,0.5540,17.7284,10240,19275,9035 -false,16,6,22,0,0.1705,4.0926,16384,98304,81920 -false,16,6,23,4,0.3529,8.4703,16384,49152,32768 -false,16,6,24,5,0.3945,9.4684,16384,43690,27306 -false,16,6,25,6,0.3271,10.4676,12288,39321,27033 -false,16,6,26,7,0.3583,11.4667,12288,35746,23458 -false,16,6,27,8,0.3896,12.4668,12288,32768,20480 -false,16,6,28,9,0.4209,13.4681,12288,30247,17959 -false,16,6,29,10,0.4522,14.4700,12288,28086,15798 -false,16,6,30,11,0.4835,15.4725,12288,26214,13926 -false,16,6,31,12,0.5149,16.4758,12288,24576,12288 -false,16,6,32,13,0.5463,17.4802,12288,23130,10842 -false,17,4,21,1,0.1938,4.6510,21845,131072,109227 -false,17,4,22,2,0.2786,6.6869,21845,87381,65536 -false,17,4,23,3,0.3237,7.7691,21845,74898,53053 -false,17,4,24,5,0.3675,8.8209,21845,65536,43691 -false,17,4,25,6,0.3079,9.8536,16384,58254,41870 -false,17,4,26,7,0.3402,10.8878,16384,52428,36044 -false,17,4,27,8,0.3726,11.9240,16384,47662,31278 -false,17,4,28,9,0.4050,12.9616,16384,43690,27306 -false,17,4,29,10,0.4376,14.0019,16384,37449,21065 -false,17,4,30,11,0.4701,15.0438,16384,34952,18568 -false,17,4,31,12,0.5027,16.0872,16384,32768,16384 -false,17,4,32,13,0.5354,17.1322,16384,30840,14456 -false,17,5,22,0,0.1815,4.3564,27306,163840,136534 -false,17,5,23,3,0.3134,7.5219,27306,93622,66316 -false,17,5,24,4,0.3556,8.5352,27306,81920,54614 -false,17,5,25,5,0.2985,9.5520,20480,72817,52337 -false,17,5,26,6,0.3303,10.5695,20480,65536,45056 -false,17,5,27,7,0.3621,11.5887,20480,59578,39098 -false,17,5,28,8,0.3940,12.6088,20480,54613,34133 -false,17,5,29,9,0.4259,13.6301,20480,50412,29932 -false,17,5,30,10,0.4579,14.6529,20480,46811,26331 -false,17,5,31,11,0.4899,15.6766,20480,43690,23210 -false,17,5,32,12,0.5219,16.7013,20480,40960,20480 -false,17,6,23,0,0.1706,4.0932,32768,196608,163840 -false,17,6,24,4,0.3529,8.4695,32768,98304,65536 -false,17,6,25,5,0.2958,9.4671,24576,87381,62805 -false,17,6,26,6,0.3271,10.4662,24576,78643,54067 -false,17,6,27,7,0.3583,11.4656,24576,71493,46917 -false,17,6,28,8,0.3896,12.4659,24576,65536,40960 -false,17,6,29,9,0.4208,13.4670,24576,60494,35918 -false,17,6,30,10,0.4522,14.4691,24576,56173,31597 -false,17,6,31,11,0.4835,15.4717,24576,52428,27852 -false,17,6,32,12,0.5148,16.4751,24576,49152,24576 -false,18,4,22,1,0.1939,4.6525,43690,262144,218454 -false,18,4,23,2,0.2787,6.6881,43690,174762,131072 -false,18,4,24,3,0.3237,7.7687,43690,149796,106106 -false,18,4,25,5,0.2757,8.8213,32768,131072,98304 -false,18,4,26,6,0.3079,9.8536,32768,116508,83740 -false,18,4,27,7,0.3402,10.8878,32768,104857,72089 -false,18,4,28,8,0.3726,11.9235,32768,95325,62557 -false,18,4,29,9,0.4050,12.9614,32768,87381,54613 -false,18,4,30,10,0.4375,14.0015,32768,74898,42130 -false,18,4,31,11,0.4701,15.0434,32768,69905,37137 -false,18,4,32,12,0.5027,16.0871,32768,65536,32768 -false,18,5,23,0,0.1815,4.3570,54613,327680,273067 -false,18,5,24,3,0.3135,7.5233,54613,187245,132632 -false,18,5,25,4,0.2667,8.5358,40960,163840,122880 -false,18,5,26,5,0.2985,9.5522,40960,145635,104675 -false,18,5,27,6,0.3303,10.5705,40960,131072,90112 -false,18,5,28,7,0.3622,11.5889,40960,119156,78196 -false,18,5,29,8,0.3940,12.6092,40960,109226,68266 -false,18,5,30,9,0.4259,13.6302,40960,100824,59864 -false,18,5,31,10,0.4579,14.6527,40960,93622,52662 -false,18,5,32,11,0.4899,15.6762,40960,87381,46421 -false,18,6,24,0,0.1705,4.0930,65536,393216,327680 -false,18,6,25,4,0.2647,8.4711,49152,196608,147456 -false,18,6,26,5,0.2959,9.4682,49152,174762,125610 -false,18,6,27,6,0.3271,10.4668,49152,157286,108134 -false,18,6,28,7,0.3583,11.4659,49152,142987,93835 -false,18,6,29,8,0.3896,12.4662,49152,131072,81920 -false,18,6,30,9,0.4208,13.4671,49152,120989,71837 -false,18,6,31,10,0.4521,14.4685,49152,112347,63195 -false,18,6,32,11,0.4835,15.4711,49152,104857,55705 -true,4,4,8,2,1.1776,9.4211,8,7,0 -true,4,5,9,1,0.5744,9.1908,5,8,3 -true,4,5,10,4,0.7190,11.5047,5,7,2 -true,4,5,11,5,0.8442,13.5065,5,6,1 -true,4,5,12,5,0.9317,14.9073,5,5,0 -true,4,5,13,6,1.0287,16.4596,5,5,0 -true,4,5,14,8,1.1438,18.3008,5,4,0 -true,4,5,15,9,1.1903,19.0453,5,4,0 -true,4,5,16,10,1.2506,20.0102,5,4,0 -true,4,6,10,1,0.5712,9.1395,6,10,4 -true,4,6,11,5,0.8268,13.2294,6,7,1 -true,4,6,12,5,0.9463,15.1402,6,6,0 -true,4,6,13,6,1.0474,16.7578,6,6,0 -true,4,6,14,9,1.1300,18.0797,6,5,0 -true,4,6,15,10,1.1703,18.7254,6,5,0 -true,4,6,16,11,1.2258,19.6128,6,5,0 -true,5,4,9,2,0.5649,9.0389,8,14,6 -true,5,4,10,3,0.6097,9.7545,8,14,6 -true,5,4,11,4,0.6710,10.7356,8,12,4 -true,5,4,12,4,0.7923,12.6770,8,10,2 -true,5,4,13,5,0.9064,14.5021,8,9,1 -true,5,4,14,6,1.0233,16.3725,8,8,0 -true,5,4,15,9,1.1184,17.8943,8,7,0 -true,5,4,16,10,1.1476,18.3621,8,7,0 -true,5,5,10,2,0.5573,8.9166,10,20,10 -true,5,5,11,4,0.6549,10.4776,10,16,6 -true,5,5,12,4,0.7519,12.0308,10,13,3 -true,5,5,13,5,0.8511,13.6173,10,12,2 -true,5,5,14,5,0.9702,15.5236,10,10,0 -true,5,5,15,6,1.0806,17.2900,10,9,0 -true,5,5,16,9,1.1174,17.8782,10,9,0 -true,5,6,11,1,0.5505,8.8078,12,24,12 -true,5,6,12,5,0.8119,12.9907,12,16,4 -true,5,6,13,5,0.8985,14.3755,12,13,1 -true,5,6,14,6,0.9861,15.7779,12,12,0 -true,5,6,15,9,1.0879,17.4065,12,11,0 -true,5,6,16,9,1.1103,17.7647,12,11,0 -true,6,4,10,2,0.5518,8.8281,16,32,16 -true,6,4,11,3,0.5936,9.4974,16,28,12 -true,6,4,12,4,0.6551,10.4811,16,25,9 -true,6,4,13,4,0.7790,12.4644,16,21,5 -true,6,4,14,5,0.8927,14.2834,16,18,2 -true,6,4,15,6,1.0041,16.0663,16,16,0 -true,6,4,16,9,1.0750,17.1998,16,15,0 -true,6,5,11,2,0.5445,8.7117,20,40,20 -true,6,5,12,4,0.6404,10.2459,20,32,12 -true,6,5,13,4,0.7356,11.7689,20,29,9 -true,6,5,14,5,0.8310,13.2964,20,24,4 -true,6,5,15,6,0.9465,15.1442,20,21,1 -true,6,5,16,8,1.0587,16.9387,20,20,0 -true,6,6,12,1,0.5394,8.6297,24,48,24 -true,6,6,13,4,0.7218,11.5486,24,34,10 -true,6,6,14,5,0.8100,12.9595,24,32,8 -true,6,6,15,5,0.9156,14.6489,24,27,3 -true,6,6,16,6,1.0245,16.3918,24,24,0 -true,7,4,11,2,0.5445,8.7116,32,64,32 -true,7,4,12,3,0.5854,9.3658,32,56,24 -true,7,4,13,4,0.6476,10.3616,32,51,19 -true,7,4,14,5,0.7698,12.3162,32,42,10 -true,7,4,15,5,0.8804,14.0864,32,36,4 -true,7,4,16,6,0.9871,15.7940,32,34,2 -true,7,5,12,2,0.5374,8.5985,40,80,40 -true,7,5,13,4,0.6332,10.1306,40,64,24 -true,7,5,14,4,0.7282,11.6506,40,58,18 -true,7,5,15,5,0.8211,13.1382,40,49,9 -true,7,5,16,6,0.9322,14.9145,40,45,5 -true,7,6,13,1,0.5332,8.5317,48,96,48 -true,7,6,14,4,0.7152,11.4427,48,69,21 -true,7,6,15,5,0.8014,12.8230,48,64,16 -true,7,6,16,5,0.9078,14.5251,48,54,6 -true,8,4,12,2,0.5404,8.6471,64,128,64 -true,8,4,13,3,0.5810,9.2953,64,113,49 -true,8,4,14,4,0.6435,10.2955,64,102,38 -true,8,4,15,5,0.7647,12.2345,64,85,21 -true,8,4,16,5,0.8739,13.9822,64,78,14 -true,8,4,17,6,0.6518,15.6428,42,68,26 -true,8,4,18,9,0.6867,16.4816,42,64,22 -true,8,4,19,10,0.6944,16.6649,42,64,22 -true,8,4,20,11,0.7116,17.0785,42,60,18 -true,8,4,21,12,0.7450,17.8789,42,60,18 -true,8,4,22,12,0.7952,19.0847,42,53,11 -true,8,4,23,13,0.8797,21.1124,42,48,6 -true,8,4,24,13,0.9655,23.1726,42,44,2 -true,8,5,13,2,0.5334,8.5350,80,160,80 -true,8,5,14,4,0.6291,10.0658,80,128,48 -true,8,5,15,4,0.7240,11.5833,80,116,36 -true,8,5,16,5,0.8158,13.0522,80,98,18 -true,8,5,17,6,0.6163,14.7904,53,91,38 -true,8,5,18,8,0.6825,16.3810,53,80,27 -true,8,5,19,9,0.6892,16.5419,53,80,27 -true,8,5,20,10,0.7015,16.8365,53,80,27 -true,8,5,21,11,0.7228,17.3475,53,75,22 -true,8,5,22,12,0.7610,18.2634,53,71,18 -true,8,5,23,12,0.8366,20.0781,53,64,11 -true,8,5,24,13,0.9014,21.6341,53,60,7 -true,8,6,14,1,0.5299,8.4782,96,192,96 -true,8,6,15,4,0.7115,11.3835,96,139,43 -true,8,6,16,5,0.7968,12.7487,96,128,32 -true,8,6,17,5,0.6025,14.4590,64,109,45 -true,8,6,18,6,0.6711,16.1075,64,96,32 -true,8,6,19,9,0.6874,16.4985,64,96,32 -true,8,6,20,10,0.6987,16.7680,64,96,32 -true,8,6,21,11,0.7179,17.2290,64,90,26 -true,8,6,22,12,0.7540,18.0957,64,85,21 -true,8,6,23,12,0.8181,19.6340,64,80,16 -true,8,6,24,13,0.8764,21.0340,64,73,9 -true,9,4,13,2,0.5382,8.6111,128,256,128 -true,9,4,14,3,0.5785,9.2566,128,227,99 -true,9,4,15,4,0.6409,10.2550,128,204,76 -true,9,4,16,5,0.7617,12.1876,128,170,42 -true,9,4,17,5,0.5802,13.9238,85,157,72 -true,9,4,18,6,0.6483,15.5598,85,136,51 -true,9,4,19,9,0.6813,16.3501,85,128,43 -true,9,4,20,10,0.6885,16.5243,85,128,43 -true,9,4,21,11,0.7055,16.9319,85,128,43 -true,9,4,22,12,0.7386,17.7271,85,120,35 -true,9,4,23,12,0.7893,18.9444,85,113,28 -true,9,4,24,13,0.8726,20.9423,85,102,17 -true,9,5,14,2,0.5313,8.5009,160,320,160 -true,9,5,15,4,0.6269,10.0308,160,256,96 -true,9,5,16,4,0.7217,11.5474,160,232,72 -true,9,5,17,5,0.5418,13.0030,106,196,90 -true,9,5,18,6,0.6134,14.7220,106,182,76 -true,9,5,19,8,0.6782,16.2769,106,160,54 -true,9,5,20,9,0.6846,16.4296,106,160,54 -true,9,5,21,10,0.6967,16.7199,106,160,54 -true,9,5,22,11,0.7179,17.2289,106,150,44 -true,9,5,23,12,0.7559,18.1418,106,142,36 -true,9,5,24,12,0.8312,19.9485,106,134,28 -true,9,6,15,1,0.5281,8.4490,192,384,192 -true,9,6,16,4,0.7094,11.3510,192,279,87 -true,9,6,17,5,0.5295,12.7078,128,256,128 -true,9,6,18,5,0.6008,14.4192,128,219,91 -true,9,6,19,6,0.6687,16.0490,128,192,64 -true,9,6,20,9,0.6835,16.4052,128,192,64 -true,9,6,21,10,0.6946,16.6700,128,192,64 -true,9,6,22,11,0.7137,17.1282,128,180,52 -true,9,6,23,12,0.7496,17.9910,128,180,52 -true,9,6,24,12,0.8134,19.5215,128,161,33 -true,10,4,14,2,0.5370,8.5914,256,512,256 -true,10,4,15,3,0.5771,9.2340,256,455,199 -true,10,4,16,4,0.6395,10.2327,256,409,153 -true,10,4,17,5,0.5066,12.1583,170,341,171 -true,10,4,18,5,0.5789,13.8929,170,315,145 -true,10,4,19,6,0.6466,15.5180,170,273,103 -true,10,4,20,9,0.6783,16.2802,170,256,86 -true,10,4,21,10,0.6855,16.4510,170,256,86 -true,10,4,22,11,0.7023,16.8562,170,256,86 -true,10,4,23,12,0.7354,17.6492,170,240,70 -true,10,4,24,12,0.7861,18.8672,170,227,57 -true,10,5,15,2,0.5301,8.4820,320,640,320 -true,10,5,16,4,0.6256,10.0098,320,512,192 -true,10,5,17,4,0.4803,11.5275,213,465,252 -true,10,5,18,5,0.5407,12.9767,213,426,213 -true,10,5,19,6,0.6119,14.6858,213,365,152 -true,10,5,20,8,0.6759,16.2211,213,320,107 -true,10,5,21,9,0.6822,16.3718,213,320,107 -true,10,5,22,10,0.6941,16.6588,213,320,107 -true,10,5,23,11,0.7153,17.1671,213,301,88 -true,10,5,24,12,0.7532,18.0778,213,284,71 -true,10,6,16,1,0.5271,8.4336,384,768,384 -true,10,6,17,4,0.4722,11.3320,256,558,302 -true,10,6,18,5,0.5285,12.6852,256,512,256 -true,10,6,19,5,0.5999,14.3985,256,438,182 -true,10,6,20,6,0.6675,16.0204,256,384,128 -true,10,6,21,9,0.6815,16.3562,256,384,128 -true,10,6,22,10,0.6925,16.6195,256,384,128 -true,10,6,23,11,0.7114,17.0746,256,361,105 -true,10,6,24,12,0.7473,17.9356,256,361,105 -true,11,4,15,2,0.5362,8.5796,512,1024,512 -true,11,4,16,3,0.5764,9.2227,512,910,398 -true,11,4,17,4,0.4259,10.2213,341,819,478 -true,11,4,18,5,0.5061,12.1464,341,682,341 -true,11,4,19,5,0.5782,13.8771,341,630,289 -true,11,4,20,6,0.6456,15.4956,341,546,205 -true,11,4,21,9,0.6768,16.2439,341,512,171 -true,11,4,22,10,0.6839,16.4135,341,512,171 -true,11,4,23,11,0.7007,16.8160,341,512,171 -true,11,4,24,12,0.7337,17.6084,341,481,140 -true,11,5,16,2,0.5295,8.4712,640,1280,640 -true,11,5,17,4,0.4166,9.9985,426,1137,711 -true,11,5,18,4,0.4799,11.5164,426,930,504 -true,11,5,19,5,0.5401,12.9631,426,853,427 -true,11,5,20,6,0.6111,14.6660,426,731,305 -true,11,5,21,8,0.6747,16.1918,426,640,214 -true,11,5,22,9,0.6809,16.3416,426,640,214 -true,11,5,23,10,0.6929,16.6296,426,640,214 -true,11,5,24,11,0.7140,17.1355,426,602,176 -true,11,6,17,1,0.3510,8.4246,512,1536,1024 -true,11,6,18,4,0.4717,11.3211,512,1117,605 -true,11,6,19,5,0.5280,12.6716,512,1024,512 -true,11,6,20,5,0.5994,14.3864,512,877,365 -true,11,6,21,6,0.6668,16.0023,512,768,256 -true,11,6,22,9,0.6804,16.3307,512,768,256 -true,11,6,23,10,0.6913,16.5923,512,768,256 -true,11,6,24,11,0.7103,17.0471,512,722,210 -true,12,4,16,2,0.5358,8.5734,1024,2048,1024 -true,12,4,17,3,0.3839,9.2141,682,1820,1138 -true,12,4,18,4,0.4255,10.2130,682,1638,956 -true,12,4,19,5,0.5057,12.1376,682,1365,683 -true,12,4,20,5,0.5777,13.8659,682,1260,578 -true,12,4,21,6,0.6451,15.4819,682,1092,410 -true,12,4,22,9,0.6760,16.2233,682,1024,342 -true,12,4,23,10,0.6830,16.3916,682,1024,342 -true,12,4,24,11,0.6997,16.7937,682,1024,342 -true,12,5,17,2,0.3527,8.4655,853,2560,1707 -true,12,5,18,4,0.4164,9.9926,853,2275,1422 -true,12,5,19,4,0.4796,11.5101,853,1861,1008 -true,12,5,20,5,0.5398,12.9559,853,1706,853 -true,12,5,21,6,0.6107,14.6569,853,1462,609 -true,12,5,22,8,0.6740,16.1759,853,1280,427 -true,12,5,23,9,0.6802,16.3247,853,1280,427 -true,12,5,24,10,0.6921,16.6112,853,1280,427 -true,12,6,18,2,0.3508,8.4200,1024,3072,2048 -true,12,6,19,4,0.4716,11.3177,1024,2234,1210 -true,12,6,20,5,0.5277,12.6652,1024,2048,1024 -true,12,6,21,5,0.5992,14.3799,1024,1755,731 -true,12,6,22,6,0.6664,15.9942,1024,1638,614 -true,12,6,23,9,0.6799,16.3164,1024,1536,512 -true,12,6,24,10,0.6907,16.5774,1024,1536,512 -true,13,4,17,2,0.3571,8.5701,1365,4096,2731 -true,13,4,18,3,0.3838,9.2109,1365,3640,2275 -true,13,4,19,4,0.4255,10.2118,1365,3276,1911 -true,13,4,20,5,0.5057,12.1366,1365,2730,1365 -true,13,4,21,5,0.5775,13.8611,1365,2520,1155 -true,13,4,22,6,0.6447,15.4734,1365,2184,819 -true,13,4,23,9,0.6755,16.2126,1365,2048,683 -true,13,4,24,10,0.6825,16.3799,1365,2048,683 -true,13,5,18,2,0.3526,8.4629,1706,5120,3414 -true,13,5,19,4,0.4163,9.9900,1706,4551,2845 -true,13,5,20,4,0.4794,11.5061,1706,3723,2017 -true,13,5,21,5,0.5396,12.9513,1706,3413,1707 -true,13,5,22,6,0.6105,14.6509,1706,2925,1219 -true,13,5,23,8,0.6737,16.1678,1706,2560,854 -true,13,5,24,9,0.6798,16.3154,1706,2560,854 -true,13,6,19,2,0.3507,8.4177,2048,6144,4096 -true,13,6,20,4,0.4715,11.3155,2048,4468,2420 -true,13,6,21,5,0.5276,12.6621,2048,4096,2048 -true,13,6,22,6,0.5991,14.3777,2048,3510,1462 -true,13,6,23,6,0.6664,15.9937,2048,3276,1228 -true,13,6,24,9,0.6796,16.3096,2048,3072,1024 -true,14,4,18,2,0.3571,8.5694,2730,8192,5462 -true,14,4,19,3,0.3837,9.2093,2730,7281,4551 -true,14,4,20,4,0.4254,10.2103,2730,6553,3823 -true,14,4,21,5,0.5055,12.1325,2730,5461,2731 -true,14,4,22,5,0.5774,13.8580,2730,5041,2311 -true,14,4,23,6,0.6446,15.4705,2730,4369,1639 -true,14,4,24,9,0.6754,16.2084,2730,4096,1366 -true,14,5,19,2,0.3526,8.4617,3413,10240,6827 -true,14,5,20,4,0.4162,9.9882,3413,9102,5689 -true,14,5,21,4,0.4793,11.5040,3413,7447,4034 -true,14,5,22,5,0.5395,12.9480,3413,6826,3413 -true,14,5,23,6,0.6104,14.6485,3413,5851,2438 -true,14,5,24,8,0.6735,16.1634,3413,5120,1707 -true,14,6,20,2,0.3507,8.4172,4096,12288,8192 -true,14,6,21,4,0.4715,11.3157,4096,8936,4840 -true,14,6,22,5,0.5275,12.6602,4096,8192,4096 -true,14,6,23,6,0.5989,14.3742,4096,7021,2925 -true,14,6,24,6,0.6662,15.9894,4096,6553,2457 -true,15,4,19,2,0.3570,8.5679,5461,16384,10923 -true,15,4,20,3,0.3837,9.2081,5461,14563,9102 -true,15,4,21,4,0.4253,10.2064,5461,13107,7646 -true,15,4,22,5,0.5054,12.1294,5461,10922,5461 -true,15,4,23,5,0.5773,13.8544,5461,10082,4621 -true,15,4,24,6,0.6444,15.4660,5461,8738,3277 -true,15,4,25,9,0.5064,16.2050,4096,8192,4096 -true,15,4,26,10,0.5116,16.3723,4096,8192,4096 -true,15,4,27,11,0.5242,16.7732,4096,8192,4096 -true,15,4,28,12,0.5489,17.5649,4096,7710,3614 -true,15,4,29,12,0.5871,18.7881,4096,7281,3185 -true,15,4,30,13,0.6485,20.7511,4096,6553,2457 -true,15,4,31,14,0.7116,22.7705,4096,5957,1861 -true,15,4,32,16,0.7544,24.1402,4096,5461,1365 -true,15,5,20,2,0.3525,8.4604,6826,20480,13654 -true,15,5,21,4,0.4160,9.9851,6826,18204,11378 -true,15,5,22,4,0.4793,11.5031,6826,14894,8068 -true,15,5,23,5,0.5395,12.9472,6826,13653,6827 -true,15,5,24,6,0.6102,14.6452,6826,11702,4876 -true,15,5,25,8,0.5050,16.1613,5120,10240,5120 -true,15,5,26,9,0.5097,16.3090,5120,10240,5120 -true,15,5,27,10,0.5186,16.5949,5120,10240,5120 -true,15,5,28,11,0.5344,17.1010,5120,9637,4517 -true,15,5,29,12,0.5628,18.0098,5120,9102,3982 -true,15,5,30,12,0.6191,19.8110,5120,8623,3503 -true,15,5,31,13,0.6661,21.3159,5120,7801,2681 -true,15,5,32,14,0.7165,22.9281,5120,7447,2327 -true,15,6,21,2,0.3506,8.4152,8192,24576,16384 -true,15,6,22,4,0.4714,11.3127,8192,17873,9681 -true,15,6,23,5,0.5275,12.6595,8192,16384,8192 -true,15,6,24,6,0.5988,14.3707,8192,14043,5851 -true,15,6,25,6,0.4995,15.9836,6144,13107,6963 -true,15,6,26,9,0.5095,16.3033,6144,12288,6144 -true,15,6,27,10,0.5176,16.5639,6144,12288,6144 -true,15,6,28,11,0.5318,17.0183,6144,11565,5421 -true,15,6,29,12,0.5586,17.8760,6144,11565,5421 -true,15,6,30,12,0.6064,19.4036,6144,10347,4203 -true,15,6,31,13,0.6490,20.7689,6144,9830,3686 -true,15,6,32,14,0.7019,22.4619,6144,8936,2792 -true,16,4,20,2,0.3570,8.5670,10922,32768,21846 -true,16,4,21,3,0.3836,9.2067,10922,29127,18205 -true,16,4,22,4,0.4253,10.2073,10922,26214,15292 -true,16,4,23,5,0.5054,12.1301,10922,21845,10923 -true,16,4,24,5,0.5772,13.8534,10922,20164,9242 -true,16,4,25,6,0.4833,15.4663,8192,17476,9284 -true,16,4,26,9,0.5064,16.2034,8192,16384,8192 -true,16,4,27,10,0.5116,16.3702,8192,16384,8192 -true,16,4,28,11,0.5241,16.7703,8192,16384,8192 -true,16,4,29,12,0.5488,17.5616,8192,15420,7228 -true,16,4,30,12,0.5871,18.7861,8192,14563,6371 -true,16,4,31,13,0.6485,20.7521,8192,13107,4915 -true,16,4,32,14,0.7115,22.7674,8192,11915,3723 -true,16,5,21,2,0.3525,8.4602,13653,40960,27307 -true,16,5,22,4,0.4161,9.9862,13653,36408,22755 -true,16,5,23,4,0.4792,11.5018,13653,29789,16136 -true,16,5,24,5,0.5394,12.9463,13653,27306,13653 -true,16,5,25,6,0.4576,14.6446,10240,23405,13165 -true,16,5,26,8,0.5050,16.1596,10240,20480,10240 -true,16,5,27,9,0.5096,16.3079,10240,20480,10240 -true,16,5,28,10,0.5185,16.5936,10240,20480,10240 -true,16,5,29,11,0.5344,17.0993,10240,19275,9035 -true,16,5,30,12,0.5627,18.0078,10240,18204,7964 -true,16,5,31,12,0.6190,19.8087,10240,17246,7006 -true,16,5,32,13,0.6661,21.3155,10240,15603,5363 -true,16,6,22,2,0.3506,8.4147,16384,49152,32768 -true,16,6,23,4,0.4713,11.3104,16384,35746,19362 -true,16,6,24,5,0.5274,12.6583,16384,32768,16384 -true,16,6,25,6,0.4491,14.3701,12288,28086,15798 -true,16,6,26,6,0.4995,15.9843,12288,26214,13926 -true,16,6,27,9,0.5094,16.3016,12288,24576,12288 -true,16,6,28,10,0.5176,16.5621,12288,24576,12288 -true,16,6,29,11,0.5318,17.0167,12288,23130,10842 -true,16,6,30,12,0.5586,17.8756,12288,23130,10842 -true,16,6,31,12,0.6063,19.4012,12288,20695,8407 -true,16,6,32,13,0.6490,20.7678,12288,19660,7372 -true,17,4,21,2,0.3569,8.5654,21845,65536,43691 -true,17,4,22,3,0.3836,9.2064,21845,58254,36409 -true,17,4,23,4,0.4253,10.2066,21845,52428,30583 -true,17,4,24,5,0.5054,12.1302,21845,43690,21845 -true,17,4,25,5,0.4329,13.8536,16384,40329,23945 -true,17,4,26,6,0.4833,15.4664,16384,34952,18568 -true,17,4,27,9,0.5063,16.2022,16384,32768,16384 -true,17,4,28,10,0.5115,16.3690,16384,32768,16384 -true,17,4,29,11,0.5240,16.7682,16384,32768,16384 -true,17,4,30,12,0.5488,17.5623,16384,30840,14456 -true,17,4,31,12,0.5870,18.7850,16384,29127,12743 -true,17,4,32,13,0.6483,20.7469,16384,26214,9830 -true,17,5,22,2,0.3524,8.4587,27306,81920,54614 -true,17,5,23,4,0.4160,9.9847,27306,72817,45511 -true,17,5,24,4,0.4792,11.5008,27306,59578,32272 -true,17,5,25,5,0.4045,12.9435,20480,54613,34133 -true,17,5,26,6,0.4576,14.6419,20480,46811,26331 -true,17,5,27,8,0.5050,16.1589,20480,40960,20480 -true,17,5,28,9,0.5096,16.3067,20480,40960,20480 -true,17,5,29,10,0.5185,16.5920,20480,40960,20480 -true,17,5,30,11,0.5343,17.0984,20480,38550,18070 -true,17,5,31,12,0.5627,18.0078,20480,36408,15928 -true,17,5,32,12,0.6191,19.8098,20480,34492,14012 -true,17,6,23,2,0.3506,8.4141,32768,98304,65536 -true,17,6,24,4,0.4712,11.3084,32768,71493,38725 -true,17,6,25,5,0.3955,12.6556,24576,65536,40960 -true,17,6,26,6,0.4491,14.3705,24576,56173,31597 -true,17,6,27,6,0.4995,15.9838,24576,52428,27852 -true,17,6,28,9,0.5094,16.3005,24576,49152,24576 -true,17,6,29,10,0.5176,16.5616,24576,49152,24576 -true,17,6,30,11,0.5317,17.0154,24576,46260,21684 -true,17,6,31,12,0.5586,17.8751,24576,46260,21684 -true,17,6,32,12,0.6062,19.3974,24576,41391,16815 -true,18,4,22,2,0.3569,8.5655,43690,131072,87382 -true,18,4,23,3,0.3836,9.2065,43690,116508,72818 -true,18,4,24,4,0.4253,10.2064,43690,104857,61167 -true,18,4,25,5,0.3790,12.1282,32768,87381,54613 -true,18,4,26,5,0.4329,13.8541,32768,80659,47891 -true,18,4,27,6,0.4833,15.4657,32768,69905,37137 -true,18,4,28,9,0.5063,16.2016,32768,65536,32768 -true,18,4,29,10,0.5115,16.3679,32768,65536,32768 -true,18,4,30,11,0.5240,16.7682,32768,65536,32768 -true,18,4,31,12,0.5488,17.5608,32768,61680,28912 -true,18,4,32,12,0.5870,18.7839,32768,58254,25486 -true,18,5,23,2,0.3525,8.4596,54613,163840,109227 -true,18,5,24,4,0.4160,9.9841,54613,145635,91022 -true,18,5,25,4,0.3594,11.4997,40960,119156,78196 -true,18,5,26,5,0.4045,12.9456,40960,109226,68266 -true,18,5,27,6,0.4577,14.6455,40960,93622,52662 -true,18,5,28,8,0.5050,16.1586,40960,81920,40960 -true,18,5,29,9,0.5096,16.3067,40960,81920,40960 -true,18,5,30,10,0.5185,16.5917,40960,81920,40960 -true,18,5,31,11,0.5343,17.0972,40960,77101,36141 -true,18,5,32,12,0.5627,18.0059,40960,72817,31857 -true,18,6,24,2,0.3506,8.4149,65536,196608,131072 -true,18,6,25,4,0.3534,11.3093,49152,142987,93835 -true,18,6,26,5,0.3955,12.6573,49152,131072,81920 -true,18,6,27,6,0.4491,14.3709,49152,112347,63195 -true,18,6,28,6,0.4995,15.9828,49152,104857,55705 -true,18,6,29,9,0.5094,16.3010,49152,98304,49152 -true,18,6,30,10,0.5175,16.5610,49152,98304,49152 -true,18,6,31,11,0.5317,17.0145,49152,92521,43369 -true,18,6,32,12,0.5585,17.8727,49152,92521,43369 +false,4,4,8,0,0.5798,4.6385,8,16,8 +false,4,5,9,0,0.2762,4.4197,5,20,15 +false,4,5,10,6,0.6932,11.0917,5,7,2 +false,4,5,11,7,0.7748,12.3975,5,6,1 +false,4,5,12,8,0.8614,13.7826,5,6,1 +false,4,5,13,9,0.9547,15.2749,5,5,0 +false,4,5,14,10,1.0575,16.9201,5,5,0 +false,4,5,15,12,1.1694,18.7104,5,4,0 +false,4,5,16,13,1.2961,20.7374,5,4,0 +false,4,6,10,0,0.2674,4.2790,6,24,18 +false,4,6,11,7,0.7609,12.1739,6,8,2 +false,4,6,12,8,0.8433,13.4926,6,7,1 +false,4,6,13,9,0.9306,14.8900,6,6,0 +false,4,6,14,10,1.0247,16.3958,6,6,0 +false,4,6,15,11,1.1286,18.0574,6,5,0 +false,4,6,16,13,1.2394,19.8309,6,5,0 +false,5,4,9,0,0.2818,4.5094,8,32,24 +false,5,4,10,5,0.6578,10.5242,8,12,4 +false,5,4,11,7,0.7329,11.7256,8,11,3 +false,5,4,12,8,0.8098,12.9561,8,10,2 +false,5,4,13,9,0.8896,14.2329,8,9,1 +false,5,4,14,10,0.9731,15.5694,8,8,0 +false,5,4,15,11,1.0616,16.9852,8,8,0 +false,5,4,16,12,1.1544,18.4709,8,7,0 +false,5,5,10,0,0.2680,4.2883,10,40,30 +false,5,5,11,6,0.7090,11.3446,10,14,4 +false,5,5,12,7,0.7899,12.6376,10,13,3 +false,5,5,13,9,0.8662,13.8597,10,12,2 +false,5,5,14,10,0.9439,15.1022,10,10,0 +false,5,5,15,11,1.0244,16.3906,10,10,0 +false,5,5,16,12,1.1069,17.7111,10,9,0 +false,5,6,11,0,0.2595,4.1516,12,48,36 +false,5,6,12,7,0.7620,12.1916,12,16,4 +false,5,6,13,8,0.8421,13.4733,12,14,2 +false,5,6,14,9,0.9223,14.7563,12,13,1 +false,5,6,15,11,0.9999,15.9982,12,12,0 +false,5,6,16,12,1.0769,17.2312,12,11,0 +false,6,4,10,0,0.2769,4.4305,16,64,48 +false,6,4,11,6,0.6438,10.3001,16,25,9 +false,6,4,12,7,0.7185,11.4962,16,23,7 +false,6,4,13,8,0.7940,12.7038,16,21,5 +false,6,4,14,9,0.8701,13.9216,16,19,3 +false,6,4,15,10,0.9468,15.1488,16,17,1 +false,6,4,16,11,1.0240,16.3836,16,16,0 +false,6,5,11,0,0.2632,4.2109,20,80,60 +false,6,5,12,6,0.6961,11.1378,20,29,9 +false,6,5,13,8,0.7704,12.3261,20,26,6 +false,6,5,14,9,0.8434,13.4944,20,24,4 +false,6,5,15,10,0.9169,14.6701,20,22,2 +false,6,5,16,11,0.9908,15.8534,20,21,1 +false,6,6,12,0,0.2548,4.0775,24,96,72 +false,6,6,13,7,0.7471,11.9543,24,34,10 +false,6,6,14,8,0.8241,13.1863,24,29,5 +false,6,6,15,10,0.8978,14.3652,24,27,3 +false,6,6,16,11,0.9697,15.5146,24,25,1 +false,7,4,11,0,0.2739,4.3831,32,128,96 +false,7,4,12,6,0.6343,10.1485,32,51,19 +false,7,4,13,7,0.7067,11.3072,32,46,14 +false,7,4,14,8,0.7797,12.4747,32,42,10 +false,7,4,15,9,0.8530,13.6481,32,39,7 +false,7,4,16,10,0.9267,14.8273,32,36,4 +false,7,5,12,0,0.2603,4.1652,40,160,120 +false,7,5,13,7,0.6884,11.0139,40,58,18 +false,7,5,14,8,0.7588,12.1401,40,53,13 +false,7,5,15,9,0.8294,13.2708,40,49,9 +false,7,5,16,10,0.9004,14.4068,40,45,5 +false,7,6,13,0,0.2522,4.0346,48,192,144 +false,7,6,14,7,0.7392,11.8268,48,69,21 +false,7,6,15,8,0.8146,13.0329,48,59,11 +false,7,6,16,10,0.8841,14.1456,48,54,6 +false,8,4,12,0,0.2722,4.3549,64,256,192 +false,8,4,13,6,0.6290,10.0648,64,102,38 +false,8,4,14,7,0.7004,11.2057,64,93,29 +false,8,4,15,8,0.7720,12.3524,64,85,21 +false,8,4,16,9,0.8440,13.5038,64,78,14 +false,8,4,17,10,0.6108,14.6592,42,73,31 +false,8,4,18,11,0.6591,15.8176,42,68,26 +false,8,4,19,12,0.7074,16.9784,42,64,22 +false,8,4,20,14,0.7539,18.0941,42,56,14 +false,8,4,21,15,0.7995,19.1878,42,53,11 +false,8,4,22,16,0.8452,20.2838,42,51,9 +false,8,4,23,17,0.8909,21.3824,42,48,6 +false,8,4,24,18,0.9368,22.4839,42,46,4 +false,8,5,13,0,0.2587,4.1398,80,320,240 +false,8,5,14,7,0.6832,10.9306,80,128,48 +false,8,5,15,8,0.7524,12.0389,80,106,26 +false,8,5,16,9,0.8220,13.1517,80,98,18 +false,8,5,17,10,0.5945,14.2685,53,91,38 +false,8,5,18,11,0.6412,15.3883,53,85,32 +false,8,5,19,12,0.6880,16.5112,53,80,27 +false,8,5,20,13,0.7349,17.6369,53,75,22 +false,8,5,21,14,0.7819,18.7655,53,71,18 +false,8,5,22,15,0.8290,19.8959,53,67,14 +false,8,5,23,16,0.8762,21.0285,53,60,7 +false,8,5,24,18,0.9225,22.1401,53,58,5 +false,8,6,14,0,0.2507,4.0112,96,384,288 +false,8,6,15,7,0.7348,11.7566,96,139,43 +false,8,6,16,9,0.8085,12.9352,96,128,32 +false,8,6,17,10,0.5845,14.0275,64,109,45 +false,8,6,18,11,0.6301,15.1224,64,102,38 +false,8,6,19,12,0.6758,16.2203,64,96,32 +false,8,6,20,13,0.7217,17.3205,64,90,26 +false,8,6,21,14,0.7676,18.4230,64,85,21 +false,8,6,22,15,0.8137,19.5279,64,80,16 +false,8,6,23,16,0.8598,20.6350,64,76,12 +false,8,6,24,17,0.9060,21.7443,64,73,9 +false,9,4,13,0,0.2712,4.3396,128,512,384 +false,9,4,14,6,0.6261,10.0181,128,204,76 +false,9,4,15,7,0.6968,11.1493,128,186,58 +false,9,4,16,8,0.7679,12.2858,128,170,42 +false,9,4,17,9,0.5594,13.4257,85,157,72 +false,9,4,18,10,0.6070,14.5687,85,146,61 +false,9,4,19,11,0.6548,15.7143,85,136,51 +false,9,4,20,12,0.7025,16.8607,85,128,43 +false,9,4,21,14,0.7477,17.9439,85,120,35 +false,9,4,22,15,0.7925,19.0198,85,107,22 +false,9,4,23,16,0.8374,20.0977,85,102,17 +false,9,4,24,17,0.8824,21.1770,85,97,12 +false,9,5,14,0,0.2578,4.1248,160,640,480 +false,9,5,15,7,0.6803,10.8855,160,256,96 +false,9,5,16,8,0.7490,11.9841,160,232,72 +false,9,5,17,9,0.5453,13.0874,106,196,90 +false,9,5,18,10,0.5914,14.1939,106,182,76 +false,9,5,19,11,0.6376,15.3031,106,170,64 +false,9,5,20,12,0.6839,16.4144,106,160,54 +false,9,5,21,13,0.7303,17.5275,106,150,44 +false,9,5,22,14,0.7768,18.6427,106,142,36 +false,9,5,23,15,0.8233,19.7597,106,134,28 +false,9,5,24,16,0.8699,20.8777,106,128,22 +false,9,6,15,0,0.2498,3.9974,192,1024,832 +false,9,6,16,7,0.7324,11.7185,192,279,87 +false,9,6,17,9,0.5367,12.8819,128,256,128 +false,9,6,18,10,0.5819,13.9647,128,236,108 +false,9,6,19,11,0.6271,15.0502,128,204,76 +false,9,6,20,12,0.6724,16.1379,128,192,64 +false,9,6,21,13,0.7178,17.2278,128,180,52 +false,9,6,22,14,0.7633,18.3195,128,170,42 +false,9,6,23,15,0.8089,19.4128,128,161,33 +false,9,6,24,16,0.8545,20.5072,128,153,25 +false,10,4,14,0,0.2706,4.3301,256,1024,768 +false,10,4,15,6,0.6246,9.9928,256,455,199 +false,10,4,16,7,0.6949,11.1186,256,372,116 +false,10,4,17,8,0.5104,12.2499,170,341,171 +false,10,4,18,9,0.5577,13.3840,170,315,145 +false,10,4,19,10,0.6050,14.5206,170,292,122 +false,10,4,20,11,0.6525,15.6596,170,273,103 +false,10,4,21,13,0.7000,16.7993,170,256,86 +false,10,4,22,14,0.7444,17.8654,170,240,70 +false,10,4,23,15,0.7888,18.9321,170,227,57 +false,10,4,24,16,0.8333,20.0004,170,204,34 +false,10,5,15,0,0.2573,4.1167,320,1280,960 +false,10,5,16,7,0.6788,10.8605,320,512,192 +false,10,5,17,8,0.4981,11.9547,213,465,252 +false,10,5,18,9,0.5439,13.0531,213,393,180 +false,10,5,19,10,0.5898,14.1542,213,365,152 +false,10,5,20,11,0.6357,15.2579,213,341,128 +false,10,5,21,12,0.6818,16.3632,213,320,107 +false,10,5,22,13,0.7279,17.4705,213,301,88 +false,10,5,23,14,0.7741,18.5791,213,284,71 +false,10,5,24,15,0.8204,19.6890,213,269,56 +false,10,6,16,0,0.2494,3.9906,384,2048,1664 +false,10,6,17,7,0.4874,11.6976,256,558,302 +false,10,6,18,9,0.5355,12.8528,256,512,256 +false,10,6,19,10,0.5805,13.9311,256,472,216 +false,10,6,20,11,0.6255,15.0121,256,409,153 +false,10,6,21,12,0.6706,16.0946,256,384,128 +false,10,6,22,13,0.7158,17.1791,256,361,105 +false,10,6,23,14,0.7610,18.2651,256,341,85 +false,10,6,24,15,0.8063,19.3523,256,323,67 +false,11,4,15,0,0.2703,4.3253,512,2048,1536 +false,11,4,16,6,0.6237,9.9789,512,910,398 +false,11,4,17,7,0.4626,11.1025,341,744,403 +false,11,4,18,8,0.5096,12.2309,341,682,341 +false,11,4,19,9,0.5568,13.3622,341,630,289 +false,11,4,20,10,0.6040,14.4959,341,585,244 +false,11,4,21,11,0.6513,15.6314,341,546,205 +false,11,4,22,13,0.6985,16.7634,341,512,171 +false,11,4,23,14,0.7427,17.8247,341,481,140 +false,11,4,24,15,0.7870,18.8873,341,455,114 +false,11,5,16,0,0.2571,4.1128,640,2560,1920 +false,11,5,17,7,0.4519,10.8468,426,1024,598 +false,11,5,18,8,0.4974,11.9388,426,930,504 +false,11,5,19,9,0.5431,13.0347,426,787,361 +false,11,5,20,10,0.5889,14.1332,426,731,305 +false,11,5,21,11,0.6348,15.2342,426,682,256 +false,11,5,22,12,0.6807,16.3367,426,640,214 +false,11,5,23,13,0.7267,17.4407,426,602,176 +false,11,5,24,14,0.7728,18.5462,426,568,142 +false,11,6,17,0,0.1661,3.9867,512,4096,3584 +false,11,6,18,7,0.4869,11.6862,512,1117,605 +false,11,6,19,9,0.5349,12.8372,512,1024,512 +false,11,6,20,10,0.5797,13.9132,512,945,433 +false,11,6,21,11,0.6247,14.9916,512,877,365 +false,11,6,22,12,0.6697,16.0719,512,768,256 +false,11,6,23,13,0.7147,17.1535,512,722,210 +false,11,6,24,14,0.7599,18.2368,512,682,170 +false,12,4,16,0,0.2702,4.3226,1024,4096,3072 +false,12,4,17,6,0.4154,9.9707,682,1820,1138 +false,12,4,18,7,0.4622,11.0925,682,1489,807 +false,12,4,19,8,0.5091,12.2196,682,1365,683 +false,12,4,20,9,0.5562,13.3495,682,1260,578 +false,12,4,21,10,0.6034,14.4815,682,1170,488 +false,12,4,22,11,0.6506,15.6148,682,1092,410 +false,12,4,23,13,0.6976,16.7432,682,1024,342 +false,12,4,24,14,0.7417,17.8020,682,963,281 +false,12,5,17,0,0.1712,4.1100,853,5120,4267 +false,12,5,18,7,0.4516,10.8391,853,2048,1195 +false,12,5,19,8,0.4971,11.9296,853,1861,1008 +false,12,5,20,9,0.5427,13.0240,853,1575,722 +false,12,5,21,10,0.5884,14.1211,853,1462,609 +false,12,5,22,11,0.6342,15.2206,853,1365,512 +false,12,5,23,12,0.6801,16.3216,853,1280,427 +false,12,5,24,13,0.7260,17.4241,853,1204,351 +false,12,6,18,0,0.1660,3.9843,1024,8192,7168 +false,12,6,19,7,0.4867,11.6800,1024,2234,1210 +false,12,6,20,9,0.5345,12.8285,1024,2048,1024 +false,12,6,21,10,0.5793,13.9031,1024,1890,866 +false,12,6,22,11,0.6242,14.9801,1024,1755,731 +false,12,6,23,12,0.6691,16.0588,1024,1536,512 +false,12,6,24,13,0.7141,17.1392,1024,1445,421 +false,13,4,17,0,0.1801,4.3212,1365,8192,6827 +false,13,4,18,6,0.4153,9.9669,1365,3640,2275 +false,13,4,19,7,0.4620,11.0885,1365,2978,1613 +false,13,4,20,8,0.5089,12.2144,1365,2730,1365 +false,13,4,21,9,0.5560,13.3429,1365,2520,1155 +false,13,4,22,10,0.6031,14.4737,1365,2340,975 +false,13,4,23,11,0.6503,15.6062,1365,2184,819 +false,13,4,24,13,0.6972,16.7322,1365,2048,683 +false,13,5,18,0,0.1712,4.1094,1706,10240,8534 +false,13,5,19,7,0.4515,10.8356,1706,4096,2390 +false,13,5,20,8,0.4969,11.9255,1706,3723,2017 +false,13,5,21,9,0.5425,13.0193,1706,3150,1444 +false,13,5,22,10,0.5882,14.1158,1706,2925,1219 +false,13,5,23,11,0.6339,15.2143,1706,2730,1024 +false,13,5,24,12,0.6797,16.3139,1706,2560,854 +false,13,6,19,0,0.1660,3.9844,2048,16384,14336 +false,13,6,20,7,0.4865,11.6772,2048,4468,2420 +false,13,6,21,9,0.5344,12.8244,2048,4096,2048 +false,13,6,22,10,0.5791,13.8985,2048,3780,1732 +false,13,6,23,11,0.6240,14.9750,2048,3510,1462 +false,13,6,24,12,0.6689,16.0529,2048,3072,1024 +false,14,4,18,0,0.1800,4.3211,2730,16384,13654 +false,14,4,19,6,0.4152,9.9652,2730,7281,4551 +false,14,4,20,7,0.4619,11.0864,2730,5957,3227 +false,14,4,21,8,0.5088,12.2121,2730,5461,2731 +false,14,4,22,9,0.5559,13.3404,2730,5041,2311 +false,14,4,23,10,0.6030,14.4711,2730,4681,1951 +false,14,4,24,11,0.6501,15.6034,2730,4369,1639 +false,14,5,19,0,0.1712,4.1088,3413,20480,17067 +false,14,5,20,7,0.4514,10.8336,3413,8192,4779 +false,14,5,21,8,0.4968,11.9233,3413,7447,4034 +false,14,5,22,9,0.5424,13.0171,3413,6301,2888 +false,14,5,23,10,0.5881,14.1133,3413,5851,2438 +false,14,5,24,11,0.6338,15.2114,3413,5461,2048 +false,14,6,20,0,0.1660,3.9833,4096,32768,28672 +false,14,6,21,7,0.4865,11.6755,4096,8936,4840 +false,14,6,22,9,0.5343,12.8222,4096,8192,4096 +false,14,6,23,10,0.5790,13.8962,4096,7561,3465 +false,14,6,24,11,0.6238,14.9723,4096,7021,2925 +false,15,4,19,0,0.1800,4.3191,5461,32768,27307 +false,15,4,20,6,0.4151,9.9632,5461,14563,9102 +false,15,4,21,7,0.4618,11.0842,5461,11915,6454 +false,15,4,22,8,0.5087,12.2092,5461,10922,5461 +false,15,4,23,9,0.5557,13.3375,5461,10082,4621 +false,15,4,24,10,0.6028,14.4680,5461,9362,3901 +false,15,4,25,11,0.4875,15.5998,4096,8738,4642 +false,15,4,26,13,0.5226,16.7245,4096,8192,4096 +false,15,4,27,14,0.5557,17.7816,4096,7710,3614 +false,15,4,28,15,0.5887,18.8391,4096,7281,3185 +false,15,4,29,16,0.6218,19.8979,4096,6898,2802 +false,15,4,30,17,0.6549,20.9579,4096,6553,2457 +false,15,4,31,18,0.6881,22.0177,4096,5957,1861 +false,15,4,32,19,0.7212,23.0787,4096,5698,1602 +false,15,5,20,0,0.1711,4.1071,6826,40960,34134 +false,15,5,21,7,0.4513,10.8321,6826,16384,9558 +false,15,5,22,8,0.4967,11.9213,6826,14894,8068 +false,15,5,23,9,0.5423,13.0149,6826,12603,5777 +false,15,5,24,10,0.5879,14.1104,6826,11702,4876 +false,15,5,25,11,0.4753,15.2082,5120,10922,5802 +false,15,5,26,12,0.5096,16.3073,5120,10240,5120 +false,15,5,27,13,0.5440,17.4088,5120,9637,4517 +false,15,5,28,14,0.5785,18.5107,5120,9102,3982 +false,15,5,29,15,0.6129,19.6133,5120,8623,3503 +false,15,5,30,16,0.6474,20.7168,5120,8192,3072 +false,15,5,31,18,0.6801,21.7648,5120,7801,2681 +false,15,5,32,19,0.7128,22.8100,5120,7447,2327 +false,15,6,21,0,0.1659,3.9822,8192,65536,57344 +false,15,6,22,7,0.4864,11.6740,8192,17873,9681 +false,15,6,23,9,0.5342,12.8205,8192,16384,8192 +false,15,6,24,10,0.5789,13.8941,8192,15123,6931 +false,15,6,25,11,0.4678,14.9699,6144,14043,7899 +false,15,6,26,12,0.5015,16.0478,6144,12288,6144 +false,15,6,27,13,0.5352,17.1264,6144,11565,5421 +false,15,6,28,14,0.5690,18.2066,6144,10922,4778 +false,15,6,29,15,0.6027,19.2878,6144,10347,4203 +false,15,6,30,16,0.6366,20.3704,6144,9830,3686 +false,15,6,31,17,0.6704,21.4535,6144,9362,3218 +false,15,6,32,18,0.7043,22.5373,6144,8936,2792 +false,16,4,20,0,0.1799,4.3184,10922,65536,54614 +false,16,4,21,6,0.4151,9.9625,10922,29127,18205 +false,16,4,22,7,0.4618,11.0834,10922,23831,12909 +false,16,4,23,8,0.5087,12.2087,10922,21845,10923 +false,16,4,24,9,0.5557,13.3368,10922,20164,9242 +false,16,4,25,10,0.4521,14.4666,8192,18724,10532 +false,16,4,26,11,0.4875,15.5985,8192,17476,9284 +false,16,4,27,13,0.5226,16.7227,8192,16384,8192 +false,16,4,28,14,0.5556,17.7793,8192,15420,7228 +false,16,4,29,15,0.5887,18.8370,8192,14563,6371 +false,16,4,30,16,0.6217,19.8957,8192,13797,5605 +false,16,4,31,17,0.6549,20.9553,8192,13107,4915 +false,16,4,32,18,0.6880,22.0152,8192,11915,3723 +false,16,5,21,0,0.1711,4.1069,13653,81920,68267 +false,16,5,22,7,0.4513,10.8311,13653,32768,19115 +false,16,5,23,8,0.4967,11.9203,13653,29789,16136 +false,16,5,24,9,0.5422,13.0138,13653,25206,11553 +false,16,5,25,10,0.4409,14.1096,10240,23405,13165 +false,16,5,26,11,0.4752,15.2074,10240,21845,11605 +false,16,5,27,12,0.5096,16.3067,10240,20480,10240 +false,16,5,28,13,0.5440,17.4073,10240,19275,9035 +false,16,5,29,14,0.5784,18.5088,10240,18204,7964 +false,16,5,30,15,0.6129,19.6116,10240,17246,7006 +false,16,5,31,16,0.6473,20.7151,10240,16384,6144 +false,16,5,32,18,0.6801,21.7623,10240,15603,5363 +false,16,6,22,0,0.1659,3.9821,16384,131072,114688 +false,16,6,23,7,0.4864,11.6730,16384,35746,19362 +false,16,6,24,9,0.5341,12.8194,16384,32768,16384 +false,16,6,25,10,0.4342,13.8929,12288,30247,17959 +false,16,6,26,11,0.4678,14.9690,12288,28086,15798 +false,16,6,27,12,0.5015,16.0467,12288,24576,12288 +false,16,6,28,13,0.5352,17.1254,12288,23130,10842 +false,16,6,29,14,0.5689,18.2057,12288,21845,9557 +false,16,6,30,15,0.6027,19.2869,12288,20695,8407 +false,16,6,31,16,0.6365,20.3691,12288,19660,7372 +false,16,6,32,17,0.6704,21.4517,12288,18724,6436 +false,17,4,21,0,0.1799,4.3187,21845,131072,109227 +false,17,4,22,6,0.4151,9.9618,21845,58254,36409 +false,17,4,23,7,0.4618,11.0826,21845,47662,25817 +false,17,4,24,8,0.5087,12.2078,21845,43690,21845 +false,17,4,25,9,0.4167,13.3357,16384,40329,23945 +false,17,4,26,10,0.4521,14.4659,16384,37449,21065 +false,17,4,27,11,0.4874,15.5977,16384,34952,18568 +false,17,4,28,13,0.5225,16.7216,16384,32768,16384 +false,17,4,29,14,0.5556,17.7783,16384,30840,14456 +false,17,4,30,15,0.5886,18.8357,16384,29127,12743 +false,17,4,31,16,0.6217,19.8942,16384,27594,11210 +false,17,4,32,17,0.6548,20.9535,16384,26214,9830 +false,17,5,22,0,0.1712,4.1078,27306,163840,136534 +false,17,5,23,7,0.4513,10.8301,27306,65536,38230 +false,17,5,24,8,0.4967,11.9198,27306,59578,32272 +false,17,5,25,9,0.4067,13.0131,20480,50412,29932 +false,17,5,26,10,0.4409,14.1091,20480,46811,26331 +false,17,5,27,11,0.4752,15.2066,20480,43690,23210 +false,17,5,28,12,0.5095,16.3055,20480,40960,20480 +false,17,5,29,13,0.5439,17.4064,20480,38550,18070 +false,17,5,30,14,0.5784,18.5080,20480,36408,15928 +false,17,5,31,15,0.6128,19.6106,20480,34492,14012 +false,17,5,32,16,0.6473,20.7136,20480,32768,12288 +false,17,6,23,0,0.1660,3.9828,32768,262144,229376 +false,17,6,24,7,0.4863,11.6716,32768,71493,38725 +false,17,6,25,9,0.4006,12.8184,24576,65536,40960 +false,17,6,26,10,0.4341,13.8924,24576,60494,35918 +false,17,6,27,11,0.4678,14.9682,24576,56173,31597 +false,17,6,28,12,0.5014,16.0457,24576,49152,24576 +false,17,6,29,13,0.5351,17.1247,24576,46260,21684 +false,17,6,30,14,0.5689,18.2048,24576,43690,19114 +false,17,6,31,15,0.6027,19.2856,24576,41391,16815 +false,17,6,32,16,0.6365,20.3679,24576,39321,14745 +false,18,4,22,0,0.1800,4.3199,43690,262144,218454 +false,18,4,23,6,0.4151,9.9617,43690,116508,72818 +false,18,4,24,7,0.4618,11.0823,43690,95325,51635 +false,18,4,25,8,0.3815,12.2076,32768,87381,54613 +false,18,4,26,9,0.4167,13.3354,32768,80659,47891 +false,18,4,27,10,0.4520,14.4654,32768,74898,42130 +false,18,4,28,11,0.4874,15.5972,32768,69905,37137 +false,18,4,29,13,0.5225,16.7211,32768,65536,32768 +false,18,4,30,14,0.5556,17.7776,32768,61680,28912 +false,18,4,31,15,0.5886,18.8349,32768,58254,25486 +false,18,4,32,16,0.6217,19.8930,32768,55188,22420 +false,18,5,23,0,0.1712,4.1078,54613,327680,273067 +false,18,5,24,7,0.4513,10.8308,54613,131072,76459 +false,18,5,25,8,0.3725,11.9198,40960,119156,78196 +false,18,5,26,9,0.4067,13.0130,40960,100824,59864 +false,18,5,27,10,0.4409,14.1085,40960,93622,52662 +false,18,5,28,11,0.4752,15.2062,40960,87381,46421 +false,18,5,29,12,0.5095,16.3053,40960,81920,40960 +false,18,5,30,13,0.5439,17.4059,40960,77101,36141 +false,18,5,31,14,0.5784,18.5077,40960,72817,31857 +false,18,5,32,15,0.6128,19.6101,40960,68985,28025 +false,18,6,24,0,0.1659,3.9826,65536,524288,458752 +false,18,6,25,7,0.3648,11.6724,49152,142987,93835 +false,18,6,26,9,0.4006,12.8192,49152,131072,81920 +false,18,6,27,10,0.4341,13.8925,49152,120989,71837 +false,18,6,28,11,0.4678,14.9682,49152,112347,63195 +false,18,6,29,12,0.5014,16.0454,49152,98304,49152 +false,18,6,30,13,0.5351,17.1242,49152,92521,43369 +false,18,6,31,14,0.5689,18.2044,49152,87381,38229 +false,18,6,32,15,0.6027,19.2853,49152,82782,33630 +true,4,4,8,1,1.1595,9.2758,8,7,0 +true,4,5,9,1,0.5701,9.1217,5,8,3 +true,4,5,10,5,0.9552,15.2835,5,5,0 +true,4,5,11,6,1.0671,17.0733,5,4,0 +true,4,5,12,9,1.1061,17.6974,5,4,0 +true,4,5,13,10,1.1443,18.3084,5,4,0 +true,4,5,14,11,1.2087,19.3397,5,4,0 +true,4,5,15,12,1.3234,21.1749,5,3,0 +true,4,5,16,13,1.5101,24.1621,5,3,0 +true,4,6,10,1,0.5667,9.0680,6,10,4 +true,4,6,11,6,1.0469,16.7501,6,6,0 +true,4,6,12,9,1.0960,17.5357,6,5,0 +true,4,6,13,10,1.1285,18.0564,6,5,0 +true,4,6,14,11,1.1830,18.9280,6,5,0 +true,4,6,15,12,1.2798,20.4775,6,4,0 +true,4,6,16,13,1.4422,23.0747,6,4,0 +true,5,4,9,1,0.5548,8.8764,8,16,8 +true,5,4,10,5,0.8860,14.1757,8,9,1 +true,5,4,11,6,1.0262,16.4188,8,8,0 +true,5,4,12,9,1.0796,17.2742,8,7,0 +true,5,4,13,10,1.1032,17.6511,8,7,0 +true,5,4,14,11,1.1453,18.3254,8,7,0 +true,5,4,15,12,1.2190,19.5038,8,6,0 +true,5,4,16,12,1.3394,21.4300,8,6,0 +true,5,5,10,1,0.5481,8.7692,10,20,10 +true,5,5,11,6,1.0065,16.1035,10,10,0 +true,5,5,12,8,1.0677,17.0827,10,9,0 +true,5,5,13,9,1.0873,17.3967,10,9,0 +true,5,5,14,10,1.1227,17.9629,10,9,0 +true,5,5,15,11,1.1827,18.9226,10,8,0 +true,5,5,16,12,1.2792,20.4664,10,8,0 +true,5,6,11,1,0.5441,8.7055,12,24,12 +true,5,6,12,8,1.0579,16.9256,12,12,0 +true,5,6,13,9,1.0752,17.2038,12,11,0 +true,5,6,14,10,1.1040,17.6633,12,11,0 +true,5,6,15,11,1.1540,18.4634,12,10,0 +true,5,6,16,12,1.2385,19.8161,12,10,0 +true,6,4,10,1,0.5410,8.6556,16,32,16 +true,6,4,11,5,0.9217,14.7470,16,18,2 +true,6,4,12,6,1.0434,16.6950,16,16,0 +true,6,4,13,9,1.0589,16.9431,16,16,0 +true,6,4,14,10,1.0784,17.2539,16,15,0 +true,6,4,15,11,1.1159,17.8544,16,15,0 +true,6,4,16,12,1.1825,18.9201,16,14,0 +true,6,5,11,1,0.5349,8.5586,20,40,20 +true,6,5,12,6,1.0144,16.2308,20,20,0 +true,6,5,13,9,1.0484,16.7745,20,20,0 +true,6,5,14,10,1.0661,17.0574,20,18,0 +true,6,5,15,11,1.0972,17.5556,20,18,0 +true,6,5,16,12,1.1544,18.4697,20,17,0 +true,6,6,12,1,0.5316,8.5052,24,48,24 +true,6,6,13,8,1.0420,16.6726,24,24,0 +true,6,6,14,9,1.0576,16.9209,24,24,0 +true,6,6,15,10,1.0843,17.3486,24,22,0 +true,6,6,16,11,1.1303,18.0851,24,21,0 +true,7,4,11,1,0.5333,8.5322,32,64,32 +true,7,4,12,5,0.9369,14.9911,32,36,4 +true,7,4,13,8,1.0320,16.5119,32,32,0 +true,7,4,14,9,1.0425,16.6796,32,32,0 +true,7,4,15,10,1.0600,16.9605,32,32,0 +true,7,4,16,11,1.0952,17.5227,32,30,0 +true,7,5,12,1,0.5276,8.4416,40,80,40 +true,7,5,13,6,1.0173,16.2770,40,40,0 +true,7,5,14,9,1.0338,16.5410,40,40,0 +true,7,5,15,10,1.0497,16.7955,40,40,0 +true,7,5,16,11,1.0790,17.2636,40,37,0 +true,7,6,13,1,0.5247,8.3944,48,96,48 +true,7,6,14,9,1.0296,16.4739,48,48,0 +true,7,6,15,10,1.0435,16.6961,48,48,0 +true,7,6,16,11,1.0696,17.1131,48,45,0 +true,8,4,12,1,0.5290,8.4638,64,128,64 +true,8,4,13,5,0.9382,15.0107,64,68,4 +true,8,4,14,8,1.0227,16.3638,64,64,0 +true,8,4,15,9,1.0325,16.5197,64,64,0 +true,8,4,16,10,1.0494,16.7908,64,64,0 +true,8,4,17,11,0.7232,17.3564,42,60,18 +true,8,4,18,12,0.7669,18.4051,42,56,14 +true,8,4,19,13,0.8409,20.1818,42,51,9 +true,8,4,20,13,0.9231,22.1534,42,46,4 +true,8,4,21,14,1.0038,24.0908,42,42,0 +true,8,4,22,17,1.0292,24.7019,42,42,0 +true,8,4,23,18,1.0386,24.9257,42,42,0 +true,8,4,24,19,1.0568,25.3628,42,40,0 +true,8,5,13,1,0.5235,8.3766,80,160,80 +true,8,5,14,8,1.0178,16.2855,80,80,0 +true,8,5,15,9,1.0251,16.4008,80,80,0 +true,8,5,16,10,1.0403,16.6447,80,80,0 +true,8,5,17,11,0.7130,17.1129,53,75,22 +true,8,5,18,12,0.7509,18.0227,53,71,18 +true,8,5,19,12,0.8147,19.5525,53,67,14 +true,8,5,20,13,0.8932,21.4358,53,60,7 +true,8,5,21,14,0.9821,23.5706,53,55,2 +true,8,5,22,17,1.0238,24.5715,53,53,0 +true,8,5,23,17,1.0324,24.7770,53,53,0 +true,8,5,24,18,1.0473,25.1354,53,51,0 +true,8,6,14,1,0.5209,8.3342,96,192,96 +true,8,6,15,9,1.0219,16.3512,96,96,0 +true,8,6,16,10,1.0352,16.5637,96,96,0 +true,8,6,17,11,0.7074,16.9777,64,96,32 +true,8,6,18,11,0.7408,17.7795,64,90,26 +true,8,6,19,12,0.7934,19.0412,64,80,16 +true,8,6,20,13,0.8719,20.9260,64,76,12 +true,8,6,21,14,0.9667,23.2018,64,66,2 +true,8,6,22,16,1.0196,24.4701,64,64,0 +true,8,6,23,17,1.0263,24.6307,64,64,0 +true,8,6,24,18,1.0384,24.9225,64,64,0 +true,9,4,13,1,0.5266,8.4260,128,256,128 +true,9,4,14,6,0.9369,14.9897,128,146,18 +true,9,4,15,8,1.0168,16.2688,128,128,0 +true,9,4,16,9,1.0261,16.4172,128,128,0 +true,9,4,17,10,0.6952,16.6845,85,128,43 +true,9,4,18,11,0.7187,17.2480,85,120,35 +true,9,4,19,12,0.7622,18.2922,85,113,28 +true,9,4,20,13,0.8357,20.0557,85,102,17 +true,9,4,21,13,0.9174,22.0166,85,93,8 +true,9,4,22,14,0.9989,23.9744,85,89,4 +true,9,4,23,17,1.0196,24.4702,85,85,0 +true,9,4,24,18,1.0282,24.6762,85,85,0 +true,9,5,14,1,0.5213,8.3414,160,320,160 +true,9,5,15,8,1.0130,16.2073,160,160,0 +true,9,5,16,9,1.0198,16.3162,160,160,0 +true,9,5,17,10,0.6898,16.5560,106,160,54 +true,9,5,18,11,0.7092,17.0213,106,150,44 +true,9,5,19,12,0.7470,17.9285,106,150,44 +true,9,5,20,12,0.8110,19.4637,106,134,28 +true,9,5,21,13,0.8884,21.3218,106,121,15 +true,9,5,22,14,0.9766,23.4376,106,111,5 +true,9,5,23,17,1.0160,24.3843,106,106,0 +true,9,5,24,18,1.0241,24.5773,106,106,0 +true,9,6,15,1,0.5188,8.3010,192,384,192 +true,9,6,16,9,1.0175,16.2800,192,192,0 +true,9,6,17,10,0.6870,16.4883,128,192,64 +true,9,6,18,11,0.7041,16.8995,128,192,64 +true,9,6,19,11,0.7379,17.7095,128,180,52 +true,9,6,20,12,0.7902,18.9648,128,170,42 +true,9,6,21,13,0.8680,20.8325,128,153,25 +true,9,6,22,14,0.9618,23.0837,128,133,5 +true,9,6,23,16,1.0133,24.3190,128,128,0 +true,9,6,24,17,1.0196,24.4708,128,128,0 +true,10,4,14,1,0.5253,8.4055,256,512,256 +true,10,4,15,6,0.9351,14.9615,256,292,36 +true,10,4,16,8,1.0136,16.2170,256,256,0 +true,10,4,17,9,0.6818,16.3627,170,256,86 +true,10,4,18,10,0.6929,16.6289,170,256,86 +true,10,4,19,11,0.7163,17.1919,170,240,70 +true,10,4,20,12,0.7596,18.2302,170,227,57 +true,10,4,21,13,0.8328,19.9864,170,215,45 +true,10,4,22,13,0.9144,21.9464,170,195,25 +true,10,4,23,14,0.9956,23.8951,170,178,8 +true,10,4,24,17,1.0144,24.3452,170,170,0 +true,10,5,15,1,0.5201,8.3222,320,640,320 +true,10,5,16,8,1.0103,16.1652,320,320,0 +true,10,5,17,9,0.6780,16.2713,213,320,107 +true,10,5,18,10,0.6879,16.5090,213,320,107 +true,10,5,19,11,0.7072,16.9733,213,320,107 +true,10,5,20,12,0.7449,17.8778,213,301,88 +true,10,5,21,12,0.8090,19.4170,213,269,56 +true,10,5,22,13,0.8860,21.2642,213,243,30 +true,10,5,23,14,0.9734,23.3625,213,222,9 +true,10,5,24,17,1.0118,24.2829,213,213,0 +true,10,6,16,1,0.5177,8.2835,384,768,384 +true,10,6,17,9,0.6767,16.2415,256,384,128 +true,10,6,18,10,0.6853,16.4482,256,384,128 +true,10,6,19,11,0.7024,16.8584,256,384,128 +true,10,6,20,11,0.7363,17.6711,256,361,105 +true,10,6,21,12,0.7884,18.9223,256,341,85 +true,10,6,22,13,0.8660,20.7830,256,307,51 +true,10,6,23,14,0.9592,23.0200,256,267,11 +true,10,6,24,16,1.0099,24.2371,256,256,0 +true,11,4,15,1,0.5246,8.3934,512,1024,512 +true,11,4,16,6,0.9341,14.9462,512,585,73 +true,11,4,17,8,0.6746,16.1895,341,512,171 +true,11,4,18,9,0.6806,16.3348,341,512,171 +true,11,4,19,10,0.6916,16.5986,341,512,171 +true,11,4,20,11,0.7150,17.1611,341,481,140 +true,11,4,21,12,0.7583,18.2001,341,455,114 +true,11,4,22,13,0.8314,19.9544,341,431,90 +true,11,4,23,13,0.9128,21.9074,341,390,49 +true,11,4,24,14,0.9937,23.8491,341,356,15 +true,11,5,16,1,0.5194,8.3111,640,1280,640 +true,11,5,17,8,0.6726,16.1430,426,640,214 +true,11,5,18,9,0.6770,16.2482,426,640,214 +true,11,5,19,10,0.6869,16.4845,426,640,214 +true,11,5,20,11,0.7062,16.9483,426,640,214 +true,11,5,21,12,0.7439,17.8538,426,602,176 +true,11,5,22,12,0.8081,19.3943,426,538,112 +true,11,5,23,13,0.8846,21.2304,426,487,61 +true,11,5,24,14,0.9718,23.3232,426,445,19 +true,11,6,17,1,0.3447,8.2736,512,1536,1024 +true,11,6,18,9,0.6759,16.2218,512,768,256 +true,11,6,19,10,0.6845,16.4271,512,768,256 +true,11,6,20,11,0.7015,16.8363,512,768,256 +true,11,6,21,12,0.7355,17.6512,512,722,210 +true,11,6,22,12,0.7875,18.9012,512,682,170 +true,11,6,23,13,0.8647,20.7532,512,614,102 +true,11,6,24,14,0.9578,22.9871,512,558,46 +true,12,4,16,2,0.5242,8.3865,1024,2048,1024 +true,12,4,17,6,0.6225,14.9396,682,1170,488 +true,12,4,18,8,0.6739,16.1734,682,1024,342 +true,12,4,19,9,0.6799,16.3173,682,1024,342 +true,12,4,20,10,0.6909,16.5825,682,1024,342 +true,12,4,21,11,0.7143,17.1432,682,963,281 +true,12,4,22,12,0.7575,18.1795,682,910,228 +true,12,4,23,13,0.8304,19.9305,682,862,180 +true,12,4,24,13,0.9119,21.8867,682,780,98 +true,12,5,17,1,0.3461,8.3056,853,2560,1707 +true,12,5,18,8,0.6721,16.1302,853,1280,427 +true,12,5,19,9,0.6764,16.2341,853,1280,427 +true,12,5,20,10,0.6862,16.4697,853,1280,427 +true,12,5,21,11,0.7056,16.9334,853,1280,427 +true,12,5,22,12,0.7432,17.8378,853,1204,351 +true,12,5,23,12,0.8075,19.3796,853,1077,224 +true,12,5,24,13,0.8839,21.2137,853,975,122 +true,12,6,18,1,0.3445,8.2686,1024,3072,2048 +true,12,6,19,9,0.6754,16.2100,1024,1536,512 +true,12,6,20,10,0.6839,16.4145,1024,1536,512 +true,12,6,21,11,0.7010,16.8232,1024,1536,512 +true,12,6,22,12,0.7349,17.6378,1024,1445,421 +true,12,6,23,12,0.7870,18.8883,1024,1365,341 +true,12,6,24,13,0.8642,20.7405,1024,1228,204 +true,13,4,17,2,0.3493,8.3827,1365,4096,2731 +true,13,4,18,6,0.6223,14.9340,1365,2340,975 +true,13,4,19,8,0.6735,16.1647,1365,2048,683 +true,13,4,20,9,0.6795,16.3078,1365,2048,683 +true,13,4,21,10,0.6905,16.5713,1365,2048,683 +true,13,4,22,11,0.7139,17.1340,1365,1927,562 +true,13,4,23,12,0.7571,18.1712,1365,1820,455 +true,13,4,24,13,0.8301,19.9229,1365,1724,359 +true,13,5,18,1,0.3459,8.3025,1706,5120,3414 +true,13,5,19,8,0.6718,16.1235,1706,2560,854 +true,13,5,20,9,0.6761,16.2266,1706,2560,854 +true,13,5,21,10,0.6859,16.4619,1706,2560,854 +true,13,5,22,11,0.7052,16.9253,1706,2560,854 +true,13,5,23,12,0.7430,17.8309,1706,2409,703 +true,13,5,24,12,0.8072,19.3717,1706,2155,449 +true,13,6,19,1,0.3444,8.2658,2048,6144,4096 +true,13,6,20,9,0.6752,16.2043,2048,3072,1024 +true,13,6,21,10,0.6837,16.4086,2048,3072,1024 +true,13,6,22,11,0.7007,16.8169,2048,3072,1024 +true,13,6,23,12,0.7347,17.6326,2048,2891,843 +true,13,6,24,12,0.7868,18.8823,2048,2730,682 +true,14,4,18,2,0.3492,8.3817,2730,8192,5462 +true,14,4,19,6,0.6222,14.9319,2730,4681,1951 +true,14,4,20,8,0.6734,16.1612,2730,4096,1366 +true,14,4,21,9,0.6794,16.3059,2730,4096,1366 +true,14,4,22,10,0.6904,16.5697,2730,4096,1366 +true,14,4,23,11,0.7138,17.1323,2730,3855,1125 +true,14,4,24,12,0.7570,18.1668,2730,3640,910 +true,14,5,19,1,0.3459,8.3016,3413,10240,6827 +true,14,5,20,8,0.6717,16.1201,3413,5120,1707 +true,14,5,21,9,0.6760,16.2238,3413,5120,1707 +true,14,5,22,10,0.6858,16.4598,3413,5120,1707 +true,14,5,23,11,0.7052,16.9241,3413,5120,1707 +true,14,5,24,12,0.7428,17.8278,3413,4818,1405 +true,14,6,20,1,0.3444,8.2652,4096,12288,8192 +true,14,6,21,9,0.6751,16.2017,4096,6144,2048 +true,14,6,22,10,0.6836,16.4067,4096,6144,2048 +true,14,6,23,11,0.7007,16.8158,4096,6144,2048 +true,14,6,24,12,0.7346,17.6305,4096,5782,1686 +true,15,4,19,2,0.3492,8.3807,5461,16384,10923 +true,15,4,20,6,0.6220,14.9286,5461,9362,3901 +true,15,4,21,8,0.6733,16.1586,5461,8192,2731 +true,15,4,22,9,0.6793,16.3025,5461,8192,2731 +true,15,4,23,10,0.6903,16.5662,5461,8192,2731 +true,15,4,24,11,0.7137,17.1277,5461,7710,2249 +true,15,4,25,12,0.5676,18.1625,4096,7281,3185 +true,15,4,26,13,0.6223,19.9141,4096,6898,2802 +true,15,4,27,13,0.6834,21.8683,4096,6241,2145 +true,15,4,28,14,0.7438,23.8003,4096,5698,1602 +true,15,4,29,17,0.7566,24.2115,4096,5461,1365 +true,15,4,30,18,0.7628,24.4081,4096,5461,1365 +true,15,4,31,19,0.7758,24.8260,4096,5461,1365 +true,15,4,32,20,0.8012,25.6372,4096,5242,1146 +true,15,5,20,1,0.3458,8.2998,6826,20480,13654 +true,15,5,21,8,0.6716,16.1182,6826,10240,3414 +true,15,5,22,9,0.6759,16.2217,6826,10240,3414 +true,15,5,23,10,0.6857,16.4570,6826,10240,3414 +true,15,5,24,11,0.7050,16.9203,6826,10240,3414 +true,15,5,25,12,0.5570,17.8239,5120,9637,4517 +true,15,5,26,12,0.6052,19.3662,5120,8623,3503 +true,15,5,27,13,0.6624,21.1977,5120,7801,2681 +true,15,5,28,14,0.7275,23.2801,5120,7123,2003 +true,15,5,29,17,0.7555,24.1756,5120,6826,1706 +true,15,5,30,18,0.7612,24.3595,5120,6826,1706 +true,15,5,31,19,0.7725,24.7214,5120,6826,1706 +true,15,5,32,19,0.7924,25.3565,5120,6553,1433 +true,15,6,21,1,0.3443,8.2634,8192,24576,16384 +true,15,6,22,9,0.6750,16.1999,8192,12288,4096 +true,15,6,23,10,0.6835,16.4045,8192,12288,4096 +true,15,6,24,11,0.7005,16.8126,8192,12288,4096 +true,15,6,25,12,0.5509,17.6278,6144,11565,5421 +true,15,6,26,12,0.5899,18.8778,6144,10922,4778 +true,15,6,27,13,0.6477,20.7263,6144,9830,3686 +true,15,6,28,14,0.7172,22.9512,6144,8936,2792 +true,15,6,29,16,0.7547,24.1493,6144,8192,2048 +true,15,6,30,17,0.7593,24.2960,6144,8192,2048 +true,15,6,31,18,0.7681,24.5777,6144,8192,2048 +true,15,6,32,19,0.7848,25.1150,6144,7864,1720 +true,16,4,20,2,0.3491,8.3790,10922,32768,21846 +true,16,4,21,6,0.6220,14.9275,10922,18724,7802 +true,16,4,22,8,0.6732,16.1573,10922,16384,5462 +true,16,4,23,9,0.6792,16.3010,10922,16384,5462 +true,16,4,24,10,0.6902,16.5645,10922,16384,5462 +true,16,4,25,11,0.5352,17.1252,8192,15420,7228 +true,16,4,26,12,0.5675,18.1613,8192,14563,6371 +true,16,4,27,13,0.6222,19.9110,8192,13797,5605 +true,16,4,28,13,0.6833,21.8659,8192,12483,4291 +true,16,4,29,14,0.7436,23.7961,8192,11397,3205 +true,16,4,30,17,0.7565,24.2095,8192,10922,2730 +true,16,4,31,18,0.7626,24.4042,8192,10922,2730 +true,16,4,32,19,0.7757,24.8225,8192,10922,2730 +true,16,5,21,1,0.3458,8.2997,13653,40960,27307 +true,16,5,22,8,0.6715,16.1167,13653,20480,6827 +true,16,5,23,9,0.6758,16.2203,13653,20480,6827 +true,16,5,24,10,0.6857,16.4559,13653,20480,6827 +true,16,5,25,11,0.5287,16.9191,10240,20480,10240 +true,16,5,26,12,0.5570,17.8233,10240,19275,9035 +true,16,5,27,12,0.6051,19.3636,10240,17246,7006 +true,16,5,28,13,0.6624,21.1969,10240,15603,5363 +true,16,5,29,14,0.7274,23.2777,10240,14246,4006 +true,16,5,30,17,0.7554,24.1737,10240,13653,3413 +true,16,5,31,18,0.7611,24.3568,10240,13653,3413 +true,16,5,32,19,0.7725,24.7185,10240,13653,3413 +true,16,6,22,1,0.3443,8.2628,16384,49152,32768 +true,16,6,23,9,0.6749,16.1987,16384,24576,8192 +true,16,6,24,10,0.6835,16.4028,16384,24576,8192 +true,16,6,25,11,0.5254,16.8116,12288,24576,12288 +true,16,6,26,12,0.5508,17.6269,12288,23130,10842 +true,16,6,27,12,0.5899,18.8754,12288,21845,9557 +true,16,6,28,13,0.6477,20.7261,12288,19660,7372 +true,16,6,29,14,0.7172,22.9490,12288,17873,5585 +true,16,6,30,16,0.7546,24.1476,12288,16384,4096 +true,16,6,31,17,0.7592,24.2942,12288,16384,4096 +true,16,6,32,18,0.7680,24.5754,12288,16384,4096 +true,17,4,21,2,0.3491,8.3781,21845,65536,43691 +true,17,4,22,6,0.6219,14.9264,21845,37449,15604 +true,17,4,23,8,0.6732,16.1562,21845,32768,10923 +true,17,4,24,9,0.6792,16.2998,21845,32768,10923 +true,17,4,25,10,0.5176,16.5636,16384,32768,16384 +true,17,4,26,11,0.5351,17.1233,16384,30840,14456 +true,17,4,27,12,0.5676,18.1623,16384,29127,12743 +true,17,4,28,13,0.6222,19.9117,16384,27594,11210 +true,17,4,29,13,0.6832,21.8625,16384,24966,8582 +true,17,4,30,14,0.7436,23.7943,16384,22795,6411 +true,17,4,31,17,0.7565,24.2083,16384,21845,5461 +true,17,4,32,18,0.7626,24.4033,16384,21845,5461 +true,17,5,22,1,0.3458,8.2987,27306,81920,54614 +true,17,5,23,8,0.6715,16.1160,27306,40960,13654 +true,17,5,24,9,0.6758,16.2193,27306,40960,13654 +true,17,5,25,10,0.5142,16.4547,20480,40960,20480 +true,17,5,26,11,0.5287,16.9173,20480,40960,20480 +true,17,5,27,12,0.5570,17.8230,20480,38550,18070 +true,17,5,28,12,0.6051,19.3634,20480,34492,14012 +true,17,5,29,13,0.6623,21.1945,20480,31207,10727 +true,17,5,30,14,0.7273,23.2750,20480,28493,8013 +true,17,5,31,17,0.7554,24.1720,20480,27306,6826 +true,17,5,32,18,0.7611,24.3553,20480,27306,6826 +true,17,6,23,1,0.3443,8.2625,32768,98304,65536 +true,17,6,24,9,0.6749,16.1975,32768,49152,16384 +true,17,6,25,10,0.5126,16.4018,24576,49152,24576 +true,17,6,26,11,0.5253,16.8097,24576,49152,24576 +true,17,6,27,12,0.5508,17.6268,24576,46260,21684 +true,17,6,28,12,0.5898,18.8747,24576,43690,19114 +true,17,6,29,13,0.6477,20.7252,24576,39321,14745 +true,17,6,30,14,0.7171,22.9470,24576,35746,11170 +true,17,6,31,16,0.7546,24.1458,24576,32768,8192 +true,17,6,32,17,0.7591,24.2928,24576,32768,8192 +true,18,4,22,2,0.3491,8.3786,43690,131072,87382 +true,18,4,23,6,0.6220,14.9272,43690,74898,31208 +true,18,4,24,8,0.6732,16.1558,43690,65536,21846 +true,18,4,25,9,0.5093,16.2985,32768,65536,32768 +true,18,4,26,10,0.5176,16.5627,32768,65536,32768 +true,18,4,27,11,0.5351,17.1216,32768,61680,28912 +true,18,4,28,12,0.5675,18.1604,32768,58254,25486 +true,18,4,29,13,0.6222,19.9102,32768,55188,22420 +true,18,4,30,13,0.6832,21.8638,32768,49932,17164 +true,18,4,31,14,0.7436,23.7942,32768,45590,12822 +true,18,4,32,17,0.7564,24.2060,32768,43690,10922 +true,18,5,23,1,0.3458,8.2998,54613,163840,109227 +true,18,5,24,8,0.6715,16.1157,54613,81920,27307 +true,18,5,25,9,0.5068,16.2185,40960,81920,40960 +true,18,5,26,10,0.5142,16.4538,40960,81920,40960 +true,18,5,27,11,0.5286,16.9160,40960,81920,40960 +true,18,5,28,12,0.5569,17.8211,40960,77101,36141 +true,18,5,29,12,0.6052,19.3649,40960,68985,28025 +true,18,5,30,13,0.6624,21.1971,40960,62415,21455 +true,18,5,31,14,0.7274,23.2773,40960,56987,16027 +true,18,5,32,17,0.7553,24.1708,40960,54613,13653 +true,18,6,24,1,0.3443,8.2632,65536,196608,131072 +true,18,6,25,9,0.5062,16.1971,49152,98304,49152 +true,18,6,26,10,0.5125,16.4012,49152,98304,49152 +true,18,6,27,11,0.5253,16.8092,49152,98304,49152 +true,18,6,28,12,0.5508,17.6245,49152,92521,43369 +true,18,6,29,12,0.5899,18.8763,49152,87381,38229 +true,18,6,30,13,0.6477,20.7258,49152,78643,29491 +true,18,6,31,14,0.7171,22.9484,49152,71493,22341 +true,18,6,32,16,0.7545,24.1455,49152,65536,16384 diff --git a/optimal-gap-codes/src/main.rs b/optimal-gap-codes/src/main.rs index da4361b..fac87dc 100644 --- a/optimal-gap-codes/src/main.rs +++ b/optimal-gap-codes/src/main.rs @@ -68,12 +68,12 @@ impl CodesStats { /// Inserts a gap into the stats. pub fn insert(&mut self, gap: GapFragment, vbyte: bool) { // Register contribution to the total. - let unary_encoded_register = u64::from(gap.geometric) + 1; + let encoded_register = u64::from(gap.geometric) + 1; self.total += 1; for (log2_b, val) in self.rice.iter_mut().enumerate() { let mut rice_delta = - unary_encoded_register + (len_rice(gap.uniform, log2_b as _) as u64); + encoded_register + (len_rice(gap.uniform, log2_b as _) as u64); if vbyte { rice_delta = ceil(rice_delta, 8) * 8; } @@ -85,12 +85,12 @@ impl CodesStats { /// Removes the contribution of a gap from the stats. pub fn remove(&mut self, gap: GapFragment, vbyte: bool) { // Register contribution to the total. - let unary_encoded_register = u64::from(gap.geometric) + 1; + let encoded_register = u64::from(gap.geometric) + 1; self.total -= 1; for (log2_b, val) in self.rice.iter_mut().enumerate() { let mut rice_delta = - unary_encoded_register + (len_rice(gap.uniform, log2_b as _) as u64); + encoded_register + (len_rice(gap.uniform, log2_b as _) as u64); if vbyte { rice_delta = ceil(rice_delta, 8) * 8; } @@ -457,7 +457,7 @@ macro_rules! generate_optimal_gap_codes_for_precision { /// Procedural macro to generate the optimal_gap_codes function for the provided precisions. macro_rules! generate_optimal_gap_codes_for_precisions { ($multiprogress:ident, $($precision:ty),*) => { - let progress_bar = $multiprogress.add(ProgressBar::new(18-4)); + let progress_bar = $multiprogress.add(ProgressBar::new(15)); progress_bar.set_style( ProgressStyle::default_bar() diff --git a/src/composite_hash/gaps.rs b/src/composite_hash/gaps.rs index 22b7f73..9639e2f 100644 --- a/src/composite_hash/gaps.rs +++ b/src/composite_hash/gaps.rs @@ -37,8 +37,8 @@ impl GapHash { ) -> GapFragment { assert!(previous_hash > hash_to_encode); - let previous_fragment = SwitchHash::::split_hash(previous_hash, hash_bits); - let fragment_to_encode = SwitchHash::::split_hash(hash_to_encode, hash_bits); + let previous_fragment = SwitchHash::::scompose_hash(previous_hash, hash_bits); + let fragment_to_encode = SwitchHash::::scompose_hash(hash_to_encode, hash_bits); debug_assert!( previous_fragment.index >= fragment_to_encode.index, @@ -55,45 +55,51 @@ impl GapHash { fragment_to_encode.register ); - // The uniform portion of the hash is composed by the index and the hash remainder. - let previous_uniform = previous_fragment.uniform(hash_bits); - let to_encode_uniform = fragment_to_encode.uniform(hash_bits); - - // The geometric portion of the hash is composed by the difference between the registers - // when the indices are equal, otherwise it is the fragment to encode register itself. - let geometric = if previous_fragment.index == fragment_to_encode.index { - if previous_fragment.hash_remainder <= fragment_to_encode.hash_remainder { - // If the previous hash (which MUST be larger than the current) has an identical - // index and a smaller or equal hash remainder, the register difference must be - // what makes the previous hash larger. Therefore, we know that these registers - // must differ by at least 1. - assert!( - previous_fragment.register > fragment_to_encode.register, - "The previous register ({}) must be greater than the second register ({}), having hashes {} and {}, indices {} and {} and hash remainder {} and {}", - previous_fragment.register, - fragment_to_encode.register, - previous_hash, - hash_to_encode, - previous_fragment.index, - fragment_to_encode.index, - previous_fragment.hash_remainder, - fragment_to_encode.hash_remainder - ); + // When P::EXPONENT + B::NUMBER_OF_BITS == hash_bits, there is absolutely + // no hash remainder to include in the uniform portion of the hash, as that + // part of the hash is solely composed of the index. + if P::EXPONENT + B::NUMBER_OF_BITS == hash_bits { + let uniform = u64::try_from(previous_fragment.index - fragment_to_encode.index).unwrap(); + + let geometric = if previous_fragment.index == fragment_to_encode.index { previous_fragment.register - fragment_to_encode.register - 1 } else { - previous_fragment.register - fragment_to_encode.register + fragment_to_encode.register - 1 + }; + + GapFragment { + uniform, + geometric } } else { - fragment_to_encode.register - 1 - }; + // The uniform portion of the hash is composed by the index and the hash remainder. + let previous_uniform = previous_fragment.uniform(hash_bits); + let to_encode_uniform = fragment_to_encode.uniform(hash_bits); + + // The geometric portion of the hash is composed by the difference between the registers + // when the indices are equal, otherwise it is the fragment to encode register itself. + let geometric = if previous_fragment.index == fragment_to_encode.index { + if previous_fragment.hash_remainder <= fragment_to_encode.hash_remainder { + // Since hashes must be strictly in descending order, and the indices are equal, + // and the previous hash remainder is equal or less than the hash remainder to encode, + // we can safely assume that the previous register is strictly greater than the register to encode. + previous_fragment.register - fragment_to_encode.register - 1 + } else { + // Otherwise, the previous register may be equal or greater to the register to encode. + previous_fragment.register - fragment_to_encode.register + } + } else { + fragment_to_encode.register - 1 + }; - let uniform = if previous_uniform > to_encode_uniform { - ((previous_uniform - to_encode_uniform) << 1) - 1 - } else { - (to_encode_uniform - previous_uniform) << 1 - }; + let uniform = if previous_uniform > to_encode_uniform { + ((previous_uniform - to_encode_uniform) << 1) - 1 + } else { + (to_encode_uniform - previous_uniform) << 1 + }; + GapFragment { uniform, geometric } + } - GapFragment { uniform, geometric } } #[inline] @@ -102,26 +108,101 @@ impl GapHash { previous_hash: u64, hash_bits: u8, ) -> u64 { - let previous_fragment = SwitchHash::::split_hash(previous_hash, hash_bits); + let previous_fragment = SwitchHash::::scompose_hash(previous_hash, hash_bits); + + // When P::EXPONENT + B::NUMBER_OF_BITS == hash_bits, there is absolutely + // no hash remainder to include in the uniform portion of the hash, as that + // part of the hash is solely composed of the index. + if P::EXPONENT + B::NUMBER_OF_BITS == hash_bits { + let to_decode_index = previous_fragment.index - usize::try_from(fragment.uniform).unwrap(); + let register = if previous_fragment.index == to_decode_index { + previous_fragment.register - fragment.geometric - 1 + } else { + fragment.geometric + 1 + }; + + return SwitchHash::::compose_hash(to_decode_index, register, 0, hash_bits); + } + let previous_uniform = previous_fragment.uniform(hash_bits); let to_decode_uniform = if fragment.uniform & 1 == 0 { - previous_uniform - (fragment.uniform >> 1) + previous_uniform + (fragment.uniform >> 1) } else { - previous_uniform + (fragment.uniform >> 1) + 1 + previous_uniform - ((fragment.uniform >> 1) + 1) }; - let (to_decode_index, to_decode_hash_remainder) = HashFragment::::scompose_uniform(to_decode_uniform, hash_bits); - let to_decode_register = if to_decode_index == previous_fragment.index { - previous_fragment.register - fragment.geometric + let to_decode_register = if previous_fragment.index == to_decode_index { + if previous_fragment.hash_remainder <= to_decode_hash_remainder { + previous_fragment.register - fragment.geometric - 1 + } else { + previous_fragment.register - fragment.geometric + } } else { fragment.geometric + 1 }; SwitchHash::::compose_hash(to_decode_index, to_decode_register, to_decode_hash_remainder, hash_bits) } +} + +#[cfg(test)] +mod test_compose_scompose_gap { + use crate::prelude::*; + use crate::utils::iter_random_values; + use hyperloglog_derive::test_precisions_and_bits; + + use super::*; + + #[test_precisions_and_bits] + fn test_compose_scompose_gap() + where + P: ArrayRegister, + { + for (first, second) in iter_random_values::(10_000, None, None).zip(iter_random_values::(10_000, None, Some(675_398_754_524_577))) { + let (first_index, first_register, first_original_hash) = + >::Packed>>::index_and_register_and_hash( + &first, + ); + let (second_index, second_register, second_original_hash) = + >::Packed>>::index_and_register_and_hash( + &second, + ); + for hash_bits in SwitchHash::::SMALLEST_VIABLE_HASH_BITS + ..=SwitchHash::::LARGEST_VIABLE_HASH_BITS + { + let first_encoded_hash = + SwitchHash::::encode(first_index, first_register, first_original_hash, hash_bits); + let second_encoded_hash = SwitchHash::::encode( + second_index, + second_register, + second_original_hash, + hash_bits, + ); + + // We for happenstance the two hashes are identical, which may happen while testing + // lots of cases expecially for small hash sizes, we skip the test. + if first_encoded_hash == second_encoded_hash { + continue; + } + + let (smaller, larger) = if first_encoded_hash < second_encoded_hash { + (first_encoded_hash, second_encoded_hash) + } else { + (second_encoded_hash, first_encoded_hash) + }; + + let fragment = GapHash::::into_gap_fragment(larger, smaller, hash_bits); + let decoded_hash = GapHash::::from_gap_fragment(fragment, larger, hash_bits); + + assert_eq!(smaller, decoded_hash); + } + } + } +} +impl GapHash { /// Returns whether the hashes are currently to be considered prefix-free-encoded. #[inline] #[must_use] diff --git a/src/composite_hash/gaps/optimal_codes.rs b/src/composite_hash/gaps/optimal_codes.rs index 3375131..ade78ba 100644 --- a/src/composite_hash/gaps/optimal_codes.rs +++ b/src/composite_hash/gaps/optimal_codes.rs @@ -2,132 +2,143 @@ /// The optimal Rice code coefficients for the different precisions and bit sizes, when using byte padding for the hash. pub(super) const OPTIMAL_VBYTE_RICE_COEFFICIENTS: [[&[u8]; 3]; 15] = [ [&[], &[1u8], &[1u8]], - [&[2u8, 3u8, 4u8], &[2u8, 4u8, 4u8], &[1u8, 5u8]], - [&[2u8, 3u8, 4u8, 4u8], &[2u8, 4u8, 4u8, 5u8], &[1u8, 4u8, 5u8, 5u8]], - [&[2u8, 3u8, 4u8, 5u8, 5u8], &[2u8, 4u8, 4u8, 5u8, 6u8], &[1u8, 4u8, 5u8, 5u8]], + [&[1u8], &[1u8], &[1u8]], + [&[1u8], &[1u8], &[1u8]], + [&[1u8, 5u8], &[1u8], &[1u8]], [ - &[2u8, 3u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8], - &[2u8, 4u8, 4u8, 5u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8], - &[1u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8], + &[1u8, 5u8, 11u8, 12u8, 13u8, 13u8], + &[1u8, 11u8, 12u8, 12u8, 13u8], + &[1u8, 11u8, 11u8, 12u8, 13u8], ], [ - &[2u8, 3u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8], - &[2u8, 4u8, 4u8, 5u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8, 12u8], - &[1u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8, 12u8, 12u8], + &[1u8, 6u8, 10u8, 11u8, 12u8, 13u8, 13u8, 14u8], + &[1u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8], + &[1u8, 10u8, 11u8, 11u8, 12u8, 13u8, 14u8], ], [ - &[2u8, 3u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8, 12u8, 12u8], - &[2u8, 4u8, 4u8, 5u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8], - &[1u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8, 12u8], + &[1u8, 6u8, 9u8, 10u8, 11u8, 12u8, 13u8, 13u8, 14u8], + &[1u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8], + &[1u8, 9u8, 10u8, 11u8, 11u8, 12u8, 13u8, 14u8], ], [ - &[2u8, 3u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8, 12u8], - &[2u8, 4u8, 4u8, 5u8, 6u8, 8u8, 9u8, 10u8, 11u8], - &[1u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8], + &[1u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 13u8, 14u8], + &[1u8, 8u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8], + &[1u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8], ], [ - &[2u8, 3u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8], - &[2u8, 4u8, 4u8, 5u8, 6u8, 8u8, 9u8, 10u8], - &[2u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8], + &[2u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 13u8], + &[1u8, 8u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8], + &[1u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8], ], [ - &[2u8, 3u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8], - &[2u8, 4u8, 4u8, 5u8, 6u8, 8u8, 9u8], - &[2u8, 4u8, 5u8, 6u8, 6u8, 9u8], + &[2u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8], + &[1u8, 8u8, 9u8, 10u8, 11u8, 12u8, 12u8], + &[1u8, 9u8, 10u8, 11u8, 12u8, 12u8], ], [ - &[2u8, 3u8, 4u8, 5u8, 5u8, 6u8, 9u8], - &[2u8, 4u8, 4u8, 5u8, 6u8, 8u8], - &[2u8, 4u8, 5u8, 6u8, 6u8], + &[2u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8], + &[1u8, 8u8, 9u8, 10u8, 11u8, 12u8], + &[1u8, 9u8, 10u8, 11u8, 12u8], ], [ - &[2u8, 3u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8, 16u8], - &[2u8, 4u8, 4u8, 5u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8], - &[2u8, 4u8, 5u8, 6u8, 6u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8], + &[ + 2u8, + 6u8, + 8u8, + 9u8, + 10u8, + 11u8, + 12u8, + 13u8, + 13u8, + 14u8, + 17u8, + 18u8, + 19u8, + 20u8, + ], + &[1u8, 8u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8, 17u8, 18u8, 19u8, 19u8], + &[1u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8, 16u8, 17u8, 18u8, 19u8], ], [ - &[2u8, 3u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8], - &[2u8, 4u8, 4u8, 5u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8], - &[2u8, 4u8, 5u8, 6u8, 6u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8], + &[2u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 13u8, 14u8, 17u8, 18u8, 19u8], + &[1u8, 8u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8, 17u8, 18u8, 19u8], + &[1u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8, 16u8, 17u8, 18u8], ], [ - &[2u8, 3u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8], - &[2u8, 4u8, 4u8, 5u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8, 12u8], - &[2u8, 4u8, 5u8, 6u8, 6u8, 9u8, 10u8, 11u8, 12u8, 12u8], + &[2u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 13u8, 14u8, 17u8, 18u8], + &[1u8, 8u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8, 17u8, 18u8], + &[1u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8, 16u8, 17u8], ], [ - &[2u8, 3u8, 4u8, 5u8, 5u8, 6u8, 9u8, 10u8, 11u8, 12u8, 12u8], - &[2u8, 4u8, 4u8, 5u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8], - &[2u8, 4u8, 5u8, 6u8, 6u8, 9u8, 10u8, 11u8, 12u8], + &[2u8, 6u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 13u8, 14u8, 17u8], + &[1u8, 8u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8, 17u8], + &[1u8, 9u8, 10u8, 11u8, 12u8, 12u8, 13u8, 14u8, 16u8], ], ]; /// The optimal Rice code coefficients for the different precisions and bit sizes, when using hash-packing. pub(super) const OPTIMAL_RICE_COEFFICIENTS: [[&[u8]; 3]; 15] = [ - [&[0u8], &[0u8, 4u8, 5u8], &[0u8, 5u8]], + [&[0u8], &[0u8], &[0u8]], + [&[0u8, 5u8, 7u8], &[0u8, 6u8, 7u8], &[0u8, 7u8]], + [&[0u8, 6u8, 7u8, 8u8, 9u8], &[0u8, 6u8, 8u8, 9u8], &[0u8, 7u8, 8u8, 10u8]], [ - &[1u8, 2u8, 3u8, 4u8, 5u8, 6u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8], - &[0u8, 5u8, 6u8, 7u8, 8u8], + &[0u8, 6u8, 7u8, 8u8, 9u8, 10u8], + &[0u8, 7u8, 8u8, 9u8, 10u8], + &[0u8, 7u8, 8u8, 10u8], ], [ - &[1u8, 2u8, 3u8, 4u8, 6u8, 7u8, 8u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8], - &[0u8, 4u8, 5u8, 6u8, 7u8], + &[0u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 14u8, 15u8, 16u8, 17u8, 18u8], + &[0u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8, 16u8, 18u8], + &[0u8, 7u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8, 16u8, 17u8], ], - [&[1u8, 2u8, 3u8, 5u8, 6u8, 7u8], &[0u8, 3u8, 4u8, 5u8, 6u8], &[0u8, 4u8, 5u8, 6u8]], [ - &[1u8, 2u8, 3u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8], - &[0u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8], + &[0u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 14u8, 15u8, 16u8, 17u8], + &[0u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8, 16u8], + &[0u8, 7u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8, 16u8], ], [ - &[1u8, 2u8, 3u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8], - &[0u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8], + &[0u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 13u8, 14u8, 15u8, 16u8], + &[0u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8], + &[0u8, 7u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8], ], [ - &[1u8, 2u8, 3u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8], - &[0u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8], + &[0u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 13u8, 14u8, 15u8], + &[0u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8], + &[0u8, 7u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8], ], [ - &[1u8, 2u8, 3u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8], - &[0u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8], + &[0u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 13u8, 14u8], + &[0u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8], + &[0u8, 7u8, 9u8, 10u8, 11u8, 12u8, 13u8], ], [ - &[1u8, 2u8, 3u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8], - &[0u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8], + &[0u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 13u8], + &[0u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8], + &[0u8, 7u8, 9u8, 10u8, 11u8, 12u8], ], [ - &[1u8, 2u8, 3u8, 5u8, 6u8, 7u8, 8u8, 9u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8, 8u8], - &[0u8, 4u8, 5u8, 6u8, 7u8, 8u8], + &[0u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8], + &[0u8, 7u8, 8u8, 9u8, 10u8, 11u8], + &[0u8, 7u8, 9u8, 10u8, 11u8], ], [ - &[1u8, 2u8, 3u8, 5u8, 6u8, 7u8, 8u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8], - &[0u8, 4u8, 5u8, 6u8, 7u8], + &[0u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 13u8, 14u8, 15u8, 16u8, 17u8, 18u8, 19u8], + &[0u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8, 16u8, 18u8, 19u8], + &[0u8, 7u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8, 16u8, 17u8, 18u8], ], [ - &[1u8, 2u8, 3u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 15u8], - &[0u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8], + &[0u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 13u8, 14u8, 15u8, 16u8, 17u8, 18u8], + &[0u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8, 16u8, 18u8], + &[0u8, 7u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8, 16u8, 17u8], ], [ - &[1u8, 2u8, 3u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8], - &[0u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8], + &[0u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 13u8, 14u8, 15u8, 16u8, 17u8], + &[0u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8, 16u8], + &[0u8, 7u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8, 16u8], ], [ - &[1u8, 2u8, 3u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8], - &[0u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8], - ], - [ - &[1u8, 2u8, 3u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8], - &[0u8, 3u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8], - &[0u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8], + &[0u8, 6u8, 7u8, 8u8, 9u8, 10u8, 11u8, 13u8, 14u8, 15u8, 16u8], + &[0u8, 7u8, 8u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8], + &[0u8, 7u8, 9u8, 10u8, 11u8, 12u8, 13u8, 14u8, 15u8], ], ]; diff --git a/src/composite_hash/switch.rs b/src/composite_hash/switch.rs index f3a7fd7..720bcd0 100644 --- a/src/composite_hash/switch.rs +++ b/src/composite_hash/switch.rs @@ -31,7 +31,7 @@ impl HashFragment { if hash_bits == P::EXPONENT + B::NUMBER_OF_BITS { return 0; } - hash_bits - 1 - P::EXPONENT - B::NUMBER_OF_BITS + hash_bits - 1 - P::EXPONENT } fn restored_hash(&self, hash_bits: u8) -> u64 { @@ -47,10 +47,7 @@ impl HashFragment { | u64::from(self.hash_remainder) } - pub(super) fn scompose_uniform( - uniform: u64, - hash_bits: u8, - ) -> (usize, u16) { + pub(super) fn scompose_uniform(uniform: u64, hash_bits: u8) -> (usize, u16) { let remainder_size = Self::hash_remainder_size(hash_bits); let index = usize::try_from(uniform >> remainder_size).unwrap(); let hash_remainder = u16::try_from(uniform & ((1 << remainder_size) - 1)).unwrap(); @@ -60,7 +57,7 @@ impl HashFragment { impl SwitchHash { /// Returns the provided SwitchHash splitted into its components. - pub(super) fn split_hash(hash: u64, hash_bits: u8) -> HashFragment { + pub(super) fn scompose_hash(hash: u64, hash_bits: u8) -> HashFragment { // We extract the index from the leftmost bits of the hash. let index = usize::try_from(hash >> (hash_bits - P::EXPONENT)).unwrap(); @@ -117,7 +114,12 @@ impl SwitchHash { } } - pub(super) fn compose_hash(index: usize, register: u8, hash_remainder: u16, hash_bits: u8) -> u64 { + pub(super) fn compose_hash( + index: usize, + register: u8, + hash_remainder: u16, + hash_bits: u8, + ) -> u64 { let mut hash = u64::try_from(index << (hash_bits - P::EXPONENT)).unwrap(); if P::EXPONENT + B::NUMBER_OF_BITS == hash_bits { @@ -130,16 +132,61 @@ impl SwitchHash { hash |= u64::from(hash_remainder); hash |= 1 << (hash_bits - P::EXPONENT - 1); } else { - let shift = P::EXPONENT + 1 + (64 - hash_bits); - let restored_hash = !(u64::from(hash_remainder) << shift) >> shift; - - hash |= u64::from(restored_hash); + hash |= u64::from(hash_remainder); } hash } } +#[cfg(test)] +mod test_compose_scompose_hash { + use crate::prelude::*; + use crate::utils::iter_random_values; + use hyperloglog_derive::test_precisions_and_bits; + + use super::*; + + #[test_precisions_and_bits] + fn test_compose_scompose_hash() + where + P: ArrayRegister, + { + for value in iter_random_values::(10_000, None, None) { + let (index, register, original_hash) = + >::Packed>>::index_and_register_and_hash( + &value, + ); + for hash_bits in SwitchHash::::SMALLEST_VIABLE_HASH_BITS + ..=SwitchHash::::LARGEST_VIABLE_HASH_BITS + { + let encoded_hash = + SwitchHash::::encode(index, register, original_hash, hash_bits); + + let fragment = SwitchHash::::scompose_hash(encoded_hash, hash_bits); + + assert_eq!(fragment.index, index); + assert_eq!(fragment.register, register); + + let uniform = fragment.uniform(hash_bits); + + let scompose_uniform = HashFragment::::scompose_uniform(uniform, hash_bits); + assert_eq!(scompose_uniform.0, index); + assert_eq!(scompose_uniform.1, fragment.hash_remainder); + + let recomposed_hash = SwitchHash::::compose_hash( + index, + register, + fragment.hash_remainder, + hash_bits, + ); + + assert_eq!(recomposed_hash, encoded_hash); + } + } + } +} + fn flag(hash: u64, hash_bits: u8) -> bool { ((hash >> (hash_bits - P::EXPONENT - 1)) & 1) == 1 } @@ -328,7 +375,7 @@ impl CompositeHash for SwitchHash { unreachable!("The hash is already at the lowest precision, you cannot shift it down by {shift} bits."); } - let fragmented = Self::split_hash(hash, hash_bits); + let fragmented = Self::scompose_hash(hash, hash_bits); if fragmented.register_flag() { // If the register is stored explicitly, we can shift the hash to the right @@ -463,7 +510,7 @@ impl CompositeHash for SwitchHash { hash.leading_zeros(), ); - let fragmented = Self::split_hash(hash, hash_bits); + let fragmented = Self::scompose_hash(hash, hash_bits); debug_assert!( fragmented.index < 1 << Self::Precision::EXPONENT,