1pub const ALT_TABLE_FLAG: u16 = 0x8000;
6
7pub fn generate_log_table(small: &[[u8; 10]; 90], small_alt: &[[u8; 10]; 10]) -> [[u16; 10]; 90] {
18 let mut table = [[0u16; 10]; 90];
19 for (row, table_row) in table.iter_mut().enumerate() {
20 for (col, entry) in table_row.iter_mut().enumerate() {
21 let n = ((10 + row) * 100 + col * 10) as f64;
22 let base = ((n.log10() - 3.0) * 10000.0).round() as u16;
23 let needs_alt = row < 10 && small[row][col] != small_alt[row][col];
24 *entry = if needs_alt {
25 base | ALT_TABLE_FLAG
26 } else {
27 base
28 };
29 }
30 }
31 table
32}
33
34pub fn generate_log_table_small() -> [[u8; 10]; 90] {
40 let mut table = [[0u8; 10]; 90];
41 for (row, table_row) in table.iter_mut().enumerate() {
42 let base_n = (10 + row) * 100;
43 let base_log = (base_n as f64).log10();
44 for (col, entry) in table_row.iter_mut().enumerate() {
45 let diff = ((base_n + col) as f64).log10() - base_log;
46 *entry = (diff * 10000.0).round() as u8;
47 }
48 }
49 table
50}
51
52pub fn generate_log_table_small_alt() -> [[u8; 10]; 10] {
57 let mut table = [[0u8; 10]; 10];
58 for (row, table_row) in table.iter_mut().enumerate() {
59 let base_n = (10 + row) * 100;
60 let base_log = (base_n as f64).log10();
61 for (col, entry) in table_row.iter_mut().enumerate() {
62 let diff = ((base_n + col) as f64).log10() - base_log;
63 *entry = (diff * 10000.0).round() as u8;
64 }
65 }
66 table
67}
68
69pub fn generate_antilog_table() -> [[u16; 10]; 100] {
76 let mut table = [[0u16; 10]; 100];
77 for (row, table_row) in table.iter_mut().enumerate() {
78 for (col, entry) in table_row.iter_mut().enumerate() {
79 let k = row * 10 + col;
80 *entry = (10.0_f64.powf((k * 10) as f64 / 10000.0) * 1000.0).round() as u16;
81 }
82 }
83 table
84}
85
86pub fn generate_antilog_table_small() -> [[u8; 10]; 100] {
98 let mut table = [[0u8; 10]; 100];
99 for (row, table_row) in table.iter_mut().enumerate() {
100 for (col, entry) in table_row.iter_mut().enumerate() {
101 let idx = row * 100 + col;
102 let main_k = idx / 10;
103 let main_val = (10.0_f64.powf((main_k * 10) as f64 / 10000.0) * 1000.0).round();
104 let exact_val = (10.0_f64.powf(idx as f64 / 10000.0) * 1000.0).round();
105 *entry = (exact_val - main_val).round() as u8;
106 }
107 }
108 table
109}
110
111#[cfg(test)]
112#[allow(clippy::needless_range_loop)]
113mod tests {
114 use super::*;
115
116 #[test]
121 fn test_log_table_accuracy() {
122 let table = solidity_log_table();
123 for row in 0..90 {
124 for col in 0..10 {
125 let n = ((10 + row) * 100 + col * 10) as f64;
126 let expected = ((n.log10() - 3.0) * 10000.0).round() as i32;
127 let actual = (table[row][col] & !ALT_TABLE_FLAG) as i32;
128 assert!(
129 (actual - expected).abs() <= 1,
130 "log table [{row}][{col}]: n={n}, expected={expected}, actual={actual}, diff={}",
131 actual - expected
132 );
133 }
134 }
135 }
136
137 #[test]
139 fn test_antilog_table_accuracy() {
140 let table = solidity_antilog_table();
141 for row in 0..100 {
142 for col in 0..10 {
143 let k = row * 10 + col;
144 let expected = (10.0_f64.powf((k * 10) as f64 / 10000.0) * 1000.0).round() as i32;
145 let actual = table[row][col] as i32;
146 assert!(
147 (actual - expected).abs() <= 1,
148 "antilog table [{row}][{col}]: k={k}, expected={expected}, actual={actual}, diff={}",
149 actual - expected
150 );
151 }
152 }
153 }
154
155 #[test]
158 fn test_log_lookup_accuracy() {
159 let main = solidity_log_table();
160 let small = solidity_log_table_small();
161 let small_alt = solidity_log_table_small_alt();
162 for n in 1000..10000_usize {
163 let row = n / 10 - 100;
164 let _col = (n / 10) % 10;
165 let d = n % 10;
166 let main_row = row / 10;
167 let main_col = row % 10;
168
169 let main_entry = main[main_row][main_col];
170 let main_val = (main_entry & !ALT_TABLE_FLAG) as i32;
171 let use_alt = main_entry & ALT_TABLE_FLAG != 0;
172 let small_val = if use_alt {
173 small_alt[main_row][d] as i32
174 } else {
175 small[main_row][d] as i32
176 };
177 let table_result = main_val + small_val;
178 let true_val = ((n as f64).log10() - 3.0) * 10000.0;
179
180 assert!(
183 (table_result as f64 - true_val).abs() < 2.5,
184 "log lookup for n={n}: table={table_result}, true={true_val:.2}, diff={:.2}",
185 table_result as f64 - true_val
186 );
187 }
188 }
189
190 #[test]
193 fn test_antilog_lookup_accuracy() {
194 let main = solidity_antilog_table();
195 let small = solidity_antilog_table_small();
196 for idx in 0..10000_usize {
197 let main_k = idx / 10;
198 let main_row = main_k / 10;
199 let main_col = main_k % 10;
200 let main_val = main[main_row][main_col] as i32;
201
202 let small_row = idx / 100;
203 let small_col = idx % 10;
204 let small_val = small[small_row][small_col] as i32;
205
206 let table_result = main_val + small_val;
207 let true_val = 10.0_f64.powf(idx as f64 / 10000.0) * 1000.0;
208
209 assert!(
210 (table_result as f64 - true_val).abs() < 2.5,
211 "antilog lookup for idx={idx}: table={table_result}, true={true_val:.2}, diff={:.2}",
212 table_result as f64 - true_val
213 );
214 }
215 }
216
217 #[test]
220 fn test_antilog_table_exact() {
221 let generated = generate_antilog_table();
222 let solidity = solidity_antilog_table();
223 for row in 0..100 {
224 for col in 0..10 {
225 assert_eq!(
226 generated[row][col], solidity[row][col],
227 "antilog table mismatch at [{row}][{col}]: generated={}, solidity={}",
228 generated[row][col], solidity[row][col]
229 );
230 }
231 }
232 }
233
234 #[test]
240 fn test_log_table_small_generation() {
241 let generated = generate_log_table_small();
242 let solidity = solidity_log_table_small();
243 for row in 0..90 {
244 for col in 0..10 {
245 let diff = generated[row][col] as i16 - solidity[row][col] as i16;
246 assert!(
247 diff.abs() <= 1,
248 "log small [{row}][{col}]: generated={}, solidity={}, diff={diff}",
249 generated[row][col],
250 solidity[row][col]
251 );
252 }
253 }
254 }
255
256 #[test]
260 fn test_log_table_small_alt_generation() {
261 let generated = generate_log_table_small_alt();
262 let solidity = solidity_log_table_small_alt();
263 for row in 0..10 {
264 for col in 0..10 {
265 let diff = generated[row][col] as i16 - solidity[row][col] as i16;
266 assert!(
267 diff.abs() <= 3,
268 "log small alt [{row}][{col}]: generated={}, solidity={}, diff={diff}",
269 generated[row][col],
270 solidity[row][col]
271 );
272 }
273 }
274 }
275
276 #[test]
278 fn test_antilog_table_small_generation() {
279 let generated = generate_antilog_table_small();
280 let solidity = solidity_antilog_table_small();
281 for row in 0..100 {
282 for col in 0..10 {
283 let diff = generated[row][col] as i16 - solidity[row][col] as i16;
284 assert!(
285 diff.abs() <= 1,
286 "antilog small [{row}][{col}]: generated={}, solidity={}, diff={diff}",
287 generated[row][col],
288 solidity[row][col]
289 );
290 }
291 }
292 }
293
294 #[test]
298 fn test_log_table_generation() {
299 let small = generate_log_table_small();
300 let small_alt = generate_log_table_small_alt();
301 let generated = generate_log_table(&small, &small_alt);
302 let solidity = solidity_log_table();
303 for row in 0..90 {
304 for col in 0..10 {
305 let gen_base = generated[row][col] & !ALT_TABLE_FLAG;
306 let sol_base = solidity[row][col] & !ALT_TABLE_FLAG;
307 assert_eq!(
308 gen_base, sol_base,
309 "log [{row}][{col}] base: generated={gen_base}, solidity={sol_base}",
310 );
311 }
312 }
313 }
314
315 #[rustfmt::skip]
320 fn solidity_log_table() -> [[u16; 10]; 90] {
321 [
322 [0, 43, 86, 128, 170, 212|ALT_TABLE_FLAG, 253|ALT_TABLE_FLAG, 294|ALT_TABLE_FLAG, 334|ALT_TABLE_FLAG, 374|ALT_TABLE_FLAG],
323 [414, 453, 492, 531, 569, 607|ALT_TABLE_FLAG, 645|ALT_TABLE_FLAG, 682|ALT_TABLE_FLAG, 719|ALT_TABLE_FLAG, 755|ALT_TABLE_FLAG],
324 [792, 828, 864, 899, 934, 969, 1004|ALT_TABLE_FLAG, 1038|ALT_TABLE_FLAG, 1072|ALT_TABLE_FLAG, 1106|ALT_TABLE_FLAG],
325 [1139, 1173, 1206, 1239, 1271, 1303|ALT_TABLE_FLAG, 1335|ALT_TABLE_FLAG, 1367|ALT_TABLE_FLAG, 1399|ALT_TABLE_FLAG, 1430|ALT_TABLE_FLAG],
326 [1461, 1492, 1523, 1553, 1584|ALT_TABLE_FLAG, 1614|ALT_TABLE_FLAG, 1644|ALT_TABLE_FLAG, 1673|ALT_TABLE_FLAG, 1703|ALT_TABLE_FLAG, 1732|ALT_TABLE_FLAG],
327 [1761, 1790, 1818, 1847, 1875, 1903, 1931|ALT_TABLE_FLAG, 1959|ALT_TABLE_FLAG, 1987|ALT_TABLE_FLAG, 2014|ALT_TABLE_FLAG],
328 [2041, 2068, 2095, 2122, 2148, 2175|ALT_TABLE_FLAG, 2201|ALT_TABLE_FLAG, 2227|ALT_TABLE_FLAG, 2253|ALT_TABLE_FLAG, 2279|ALT_TABLE_FLAG],
329 [2304, 2330, 2355, 2380, 2405, 2430, 2455|ALT_TABLE_FLAG, 2480|ALT_TABLE_FLAG, 2504|ALT_TABLE_FLAG, 2529|ALT_TABLE_FLAG],
330 [2553, 2577, 2601, 2625, 2648, 2672|ALT_TABLE_FLAG, 2695|ALT_TABLE_FLAG, 2718|ALT_TABLE_FLAG, 2742|ALT_TABLE_FLAG, 2765|ALT_TABLE_FLAG],
331 [2788, 2810, 2833, 2856, 2878, 2900|ALT_TABLE_FLAG, 2923|ALT_TABLE_FLAG, 2945|ALT_TABLE_FLAG, 2967|ALT_TABLE_FLAG, 2989|ALT_TABLE_FLAG],
332 [3010, 3032, 3054, 3075, 3096, 3118, 3139, 3160, 3181, 3201],
333 [3222, 3243, 3263, 3284, 3304, 3324, 3345, 3365, 3385, 3404],
334 [3424, 3444, 3464, 3483, 3502, 3522, 3541, 3560, 3579, 3598],
335 [3617, 3636, 3655, 3674, 3692, 3711, 3729, 3747, 3766, 3784],
336 [3802, 3820, 3838, 3856, 3874, 3892, 3909, 3927, 3945, 3962],
337 [3979, 3997, 4014, 4031, 4048, 4065, 4082, 4099, 4116, 4133],
338 [4150, 4166, 4183, 4200, 4216, 4232, 4249, 4265, 4281, 4298],
339 [4314, 4330, 4346, 4362, 4378, 4393, 4409, 4425, 4440, 4456],
340 [4472, 4487, 4502, 4518, 4533, 4548, 4564, 4579, 4594, 4609],
341 [4624, 4639, 4654, 4669, 4683, 4698, 4713, 4728, 4742, 4757],
342 [4771, 4786, 4800, 4814, 4829, 4843, 4857, 4871, 4886, 4900],
343 [4914, 4928, 4942, 4955, 4969, 4983, 4997, 5011, 5024, 5038],
344 [5051, 5065, 5079, 5092, 5105, 5119, 5132, 5145, 5159, 5172],
345 [5185, 5198, 5211, 5224, 5237, 5250, 5263, 5276, 5289, 5302],
346 [5315, 5328, 5340, 5353, 5366, 5378, 5391, 5403, 5416, 5428],
347 [5441, 5453, 5465, 5478, 5490, 5502, 5514, 5527, 5539, 5551],
348 [5563, 5575, 5587, 5599, 5611, 5623, 5635, 5647, 5658, 5670],
349 [5682, 5694, 5705, 5717, 5729, 5740, 5752, 5763, 5775, 5786],
350 [5798, 5809, 5821, 5832, 5843, 5855, 5866, 5877, 5888, 5899],
351 [5911, 5922, 5933, 5944, 5955, 5966, 5977, 5988, 5999, 6010],
352 [6021, 6031, 6042, 6053, 6064, 6075, 6085, 6096, 6107, 6117],
353 [6128, 6138, 6149, 6160, 6170, 6180, 6191, 6201, 6212, 6222],
354 [6232, 6243, 6253, 6263, 6274, 6284, 6294, 6304, 6314, 6325],
355 [6335, 6345, 6355, 6365, 6375, 6385, 6395, 6405, 6415, 6425],
356 [6435, 6444, 6454, 6464, 6474, 6484, 6493, 6503, 6513, 6522],
357 [6532, 6542, 6551, 6561, 6571, 6580, 6590, 6599, 6609, 6618],
358 [6628, 6637, 6646, 6656, 6665, 6675, 6684, 6693, 6702, 6712],
359 [6721, 6730, 6739, 6749, 6758, 6767, 6776, 6785, 6794, 6803],
360 [6812, 6821, 6830, 6839, 6848, 6857, 6866, 6875, 6884, 6893],
361 [6902, 6911, 6920, 6928, 6937, 6946, 6955, 6964, 6972, 6981],
362 [6990, 6998, 7007, 7016, 7024, 7033, 7042, 7050, 7059, 7067],
363 [7076, 7084, 7093, 7101, 7110, 7118, 7126, 7135, 7143, 7152],
364 [7160, 7168, 7177, 7185, 7193, 7202, 7210, 7218, 7226, 7235],
365 [7243, 7251, 7259, 7267, 7275, 7284, 7292, 7300, 7308, 7316],
366 [7324, 7332, 7340, 7348, 7356, 7364, 7372, 7380, 7388, 7396],
367 [7404, 7412, 7419, 7427, 7435, 7443, 7451, 7459, 7466, 7474],
368 [7482, 7490, 7497, 7505, 7513, 7520, 7528, 7536, 7543, 7551],
369 [7559, 7566, 7574, 7582, 7589, 7597, 7604, 7612, 7619, 7627],
370 [7634, 7642, 7649, 7657, 7664, 7672, 7679, 7686, 7694, 7701],
371 [7709, 7716, 7723, 7731, 7738, 7745, 7752, 7760, 7767, 7774],
372 [7782, 7789, 7796, 7803, 7810, 7818, 7825, 7832, 7839, 7846],
373 [7853, 7860, 7868, 7875, 7882, 7889, 7896, 7903, 7910, 7917],
374 [7924, 7931, 7938, 7945, 7952, 7959, 7966, 7973, 7980, 7987],
375 [7993, 8000, 8007, 8014, 8021, 8028, 8035, 8041, 8048, 8055],
376 [8062, 8069, 8075, 8082, 8089, 8096, 8102, 8109, 8116, 8122],
377 [8129, 8136, 8142, 8149, 8156, 8162, 8169, 8176, 8182, 8189],
378 [8195, 8202, 8209, 8215, 8222, 8228, 8235, 8241, 8248, 8254],
379 [8261, 8267, 8274, 8280, 8287, 8293, 8299, 8306, 8312, 8319],
380 [8325, 8331, 8338, 8344, 8351, 8357, 8363, 8370, 8376, 8382],
381 [8388, 8395, 8401, 8407, 8414, 8420, 8426, 8432, 8439, 8445],
382 [8451, 8457, 8463, 8470, 8476, 8482, 8488, 8494, 8500, 8506],
383 [8513, 8519, 8525, 8531, 8537, 8543, 8549, 8555, 8561, 8567],
384 [8573, 8579, 8585, 8591, 8597, 8603, 8609, 8615, 8621, 8627],
385 [8633, 8639, 8645, 8651, 8657, 8663, 8669, 8675, 8681, 8686],
386 [8692, 8698, 8704, 8710, 8716, 8722, 8727, 8733, 8739, 8745],
387 [8751, 8756, 8762, 8768, 8774, 8779, 8785, 8791, 8797, 8802],
388 [8808, 8814, 8820, 8825, 8831, 8837, 8842, 8848, 8854, 8859],
389 [8865, 8871, 8876, 8882, 8887, 8893, 8899, 8904, 8910, 8915],
390 [8921, 8927, 8932, 8938, 8943, 8949, 8954, 8960, 8965, 8971],
391 [8976, 8982, 8987, 8993, 8998, 9004, 9009, 9015, 9020, 9025],
392 [9031, 9036, 9042, 9047, 9053, 9058, 9063, 9069, 9074, 9079],
393 [9085, 9090, 9096, 9101, 9106, 9112, 9117, 9122, 9128, 9133],
394 [9138, 9143, 9149, 9154, 9159, 9165, 9170, 9175, 9180, 9186],
395 [9191, 9196, 9201, 9206, 9212, 9217, 9222, 9227, 9232, 9238],
396 [9243, 9248, 9253, 9258, 9263, 9269, 9274, 9279, 9284, 9289],
397 [9294, 9299, 9304, 9309, 9315, 9320, 9325, 9330, 9335, 9340],
398 [9345, 9350, 9355, 9360, 9365, 9370, 9375, 9380, 9385, 9390],
399 [9395, 9400, 9405, 9410, 9415, 9420, 9425, 9430, 9435, 9440],
400 [9445, 9450, 9455, 9460, 9465, 9469, 9474, 9479, 9484, 9489],
401 [9494, 9499, 9504, 9509, 9513, 9518, 9523, 9528, 9533, 9538],
402 [9542, 9547, 9552, 9557, 9562, 9566, 9571, 9576, 9581, 9586],
403 [9590, 9595, 9600, 9605, 9609, 9614, 9619, 9624, 9628, 9633],
404 [9638, 9643, 9647, 9652, 9657, 9661, 9666, 9671, 9675, 9680],
405 [9685, 9689, 9694, 9699, 9703, 9708, 9713, 9717, 9722, 9727],
406 [9731, 9736, 9741, 9745, 9750, 9754, 9759, 9763, 9768, 9773],
407 [9777, 9782, 9786, 9791, 9795, 9800, 9805, 9809, 9814, 9818],
408 [9823, 9827, 9832, 9836, 9841, 9845, 9850, 9854, 9859, 9863],
409 [9868, 9872, 9877, 9881, 9886, 9890, 9894, 9899, 9903, 9908],
410 [9912, 9917, 9921, 9926, 9930, 9934, 9939, 9943, 9948, 9952],
411 [9956, 9961, 9965, 9969, 9974, 9978, 9983, 9987, 9991, 9996],
412 ]
413 }
414
415 #[rustfmt::skip]
416 fn solidity_log_table_small() -> [[u8; 10]; 90] {
417 [
418 [0, 4, 9, 13, 17, 21, 26, 30, 34, 38], [0, 4, 8, 12, 15, 19, 23, 27, 31, 35],
419 [0, 3, 7, 11, 14, 18, 21, 25, 28, 32], [0, 3, 7, 10, 13, 16, 20, 23, 26, 30],
420 [0, 3, 6, 9, 12, 15, 18, 21, 24, 28], [0, 3, 6, 9, 11, 14, 17, 20, 23, 26],
421 [0, 3, 5, 8, 11, 14, 16, 19, 22, 24], [0, 3, 5, 8, 10, 13, 15, 18, 20, 23],
422 [0, 2, 5, 7, 9, 12, 14, 16, 19, 21], [0, 2, 4, 7, 9, 11, 13, 16, 18, 20],
423 [0, 2, 4, 6, 8, 11, 13, 15, 17, 19], [0, 2, 4, 6, 8, 10, 12, 14, 16, 18],
424 [0, 2, 4, 6, 8, 10, 12, 14, 15, 17], [0, 2, 4, 6, 7, 9, 11, 13, 15, 17],
425 [0, 2, 4, 5, 7, 9, 11, 12, 14, 16], [0, 2, 3, 5, 7, 9, 10, 12, 14, 15],
426 [0, 2, 3, 5, 7, 8, 10, 11, 13, 15], [0, 2, 3, 5, 6, 8, 9, 11, 13, 14],
427 [0, 2, 3, 5, 6, 8, 9, 11, 12, 14], [0, 1, 3, 4, 6, 7, 9, 10, 12, 13],
428 [0, 1, 3, 4, 6, 7, 9, 10, 11, 13], [0, 1, 3, 4, 6, 7, 8, 10, 11, 12],
429 [0, 1, 3, 4, 5, 7, 8, 9, 11, 12], [0, 1, 3, 4, 5, 6, 8, 9, 10, 12],
430 [0, 1, 3, 4, 5, 6, 8, 9, 10, 11], [0, 1, 2, 4, 5, 6, 7, 9, 10, 11],
431 [0, 1, 2, 4, 5, 6, 7, 8, 10, 11], [0, 1, 2, 3, 5, 6, 7, 8, 9, 10],
432 [0, 1, 2, 3, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 7, 8, 9, 10],
433 [0, 1, 2, 3, 4, 5, 6, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
434 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
435 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
436 [0, 1, 2, 3, 4, 5, 6, 7, 7, 8], [0, 1, 2, 3, 4, 5, 5, 6, 7, 8],
437 [0, 1, 2, 3, 4, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 4, 5, 6, 7, 8],
438 [0, 1, 2, 3, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 3, 4, 5, 6, 7, 8],
439 [0, 1, 2, 2, 3, 4, 5, 6, 7, 7], [0, 1, 2, 2, 3, 4, 5, 6, 6, 7],
440 [0, 1, 2, 2, 3, 4, 5, 6, 6, 7], [0, 1, 2, 2, 3, 4, 5, 5, 6, 7],
441 [0, 1, 2, 2, 3, 4, 5, 5, 6, 7], [0, 1, 2, 2, 3, 4, 5, 5, 6, 7],
442 [0, 1, 1, 2, 3, 4, 4, 5, 6, 7], [0, 1, 1, 2, 3, 4, 4, 5, 6, 7],
443 [0, 1, 1, 2, 3, 4, 4, 5, 6, 6], [0, 1, 1, 2, 3, 4, 4, 5, 6, 6],
444 [0, 1, 1, 2, 3, 3, 4, 5, 6, 6], [0, 1, 1, 2, 3, 3, 4, 5, 5, 6],
445 [0, 1, 1, 2, 3, 3, 4, 5, 5, 6], [0, 1, 1, 2, 3, 3, 4, 5, 5, 6],
446 [0, 1, 1, 2, 3, 3, 4, 5, 5, 6], [0, 1, 1, 2, 3, 3, 4, 5, 5, 6],
447 [0, 1, 1, 2, 3, 3, 4, 4, 5, 6], [0, 1, 1, 2, 2, 3, 4, 4, 5, 6],
448 [0, 1, 1, 2, 2, 3, 4, 4, 5, 6], [0, 1, 1, 2, 2, 3, 4, 4, 5, 5],
449 [0, 1, 1, 2, 2, 3, 4, 4, 5, 5], [0, 1, 1, 2, 2, 3, 4, 4, 5, 5],
450 [0, 1, 1, 2, 2, 3, 4, 4, 5, 5], [0, 1, 1, 2, 2, 3, 3, 4, 5, 5],
451 [0, 1, 1, 2, 2, 3, 3, 4, 5, 5], [0, 1, 1, 2, 2, 3, 3, 4, 4, 5],
452 [0, 1, 1, 2, 2, 3, 3, 4, 4, 5], [0, 1, 1, 2, 2, 3, 3, 4, 4, 5],
453 [0, 1, 1, 2, 2, 3, 3, 4, 4, 5], [0, 1, 1, 2, 2, 3, 3, 4, 4, 5],
454 [0, 1, 1, 2, 2, 3, 3, 4, 4, 5], [0, 1, 1, 2, 2, 3, 3, 4, 4, 5],
455 [0, 1, 1, 2, 2, 3, 3, 4, 4, 5], [0, 1, 1, 2, 2, 3, 3, 4, 4, 5],
456 [0, 1, 1, 2, 2, 3, 3, 4, 4, 5], [0, 0, 1, 1, 2, 2, 3, 3, 4, 4],
457 [0, 0, 1, 1, 2, 2, 3, 3, 4, 4], [0, 0, 1, 1, 2, 2, 3, 3, 4, 4],
458 [0, 0, 1, 1, 2, 2, 3, 3, 4, 4], [0, 0, 1, 1, 2, 2, 3, 3, 4, 4],
459 [0, 0, 1, 1, 2, 2, 3, 3, 4, 4], [0, 0, 1, 1, 2, 2, 3, 3, 4, 4],
460 [0, 0, 1, 1, 2, 2, 3, 3, 4, 4], [0, 0, 1, 1, 2, 2, 3, 3, 4, 4],
461 [0, 0, 1, 1, 2, 2, 3, 3, 4, 4], [0, 0, 1, 1, 2, 2, 3, 3, 4, 4],
462 [0, 0, 1, 1, 2, 2, 3, 3, 4, 4], [0, 0, 1, 1, 2, 2, 3, 3, 3, 4],
463 ]
464 }
465
466 #[rustfmt::skip]
467 fn solidity_log_table_small_alt() -> [[u8; 10]; 10] {
468 [
469 [0, 4, 8, 12, 16, 20, 24, 28, 32, 37],
470 [0, 4, 7, 11, 15, 19, 22, 26, 30, 33],
471 [0, 3, 7, 10, 14, 17, 20, 24, 27, 31],
472 [0, 3, 7, 10, 12, 16, 19, 22, 25, 29],
473 [0, 3, 6, 9, 12, 15, 17, 20, 23, 26],
474 [0, 3, 5, 8, 11, 14, 16, 19, 22, 25],
475 [0, 3, 5, 8, 10, 13, 15, 18, 21, 23],
476 [0, 2, 5, 7, 10, 12, 15, 17, 19, 22],
477 [0, 2, 5, 7, 9, 11, 14, 16, 18, 21],
478 [0, 2, 4, 6, 8, 11, 13, 15, 17, 19],
479 ]
480 }
481
482 #[rustfmt::skip]
483 fn solidity_antilog_table() -> [[u16; 10]; 100] {
484 [
485 [1000, 1002, 1005, 1007, 1009, 1012, 1014, 1016, 1019, 1021],
486 [1023, 1026, 1028, 1030, 1033, 1035, 1038, 1040, 1042, 1045],
487 [1047, 1050, 1052, 1054, 1057, 1059, 1062, 1064, 1067, 1069],
488 [1072, 1074, 1076, 1079, 1081, 1084, 1086, 1089, 1091, 1094],
489 [1096, 1099, 1102, 1104, 1107, 1109, 1112, 1114, 1117, 1119],
490 [1122, 1125, 1127, 1130, 1132, 1135, 1138, 1140, 1143, 1146],
491 [1148, 1151, 1153, 1156, 1159, 1161, 1164, 1167, 1169, 1172],
492 [1175, 1178, 1180, 1183, 1186, 1189, 1191, 1194, 1197, 1199],
493 [1202, 1205, 1208, 1211, 1213, 1216, 1219, 1222, 1225, 1227],
494 [1230, 1233, 1236, 1239, 1242, 1245, 1247, 1250, 1253, 1256],
495 [1259, 1262, 1265, 1268, 1271, 1274, 1276, 1279, 1282, 1285],
496 [1288, 1291, 1294, 1297, 1300, 1303, 1306, 1309, 1312, 1315],
497 [1318, 1321, 1324, 1327, 1330, 1334, 1337, 1340, 1343, 1346],
498 [1349, 1352, 1355, 1358, 1361, 1365, 1368, 1371, 1374, 1377],
499 [1380, 1384, 1387, 1390, 1393, 1396, 1400, 1403, 1406, 1409],
500 [1413, 1416, 1419, 1422, 1426, 1429, 1432, 1435, 1439, 1442],
501 [1445, 1449, 1452, 1455, 1459, 1462, 1466, 1469, 1472, 1476],
502 [1479, 1483, 1486, 1489, 1493, 1496, 1500, 1503, 1507, 1510],
503 [1514, 1517, 1521, 1524, 1528, 1531, 1535, 1538, 1542, 1545],
504 [1549, 1552, 1556, 1560, 1563, 1567, 1570, 1574, 1578, 1581],
505 [1585, 1589, 1592, 1596, 1600, 1603, 1607, 1611, 1614, 1618],
506 [1622, 1626, 1629, 1633, 1637, 1641, 1644, 1648, 1652, 1656],
507 [1660, 1663, 1667, 1671, 1675, 1679, 1683, 1687, 1690, 1694],
508 [1698, 1702, 1706, 1710, 1714, 1718, 1722, 1726, 1730, 1734],
509 [1738, 1742, 1746, 1750, 1754, 1758, 1762, 1766, 1770, 1774],
510 [1778, 1782, 1786, 1791, 1795, 1799, 1803, 1807, 1811, 1816],
511 [1820, 1824, 1828, 1832, 1837, 1841, 1845, 1849, 1854, 1858],
512 [1862, 1866, 1871, 1875, 1879, 1884, 1888, 1892, 1897, 1901],
513 [1905, 1910, 1914, 1919, 1923, 1928, 1932, 1936, 1941, 1945],
514 [1950, 1954, 1959, 1963, 1968, 1972, 1977, 1982, 1986, 1991],
515 [1995, 2000, 2004, 2009, 2014, 2018, 2023, 2028, 2032, 2037],
516 [2042, 2046, 2051, 2056, 2061, 2065, 2070, 2075, 2080, 2084],
517 [2089, 2094, 2099, 2104, 2109, 2113, 2118, 2123, 2128, 2133],
518 [2138, 2143, 2148, 2153, 2158, 2163, 2168, 2173, 2178, 2183],
519 [2188, 2193, 2198, 2203, 2208, 2213, 2218, 2223, 2228, 2234],
520 [2239, 2244, 2249, 2254, 2259, 2265, 2270, 2275, 2280, 2286],
521 [2291, 2296, 2301, 2307, 2312, 2317, 2323, 2328, 2333, 2339],
522 [2344, 2350, 2355, 2360, 2366, 2371, 2377, 2382, 2388, 2393],
523 [2399, 2404, 2410, 2415, 2421, 2427, 2432, 2438, 2443, 2449],
524 [2455, 2460, 2466, 2472, 2477, 2483, 2489, 2495, 2500, 2506],
525 [2512, 2518, 2523, 2529, 2535, 2541, 2547, 2553, 2559, 2564],
526 [2570, 2576, 2582, 2588, 2594, 2600, 2606, 2612, 2618, 2624],
527 [2630, 2636, 2642, 2649, 2655, 2661, 2667, 2673, 2679, 2685],
528 [2692, 2698, 2704, 2710, 2716, 2723, 2729, 2735, 2742, 2748],
529 [2754, 2761, 2767, 2773, 2780, 2786, 2793, 2799, 2805, 2812],
530 [2818, 2825, 2831, 2838, 2844, 2851, 2858, 2864, 2871, 2877],
531 [2884, 2891, 2897, 2904, 2911, 2917, 2924, 2931, 2938, 2944],
532 [2951, 2958, 2965, 2972, 2979, 2985, 2992, 2999, 3006, 3013],
533 [3020, 3027, 3034, 3041, 3048, 3055, 3062, 3069, 3076, 3083],
534 [3090, 3097, 3105, 3112, 3119, 3126, 3133, 3141, 3148, 3155],
535 [3162, 3170, 3177, 3184, 3192, 3199, 3206, 3214, 3221, 3228],
536 [3236, 3243, 3251, 3258, 3266, 3273, 3281, 3289, 3296, 3304],
537 [3311, 3319, 3327, 3334, 3342, 3350, 3357, 3365, 3373, 3381],
538 [3388, 3396, 3404, 3412, 3420, 3428, 3436, 3443, 3451, 3459],
539 [3467, 3475, 3483, 3491, 3499, 3508, 3516, 3524, 3532, 3540],
540 [3548, 3556, 3565, 3573, 3581, 3589, 3597, 3606, 3614, 3622],
541 [3631, 3639, 3648, 3656, 3664, 3673, 3681, 3690, 3698, 3707],
542 [3715, 3724, 3733, 3741, 3750, 3758, 3767, 3776, 3784, 3793],
543 [3802, 3811, 3819, 3828, 3837, 3846, 3855, 3864, 3873, 3882],
544 [3890, 3899, 3908, 3917, 3926, 3936, 3945, 3954, 3963, 3972],
545 [3981, 3990, 3999, 4009, 4018, 4027, 4036, 4046, 4055, 4064],
546 [4074, 4083, 4093, 4102, 4111, 4121, 4130, 4140, 4150, 4159],
547 [4169, 4178, 4188, 4198, 4207, 4217, 4227, 4236, 4246, 4256],
548 [4266, 4276, 4285, 4295, 4305, 4315, 4325, 4335, 4345, 4355],
549 [4365, 4375, 4385, 4395, 4406, 4416, 4426, 4436, 4446, 4457],
550 [4467, 4477, 4487, 4498, 4508, 4519, 4529, 4539, 4550, 4560],
551 [4571, 4581, 4592, 4603, 4613, 4624, 4634, 4645, 4656, 4667],
552 [4677, 4688, 4699, 4710, 4721, 4732, 4742, 4753, 4764, 4775],
553 [4786, 4797, 4808, 4819, 4831, 4842, 4853, 4864, 4875, 4887],
554 [4898, 4909, 4920, 4932, 4943, 4955, 4966, 4977, 4989, 5000],
555 [5012, 5023, 5035, 5047, 5058, 5070, 5082, 5093, 5105, 5117],
556 [5129, 5140, 5152, 5164, 5176, 5188, 5200, 5212, 5224, 5236],
557 [5248, 5260, 5272, 5284, 5297, 5309, 5321, 5333, 5346, 5358],
558 [5370, 5383, 5395, 5408, 5420, 5433, 5445, 5458, 5470, 5483],
559 [5495, 5508, 5521, 5534, 5546, 5559, 5572, 5585, 5598, 5610],
560 [5623, 5636, 5649, 5662, 5675, 5689, 5702, 5715, 5728, 5741],
561 [5754, 5768, 5781, 5794, 5808, 5821, 5834, 5848, 5861, 5875],
562 [5888, 5902, 5916, 5929, 5943, 5957, 5970, 5984, 5998, 6012],
563 [6026, 6039, 6053, 6067, 6081, 6095, 6109, 6124, 6138, 6152],
564 [6166, 6180, 6194, 6209, 6223, 6237, 6252, 6266, 6281, 6295],
565 [6310, 6324, 6339, 6353, 6368, 6383, 6397, 6412, 6427, 6442],
566 [6457, 6471, 6486, 6501, 6516, 6531, 6546, 6561, 6577, 6592],
567 [6607, 6622, 6637, 6653, 6668, 6683, 6699, 6714, 6730, 6745],
568 [6761, 6776, 6792, 6808, 6823, 6839, 6855, 6871, 6887, 6902],
569 [6918, 6934, 6950, 6966, 6982, 6998, 7015, 7031, 7047, 7063],
570 [7079, 7096, 7112, 7129, 7145, 7161, 7178, 7194, 7211, 7228],
571 [7244, 7261, 7278, 7295, 7311, 7328, 7345, 7362, 7379, 7396],
572 [7413, 7430, 7447, 7464, 7482, 7499, 7516, 7534, 7551, 7568],
573 [7586, 7603, 7621, 7638, 7656, 7674, 7691, 7709, 7727, 7745],
574 [7762, 7780, 7798, 7816, 7834, 7852, 7870, 7889, 7907, 7925],
575 [7943, 7962, 7980, 7998, 8017, 8035, 8054, 8072, 8091, 8110],
576 [8128, 8147, 8166, 8185, 8204, 8222, 8241, 8260, 8279, 8299],
577 [8318, 8337, 8356, 8375, 8395, 8414, 8433, 8453, 8472, 8492],
578 [8511, 8531, 8551, 8570, 8590, 8610, 8630, 8650, 8670, 8690],
579 [8710, 8730, 8750, 8770, 8790, 8810, 8831, 8851, 8872, 8892],
580 [8913, 8933, 8954, 8974, 8995, 9016, 9036, 9057, 9078, 9099],
581 [9120, 9141, 9162, 9183, 9204, 9226, 9247, 9268, 9290, 9311],
582 [9333, 9354, 9376, 9397, 9419, 9441, 9462, 9484, 9506, 9528],
583 [9550, 9572, 9594, 9616, 9638, 9661, 9683, 9705, 9727, 9750],
584 [9772, 9795, 9817, 9840, 9863, 9886, 9908, 9931, 9954, 9977],
585 ]
586 }
587
588 #[rustfmt::skip]
589 fn solidity_antilog_table_small() -> [[u8; 10]; 100] {
590 [
591 [0, 0, 0, 1, 1, 1, 1, 2, 2, 2], [0, 0, 0, 1, 1, 1, 1, 2, 2, 2],
592 [0, 0, 0, 1, 1, 1, 1, 2, 2, 2], [0, 0, 0, 1, 1, 1, 1, 2, 2, 2],
593 [0, 0, 1, 1, 1, 1, 2, 2, 2, 2], [0, 0, 1, 1, 1, 1, 2, 2, 2, 2],
594 [0, 0, 1, 1, 1, 1, 2, 2, 2, 2], [0, 0, 1, 1, 1, 1, 2, 2, 2, 2],
595 [0, 0, 1, 1, 1, 1, 2, 2, 2, 3], [0, 0, 1, 1, 1, 1, 2, 2, 2, 3],
596 [0, 0, 1, 1, 1, 1, 2, 2, 2, 3], [0, 0, 1, 1, 1, 2, 2, 2, 2, 3],
597 [0, 0, 1, 1, 1, 2, 2, 2, 2, 3], [0, 0, 1, 1, 1, 2, 2, 2, 3, 3],
598 [0, 0, 1, 1, 1, 2, 2, 2, 3, 3], [0, 0, 1, 1, 1, 2, 2, 2, 3, 3],
599 [0, 0, 1, 1, 1, 2, 2, 2, 3, 3], [0, 0, 1, 1, 1, 2, 2, 2, 3, 3],
600 [0, 0, 1, 1, 1, 2, 2, 2, 3, 3], [0, 0, 1, 1, 1, 2, 2, 3, 3, 3],
601 [0, 0, 1, 1, 1, 2, 2, 3, 3, 3], [0, 0, 1, 1, 2, 2, 2, 3, 3, 3],
602 [0, 0, 1, 1, 2, 2, 2, 3, 3, 3], [0, 0, 1, 1, 2, 2, 2, 3, 3, 4],
603 [0, 0, 1, 1, 2, 2, 2, 3, 3, 4], [0, 0, 1, 1, 2, 2, 2, 3, 3, 4],
604 [0, 0, 1, 1, 2, 2, 3, 3, 3, 4], [0, 0, 1, 1, 2, 2, 3, 3, 3, 4],
605 [0, 0, 1, 1, 2, 2, 3, 3, 4, 4], [0, 0, 1, 1, 2, 2, 3, 3, 4, 4],
606 [0, 0, 1, 1, 2, 2, 3, 3, 4, 4], [0, 0, 1, 1, 2, 2, 3, 3, 4, 4],
607 [0, 0, 1, 1, 2, 2, 3, 3, 4, 4], [0, 0, 1, 1, 2, 2, 3, 3, 4, 4],
608 [0, 1, 1, 2, 2, 3, 3, 4, 4, 5], [0, 1, 1, 2, 2, 3, 3, 4, 4, 5],
609 [0, 1, 1, 2, 2, 3, 3, 4, 4, 5], [0, 1, 1, 2, 2, 3, 3, 4, 4, 5],
610 [0, 1, 1, 2, 2, 3, 3, 4, 4, 5], [0, 1, 1, 2, 2, 3, 3, 4, 5, 5],
611 [0, 1, 1, 2, 2, 3, 4, 4, 5, 5], [0, 1, 1, 2, 2, 3, 4, 4, 5, 5],
612 [0, 1, 1, 2, 2, 3, 4, 4, 5, 6], [0, 1, 1, 2, 3, 3, 4, 4, 5, 6],
613 [0, 1, 1, 2, 3, 3, 4, 4, 5, 6], [0, 1, 1, 2, 3, 3, 4, 5, 5, 6],
614 [0, 1, 1, 2, 3, 3, 4, 5, 5, 6], [0, 1, 1, 2, 3, 3, 4, 5, 5, 6],
615 [0, 1, 1, 2, 3, 4, 4, 5, 6, 6], [0, 1, 1, 2, 3, 4, 4, 5, 6, 6],
616 [0, 1, 1, 2, 3, 4, 4, 5, 6, 7], [0, 1, 2, 2, 3, 4, 5, 5, 6, 7],
617 [0, 1, 2, 2, 3, 4, 5, 5, 6, 7], [0, 1, 2, 2, 3, 4, 5, 6, 6, 7],
618 [0, 1, 2, 2, 3, 4, 5, 6, 6, 7], [0, 1, 2, 2, 3, 4, 5, 6, 7, 7],
619 [0, 1, 2, 3, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 3, 4, 5, 6, 7, 8],
620 [0, 1, 2, 3, 4, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 5, 6, 7, 8],
621 [0, 1, 2, 3, 4, 5, 6, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
622 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
623 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
624 [0, 1, 2, 3, 4, 5, 6, 7, 9, 10], [0, 1, 2, 3, 4, 5, 7, 8, 9, 10],
625 [0, 1, 2, 3, 4, 6, 7, 8, 9, 10], [0, 1, 2, 3, 5, 6, 7, 8, 9, 10],
626 [0, 1, 2, 4, 5, 6, 7, 8, 9, 11],
627 [0, 1, 2, 4, 5, 6, 7, 8, 10, 11], [0, 1, 2, 4, 5, 6, 7, 9, 10, 11],
628 [0, 1, 3, 4, 5, 6, 8, 9, 10, 11], [0, 1, 3, 4, 5, 6, 8, 9, 10, 12],
629 [0, 1, 3, 4, 5, 7, 8, 9, 10, 12], [0, 1, 3, 4, 5, 7, 8, 9, 11, 12],
630 [0, 1, 3, 4, 5, 7, 8, 10, 11, 12], [0, 1, 3, 4, 6, 7, 8, 10, 11, 13],
631 [0, 1, 3, 4, 6, 7, 9, 10, 11, 13], [0, 1, 3, 4, 6, 7, 9, 10, 12, 13],
632 [0, 2, 3, 5, 6, 8, 9, 11, 12, 14], [0, 2, 3, 5, 6, 8, 9, 11, 12, 14],
633 [0, 2, 3, 5, 6, 8, 9, 11, 13, 14], [0, 2, 3, 5, 6, 8, 10, 11, 13, 15],
634 [0, 2, 3, 5, 7, 8, 10, 12, 13, 15], [0, 2, 3, 5, 7, 8, 10, 12, 13, 15],
635 [0, 2, 3, 5, 7, 9, 10, 12, 14, 16], [0, 2, 4, 5, 7, 9, 11, 12, 14, 16],
636 [0, 2, 4, 5, 7, 9, 11, 13, 14, 16], [0, 2, 4, 6, 7, 9, 11, 13, 15, 17],
637 [0, 2, 4, 6, 8, 9, 11, 13, 15, 17], [0, 2, 4, 6, 8, 10, 12, 14, 15, 17],
638 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18], [0, 2, 4, 6, 8, 10, 12, 14, 16, 18],
639 [0, 2, 4, 6, 8, 10, 12, 15, 17, 19], [0, 2, 4, 6, 8, 11, 13, 15, 17, 19],
640 [0, 2, 4, 7, 9, 11, 13, 15, 17, 20], [0, 2, 4, 7, 9, 11, 13, 16, 18, 20],
641 [0, 2, 5, 7, 9, 11, 14, 16, 18, 20],
642 ]
643 }
644}