Как может 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, который также сохраняет количество цифр низким и делает его еще быстрее.

надеюсь, что это помогает!