не уверен, но на ум приходит тождество n m = exp10 (m log10 (n)) = exp (q (m log (n) / q)), где q = log (10) наряду с тем фактом, что первые K цифр exp10 (x) = первые K цифр exp10 (frac (x)), где frac (x) = дробная часть x = x - floor (x).
Чтобы быть более точным: первые K цифр n m являются первыми K цифрами его мантисса = exp (frac (m log (n) / q) * q ), где q = log (10).
Или вы можете даже пойти дальше в этом упражнении по учету и использовать exp ((frac (m log (n) / q) -0.5) * q) * sqrt (10), который также имеет ту же мантиссу (+, следовательно, те же самые первые K цифр), так что аргумент функции exp () центрируется вокруг 0 (и между +/- 0.5 log 10 = 1.151) для быстрой сходимости.
(Некоторые примеры: предположим, что вы хотели первые 5 цифр 2 100 . Это равняется первым 5 цифрам exp ((frac (100 log (2) / q) -0,5) * q) * sqrt (10) = 1,267650600228226. Фактическое значение 2 100 составляет 1,267650600228229e + 030 в соответствии с MATLAB, у меня нет удобной библиотеки bignum. Для мантиссы 2 1,000,000,000 Я получаю 4.612976044195602, но у меня нет способа проверить .... Есть страница на простых числах Мерсенна , где кто-то уже проделал тяжелую работу; 2 20996011 -1 = 125 976 895 450 ... и моя формула дает 1,259768950493908, рассчитанное в MATLAB, которое не работает после 9-й цифры.)
Я мог бы использовать ряд Тейлора (для exp и log , а не для n m ) вместе с их границами ошибок и продолжать добавлять термины до появления ошибки границы опускаются ниже первых K цифр. (обычно я не использую ряды Тейлора для приближения функций - их ошибка оптимизирована таким образом, чтобы быть максимально точной вокруг одной точки, а не в течение заданного интервала - но у них есть преимущество в том, что они математически просты, и вы может повысить точность до произвольной, просто добавив дополнительные термины)
Для логарифмов я бы использовал любое ваше любимое приближение.