В 32-битной целочисленной математике основные математические операции добавления и умножения вычисляются неявно по mod 2^32, что означает, что ваши результаты будут иметь самый низкий порядок бит добавления или умножения.Вычисление (a * b) mod c быстро для c = 2^N + -1
Если вы хотите вычислить результат с другим модулем, вы, безусловно, можете использовать любое количество классов BigInt на разных языках. А для значений a, b, c < 2^32 вы можете вычислить промежуточные значения в 64-битных тонах и использовать встроенные операторы% для уменьшения вправо answe.
Но мне сказали, что есть специальные трюки для эффективного вычисления a * b mod C, когда C имеет вид (2^N) -1 или (2^N) +1, которые не используют 64-битную математику или библиотеку BigInt и являются довольно эффективными, более того, чем произвольная оценка модуля, а также правильно вычислять случаи, которые обычно переполняют 32-битный int, если вы включаете промежуточное умножение.
К сожалению, несмотря на то, что такие особые случаи имеют быстрый метод оценки, я фактически не нашел описание метода. «Разве это не в Кнуте?» «Разве это не где-то в Википедии?» это те бормотания, которые я слышал.
По-видимому, это обычная техника в генераторах случайных чисел, которые выполняют умножения a * b mod 2147483647, так как 2147483647 - простое число, равное 2^31 -1.
Итак, я попрошу экспертов. Что это за умный метод случайного умножения с модулем, о котором я не могу найти обсуждения?
И все же не понимая математику позади этого, почему я уронил математику в колледже ... –
Ну, это похоже на получение остатка, когда разделив на 9 (10-1). Вы просто добавляете цифры. Теперь в этом случае вместо базы 10 или базы 2 вы являетесь «базовым» 2^N – FryGuy