У меня есть три N
-битные номера, A
, B
и C
. Я не могу легко вычислить (A + B) % C
, но я могу легко вычислить A % C
и B % C
. Если операция modulo без знака и я заранее знаю, что A + B
не обертывает N
битов, тогда я могу рассчитать ((A % C) + (B % C)) % C
. Однако можно ли что-либо сделать для случаев, когда операция по модулю подписана, или добавление A
и B
может привести к обертыванию.Эффективно вычислить по модулю сумму двух чисел
Похоже, что может возникнуть некоторая путаница относительно того, почему ((A % C) + (B % C)) % C
нельзя полагаться на то, чтобы всегда работать. Вот беззнаковое пример:
unsigned A = 0x1U;
unsigned B = 0xFFFFFFFFU;
unsigned C = 0x3U;
((A % C) + (B % C)) % C == 0x1U but (A + B) % C == 0x0U
Вот подписанный пример:
int A = 0x1;
int B = 0xE27F9803;
int C = 0x3U;
((A % C) + (B % C)) % C == 0x1U but (A + B) % C == -2
Я нахожусь под впечатлением, что ваша формула работает для подписанных номеров, а также для неподписанных. Может ли кто-нибудь, пожалуйста, предоставить встречный пример в противном случае? – SlySherZ
Просьба привести пример. – 2501
Кроме того, существует множество различных вариантов реализации mod(). Например, в JavaScript, -10% 3 = -1. В то время как математическая теория и R говорят -10 %% 3 = 2. – Dinesh