|  | from math import * | 
|  |  | 
|  | """ | 
|  | This script is used to generate a table used by | 
|  | libc/src/__support/high_precision_decimal.h. | 
|  |  | 
|  | For the ith entry in the table there are two values (indexed starting at 0). | 
|  | The first value is the number of digits longer the second value would be if | 
|  | multiplied by 2^i. | 
|  | The second value is the smallest number that would create that number of | 
|  | additional digits (which in base ten is always 5^i). Anything less creates one | 
|  | fewer digit. | 
|  |  | 
|  | As an example, the 3rd entry in the table is {1, "125"}. This means that if | 
|  | 125 is multiplied by 2^3 = 8, it will have exactly one more digit. | 
|  | Multiplying it out we get 125 * 8 = 1000. 125 is the smallest number that gives | 
|  | that extra digit, for example 124 * 8 = 992, and all larger 3 digit numbers | 
|  | also give only one extra digit when multiplied by 8, for example 8 * 999 = 7992. | 
|  | This makes sense because 5^3 * 2^3 = 10^3, the smallest 4 digit number. | 
|  |  | 
|  | For numbers with more digits we can ignore the digits past what's in the second | 
|  | value, since the most significant digits determine how many extra digits there | 
|  | will be. Looking at the previous example, if we have 1000, and we look at just | 
|  | the first 3 digits (since 125 has 3 digits), we see that 100 < 125, so we get | 
|  | one fewer than 1 extra digits, which is 0. | 
|  | Multiplying it out we get 1000 * 8 = 8000, which fits the expectation. | 
|  | Another few quick examples: | 
|  | For 1255, 125 !< 125, so 1 digit more: 1255 * 8 = 10040 | 
|  | For 9999, 999 !< 125, so 1 digit more: 9999 * 8 = 79992 | 
|  |  | 
|  | Now let's try an example with the 10th entry: {4, "9765625"}. This one means | 
|  | that 9765625 * 2^10 will have 4 extra digits. | 
|  | Let's skip straight to the examples: | 
|  | For 1, 1 < 9765625, so 4-1=3 extra digits: 1 * 2^10 = 1024, 1 digit to 4 digits is a difference of 3. | 
|  | For 9765624, 9765624 < 9765625 so 3 extra digits: 9765624 * 1024 = 9999998976, 7 digits to 10 digits is a difference of 3. | 
|  | For 9765625, 9765625 !< 9765625 so 4 extra digits: 9765625 * 1024 = 10000000000, 7 digits to 11 digits is a difference of 4. | 
|  | For 9999999, 9999999 !< 9765625 so 4 extra digits: 9999999 * 1024 = 10239998976, 7 digits to 11 digits is a difference of 4. | 
|  | For 12345678, 1234567 < 9765625 so 3 extra digits: 12345678 * 1024 = 12641974272, 8 digits to 11 digits is a difference of 3. | 
|  |  | 
|  |  | 
|  | This is important when left shifting in the HPD class because it reads and | 
|  | writes the number backwards, and to shift in place it needs to know where the | 
|  | last digit should go. Since a binary left shift by i bits is the same as | 
|  | multiplying by 2^i we know that looking up the ith element in the table will | 
|  | tell us the number of additional digits. If the first digits of the number | 
|  | being shifted are greater than or equal to the digits of 5^i (the second value | 
|  | of each entry) then it is just the first value in the entry, else it is one | 
|  | fewer. | 
|  | """ | 
|  |  | 
|  |  | 
|  | # Generate Left Shift Table | 
|  | outStr = "" | 
|  | for i in range(61): | 
|  | tenToTheI = 10**i | 
|  | fiveToTheI = 5**i | 
|  | outStr += "{" | 
|  | # The number of new digits that would be created by multiplying 5**i by 2**i | 
|  | outStr += str(ceil(log10(tenToTheI) - log10(fiveToTheI))) | 
|  | outStr += ', "' | 
|  | if not i == 0: | 
|  | outStr += str(fiveToTheI) | 
|  | outStr += '"},\n' | 
|  |  | 
|  | print(outStr) |