Мне известны два способа сделать это без использования деления или модуля:
Метод 1: Умножение инвариантов .( см. Эту статью )
Основная идея здесь заключается в предварительном вычислении и аппроксимации обратной величины p
, которая позволяет выполнить целочисленное деление с помощью пары целочисленных умножений.,Затем вы можете умножить обратно и получить свой модуль.Это более простой подход для реализации.
Метод 2: (тот, который я обычно использую), - использование плавающей запятой.Преобразуйте числа в числа с плавающей запятой и умножьте на предварительно вычисленное обратное значение p
.Затем округлить и преобразовать обратно в целое число.Этот подход труднее понять, но, по моему опыту, он быстрее, если все сделано правильно.
Оба подхода здесь не предполагают делений, кроме предварительного вычисления обратной величины в целых числах или с плавающей запятой.
Будет ли любой из этих методов быстрее, чем прямое использование %
, будет зависеть от того, насколько хорошо вы сможете их реализовать.Поэтому я не могу гарантировать, что любой из них будет быстрее.