c - 有效地计算两个数之和的模数

标签 c math modulo number-theory

我有三个 N 位数,ABC。我无法轻松计算 (A + B) % C,但我可以轻松计算 A % CB % C。如果模运算是无符号的,并且我提前知道 A + B 不会环绕 N 位,那么我可以改为计算 ((A % C) + (B % C)) % C。但是,对于模运算已签名或添加 AB 可能导致环绕的情况,是否可以做任何事情。

对于为什么 ((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

最佳答案

你想要的是:

((a+b)%2^n)%c

a+b = k 2^n + d

在哪里k = 0 or 1d < 2^n .

插入你得到:

 ((k 2^n + d) % 2^n) % c = (d % 2^n) % c = d % c

将前面的表达式取模 c你得到

 (a + b) % c = (k 2^n + d) % c => d % c = a % c + b % c - k 2^n % c

n = 32 , 在 C:

unsigned myMod(unsigned a, unsigned b, unsigned c)
{
     // k = 1 if the sum overflows
     unsigned k = ( a > UINT_MAX - b or b > UINT_MAX - a);

     return ( a % c + b % c -  k*(UINT_MAX%c + 1))%c;
}

myMod(0x1U,0xFFFFFFFFU,0x3U) == 0 

关于c - 有效地计算两个数之和的模数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27246594/

相关文章:

c - 如何使用动态改变数据大小的结构?

c++ - 将无符号整数与负文字进行比较

C sizeOf运算符: Want to make myOwnSizeOf( ) function

c - 如何从 C 中的 char 函数返回字符串

C++竞技编程: Simplifying expressions under modulo N

java - 如何对两个 Number 实例使用模?

java - LibGDX - 将透视相机表示为四元数

c++ - c++中的分区函数

php - 简单的加法和减法无法正常工作

java - 循环遍历一个 int 数组并在其中使用模数