#include "sbignum-tables.h"
#include "sbignum.h"

/* maps a number to a char */
char *cset = "0123456789abcdefghijklmnopqrstuvwxyz";

/* maps a char to a number */
int8_t r_cset[256] = {
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1, 
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
	-1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, 
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
};

/* bitstable[n] is the number of set bits
 * in the number 'n' */
int8_t bitstable[256] = {
	0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 
	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 
	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 
	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 
	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 
	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 
	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 
	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 
	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 
	4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, 
};

/* basetable[b] = number of digits needed to convert
 * an mpz atom in base 'b' */
#if ATOMBYTES == 1
double basetable[37] = {
	0, /* unused */
	0, /* unused */
	8.000000, /* (log of 2 in base 256) */
	5.047438, /* (log of 3 in base 256) */
	4.000000, /* (log of 4 in base 256) */
	3.445412, /* (log of 5 in base 256) */
	3.094822, /* (log of 6 in base 256) */
	2.849657, /* (log of 7 in base 256) */
	2.666667, /* (log of 8 in base 256) */
	2.523719, /* (log of 9 in base 256) */
	2.408240, /* (log of 10 in base 256) */
	2.312519, /* (log of 11 in base 256) */
	2.231544, /* (log of 12 in base 256) */
	2.161905, /* (log of 13 in base 256) */
	2.101196, /* (log of 14 in base 256) */
	2.047664, /* (log of 15 in base 256) */
	2.000000, /* (log of 16 in base 256) */
	1.957204, /* (log of 17 in base 256) */
	1.918500, /* (log of 18 in base 256) */
	1.883271, /* (log of 19 in base 256) */
	1.851026, /* (log of 20 in base 256) */
	1.821362, /* (log of 21 in base 256) */
	1.793951, /* (log of 22 in base 256) */
	1.768518, /* (log of 23 in base 256) */
	1.744834, /* (log of 24 in base 256) */
	1.722706, /* (log of 25 in base 256) */
	1.701968, /* (log of 26 in base 256) */
	1.682479, /* (log of 27 in base 256) */
	1.664117, /* (log of 28 in base 256) */
	1.646775, /* (log of 29 in base 256) */
	1.630360, /* (log of 30 in base 256) */
	1.614793, /* (log of 31 in base 256) */
	1.600000, /* (log of 32 in base 256) */
	1.585919, /* (log of 33 in base 256) */
	1.572493, /* (log of 34 in base 256) */
	1.559672, /* (log of 35 in base 256) */
	1.547411, /* (log of 36 in base 256) */
};
#endif

#if ATOMBYTES == 2
double basetable[37] = {
	0, /* unused */
	0, /* unused */
	16.000000, /* (log of 2 in base 65536) */
	10.094876, /* (log of 3 in base 65536) */
	8.000000, /* (log of 4 in base 65536) */
	6.890825, /* (log of 5 in base 65536) */
	6.189645, /* (log of 6 in base 65536) */
	5.699315, /* (log of 7 in base 65536) */
	5.333333, /* (log of 8 in base 65536) */
	5.047438, /* (log of 9 in base 65536) */
	4.816480, /* (log of 10 in base 65536) */
	4.625037, /* (log of 11 in base 65536) */
	4.463087, /* (log of 12 in base 65536) */
	4.323810, /* (log of 13 in base 65536) */
	4.202393, /* (log of 14 in base 65536) */
	4.095328, /* (log of 15 in base 65536) */
	4.000000, /* (log of 16 in base 65536) */
	3.914409, /* (log of 17 in base 65536) */
	3.836999, /* (log of 18 in base 65536) */
	3.766543, /* (log of 19 in base 65536) */
	3.702051, /* (log of 20 in base 65536) */
	3.642724, /* (log of 21 in base 65536) */
	3.587901, /* (log of 22 in base 65536) */
	3.537036, /* (log of 23 in base 65536) */
	3.489669, /* (log of 24 in base 65536) */
	3.445412, /* (log of 25 in base 65536) */
	3.403937, /* (log of 26 in base 65536) */
	3.364959, /* (log of 27 in base 65536) */
	3.328234, /* (log of 28 in base 65536) */
	3.293549, /* (log of 29 in base 65536) */
	3.260721, /* (log of 30 in base 65536) */
	3.229585, /* (log of 31 in base 65536) */
	3.200000, /* (log of 32 in base 65536) */
	3.171838, /* (log of 33 in base 65536) */
	3.144986, /* (log of 34 in base 65536) */
	3.119344, /* (log of 35 in base 65536) */
	3.094822, /* (log of 36 in base 65536) */
};
#endif

#if ATOMBYTES == 4
double basetable[37] = {
	0, /* unused */
	0, /* unused */
	32.000000, /* (log of 2 in base 4294967296) */
	20.189752, /* (log of 3 in base 4294967296) */
	16.000000, /* (log of 4 in base 4294967296) */
	13.781650, /* (log of 5 in base 4294967296) */
	12.379290, /* (log of 6 in base 4294967296) */
	11.398630, /* (log of 7 in base 4294967296) */
	10.666667, /* (log of 8 in base 4294967296) */
	10.094876, /* (log of 9 in base 4294967296) */
	9.632960, /* (log of 10 in base 4294967296) */
	9.250074, /* (log of 11 in base 4294967296) */
	8.926174, /* (log of 12 in base 4294967296) */
	8.647621, /* (log of 13 in base 4294967296) */
	8.404785, /* (log of 14 in base 4294967296) */
	8.190657, /* (log of 15 in base 4294967296) */
	8.000000, /* (log of 16 in base 4294967296) */
	7.828817, /* (log of 17 in base 4294967296) */
	7.673999, /* (log of 18 in base 4294967296) */
	7.533085, /* (log of 19 in base 4294967296) */
	7.404103, /* (log of 20 in base 4294967296) */
	7.285448, /* (log of 21 in base 4294967296) */
	7.175802, /* (log of 22 in base 4294967296) */
	7.074071, /* (log of 23 in base 4294967296) */
	6.979337, /* (log of 24 in base 4294967296) */
	6.890825, /* (log of 25 in base 4294967296) */
	6.807874, /* (log of 26 in base 4294967296) */
	6.729917, /* (log of 27 in base 4294967296) */
	6.656467, /* (log of 28 in base 4294967296) */
	6.587099, /* (log of 29 in base 4294967296) */
	6.521442, /* (log of 30 in base 4294967296) */
	6.459171, /* (log of 31 in base 4294967296) */
	6.400000, /* (log of 32 in base 4294967296) */
	6.343676, /* (log of 33 in base 4294967296) */
	6.289972, /* (log of 34 in base 4294967296) */
	6.238689, /* (log of 35 in base 4294967296) */
	6.189645, /* (log of 36 in base 4294967296) */
};
#endif

/* basepowtable[b] = the first column is the biggest power of 'b'
 * that fits in mpz_atom_t, the second column is the exponent
 * 'e' so that b^e = the value of the first column */
#if ATOMBYTES == 1
struct sbn_basepow basepowtable[37] = {
	{0,0}, /* unused */
	{0,0}, /* unused */
	{128U, 7U}, /* floor(log of 2 in base 255) */
	{243U, 5U}, /* floor(log of 3 in base 255) */
	{64U, 3U}, /* floor(log of 4 in base 255) */
	{125U, 3U}, /* floor(log of 5 in base 255) */
	{216U, 3U}, /* floor(log of 6 in base 255) */
	{49U, 2U}, /* floor(log of 7 in base 255) */
	{64U, 2U}, /* floor(log of 8 in base 255) */
	{81U, 2U}, /* floor(log of 9 in base 255) */
	{100U, 2U}, /* floor(log of 10 in base 255) */
	{121U, 2U}, /* floor(log of 11 in base 255) */
	{144U, 2U}, /* floor(log of 12 in base 255) */
	{169U, 2U}, /* floor(log of 13 in base 255) */
	{196U, 2U}, /* floor(log of 14 in base 255) */
	{225U, 2U}, /* floor(log of 15 in base 255) */
	{16U, 1U}, /* floor(log of 16 in base 255) */
	{17U, 1U}, /* floor(log of 17 in base 255) */
	{18U, 1U}, /* floor(log of 18 in base 255) */
	{19U, 1U}, /* floor(log of 19 in base 255) */
	{20U, 1U}, /* floor(log of 20 in base 255) */
	{21U, 1U}, /* floor(log of 21 in base 255) */
	{22U, 1U}, /* floor(log of 22 in base 255) */
	{23U, 1U}, /* floor(log of 23 in base 255) */
	{24U, 1U}, /* floor(log of 24 in base 255) */
	{25U, 1U}, /* floor(log of 25 in base 255) */
	{26U, 1U}, /* floor(log of 26 in base 255) */
	{27U, 1U}, /* floor(log of 27 in base 255) */
	{28U, 1U}, /* floor(log of 28 in base 255) */
	{29U, 1U}, /* floor(log of 29 in base 255) */
	{30U, 1U}, /* floor(log of 30 in base 255) */
	{31U, 1U}, /* floor(log of 31 in base 255) */
	{32U, 1U}, /* floor(log of 32 in base 255) */
	{33U, 1U}, /* floor(log of 33 in base 255) */
	{34U, 1U}, /* floor(log of 34 in base 255) */
	{35U, 1U}, /* floor(log of 35 in base 255) */
	{36U, 1U}, /* floor(log of 36 in base 255) */
};
#endif

#if ATOMBYTES == 2
struct sbn_basepow basepowtable[37] = {
	{0,0}, /* unused */
	{0,0}, /* unused */
	{32768U, 15U}, /* floor(log of 2 in base 65535) */
	{59049U, 10U}, /* floor(log of 3 in base 65535) */
	{16384U, 7U}, /* floor(log of 4 in base 65535) */
	{15625U, 6U}, /* floor(log of 5 in base 65535) */
	{46656U, 6U}, /* floor(log of 6 in base 65535) */
	{16807U, 5U}, /* floor(log of 7 in base 65535) */
	{32768U, 5U}, /* floor(log of 8 in base 65535) */
	{59049U, 5U}, /* floor(log of 9 in base 65535) */
	{10000U, 4U}, /* floor(log of 10 in base 65535) */
	{14641U, 4U}, /* floor(log of 11 in base 65535) */
	{20736U, 4U}, /* floor(log of 12 in base 65535) */
	{28561U, 4U}, /* floor(log of 13 in base 65535) */
	{38416U, 4U}, /* floor(log of 14 in base 65535) */
	{50625U, 4U}, /* floor(log of 15 in base 65535) */
	{4096U, 3U}, /* floor(log of 16 in base 65535) */
	{4913U, 3U}, /* floor(log of 17 in base 65535) */
	{5832U, 3U}, /* floor(log of 18 in base 65535) */
	{6859U, 3U}, /* floor(log of 19 in base 65535) */
	{8000U, 3U}, /* floor(log of 20 in base 65535) */
	{9261U, 3U}, /* floor(log of 21 in base 65535) */
	{10648U, 3U}, /* floor(log of 22 in base 65535) */
	{12167U, 3U}, /* floor(log of 23 in base 65535) */
	{13824U, 3U}, /* floor(log of 24 in base 65535) */
	{15625U, 3U}, /* floor(log of 25 in base 65535) */
	{17576U, 3U}, /* floor(log of 26 in base 65535) */
	{19683U, 3U}, /* floor(log of 27 in base 65535) */
	{21952U, 3U}, /* floor(log of 28 in base 65535) */
	{24389U, 3U}, /* floor(log of 29 in base 65535) */
	{27000U, 3U}, /* floor(log of 30 in base 65535) */
	{29791U, 3U}, /* floor(log of 31 in base 65535) */
	{32768U, 3U}, /* floor(log of 32 in base 65535) */
	{35937U, 3U}, /* floor(log of 33 in base 65535) */
	{39304U, 3U}, /* floor(log of 34 in base 65535) */
	{42875U, 3U}, /* floor(log of 35 in base 65535) */
	{46656U, 3U}, /* floor(log of 36 in base 65535) */
};
#endif

#if ATOMBYTES == 4
struct sbn_basepow basepowtable[37] = {
	{0,0}, /* unused */
	{0,0}, /* unused */
	{2147483648U, 31U}, /* floor(log of 2 in base 4294967295) */
	{3486784401U, 20U}, /* floor(log of 3 in base 4294967295) */
	{1073741824U, 15U}, /* floor(log of 4 in base 4294967295) */
	{1220703125U, 13U}, /* floor(log of 5 in base 4294967295) */
	{2176782336U, 12U}, /* floor(log of 6 in base 4294967295) */
	{1977326743U, 11U}, /* floor(log of 7 in base 4294967295) */
	{1073741824U, 10U}, /* floor(log of 8 in base 4294967295) */
	{3486784401U, 10U}, /* floor(log of 9 in base 4294967295) */
	{1000000000U, 9U}, /* floor(log of 10 in base 4294967295) */
	{2357947691U, 9U}, /* floor(log of 11 in base 4294967295) */
	{429981696U, 8U}, /* floor(log of 12 in base 4294967295) */
	{815730721U, 8U}, /* floor(log of 13 in base 4294967295) */
	{1475789056U, 8U}, /* floor(log of 14 in base 4294967295) */
	{2562890625U, 8U}, /* floor(log of 15 in base 4294967295) */
	{268435456U, 7U}, /* floor(log of 16 in base 4294967295) */
	{410338673U, 7U}, /* floor(log of 17 in base 4294967295) */
	{612220032U, 7U}, /* floor(log of 18 in base 4294967295) */
	{893871739U, 7U}, /* floor(log of 19 in base 4294967295) */
	{1280000000U, 7U}, /* floor(log of 20 in base 4294967295) */
	{1801088541U, 7U}, /* floor(log of 21 in base 4294967295) */
	{2494357888U, 7U}, /* floor(log of 22 in base 4294967295) */
	{3404825447U, 7U}, /* floor(log of 23 in base 4294967295) */
	{191102976U, 6U}, /* floor(log of 24 in base 4294967295) */
	{244140625U, 6U}, /* floor(log of 25 in base 4294967295) */
	{308915776U, 6U}, /* floor(log of 26 in base 4294967295) */
	{387420489U, 6U}, /* floor(log of 27 in base 4294967295) */
	{481890304U, 6U}, /* floor(log of 28 in base 4294967295) */
	{594823321U, 6U}, /* floor(log of 29 in base 4294967295) */
	{729000000U, 6U}, /* floor(log of 30 in base 4294967295) */
	{887503681U, 6U}, /* floor(log of 31 in base 4294967295) */
	{1073741824U, 6U}, /* floor(log of 32 in base 4294967295) */
	{1291467969U, 6U}, /* floor(log of 33 in base 4294967295) */
	{1544804416U, 6U}, /* floor(log of 34 in base 4294967295) */
	{1838265625U, 6U}, /* floor(log of 35 in base 4294967295) */
	{2176782336U, 6U}, /* floor(log of 36 in base 4294967295) */
};
#endif



syntax highlighted by Code2HTML, v. 0.9.1