Как может WolframAlpha экспоненциальные числа так быстро?
Мне было интересно, как алгоритм RSA имеет дело с такими большими числами и попробовал один пример в WolframAlpha. Как они справляются с такими сумасшедшими цифрами?
EDIT: просто чтобы сделать его более странным,еще один пример
1 ответов
есть простой алгоритм под названием возведение в квадрат который можно использовать для вычисленияb mod c очень эффективно. Это основано на наблюдении, что
a2k mod c = (ak)2 mod c
a2k + 1 mod c = a · (ak)2 mod c
учитывая это, вы можете вычислитьb mod c с этот рекурсивный подход:
function raiseModPower(a, b, c):
if b == 0 return 1
let d = raiseModPower(a, floor(b/2), c)
if b mod 2 = 1:
return d * d * a mod c
else
return d * d mod c
это делает только o(log b) умножения, каждый из которых не может иметь больше цифр в них, чем O (log c), поэтому это очень быстро. Вот как реализации RSA поднимают вещи к полномочиям. Вы можете переписать это как итеративное, если хотите, хотя я думаю, что рекурсивная презентация действительно чистая.
Как только у вас есть этот алгоритм, вы можете использовать стандартные методы для умножения чисел произвольной точности, чтобы сделать вычисление. Поскольку требуются только o (log b) итерации умножения (в отличие, скажем, от B итераций), это безумно быстро. На самом деле вы никогда не вычисляетеb а затем моддинг его c, который также сохраняет количество цифр низким и делает его еще быстрее.
надеюсь, что это помогает!