Как вычислить модуль вида (a *b)%c?

#c #overflow #modulus

#c #переполнение #модуль

Вопрос:

Как вычислить модуль вида (a *b)%c?

я хочу вычислить модуль умножения двух чисел int, где они находятся почти на стадии переполнения…

здесь c также является int

Ответ №1:

 (a * b) % c == ((a % c) * (b % c)) % c
  

Комментарии:

1. 1 Только что прокомментировал это, но отсутствие кофе означало, что я не был уверен. 😉

2. Если a <= b < c, a % c и b % c ничего не сделают, поэтому мы все равно можем получить переполнение.

Ответ №2:

Как насчет ((a % c) * (b % c)) % c ? В зависимости от вашей архитектуры это может быть быстрее или медленнее, чем приведение к большему типу.

Комментарии:

1. Если a <= b < c, a % c и b % c ничего не сделают, поэтому мы все равно можем получить переполнение.

Ответ №3:

Вы можете привести a и c к long long , чтобы умножение не привело к переполнению.

 ((long long)a * (long long)b) % c
  

Комментарии:

1. мне нужен какой-нибудь оптимизированный метод

2. Я не думаю, что вы нашли бы более быстрое решение. На машинах x86 результат 32-разрядного умножения всегда 64-разрядный. Таким образом, вы просто уведомляете компилятор использовать 64-разрядный результат.

3. long long не всегда больше, чем int (особенно на современных машинах)