无符号整数溢出由C和C++标准很好地定义.例如,C99标准(§6.2.5/9)声明
涉及无符号操作数的计算永远不会过度流动,因为无法用结果无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.
但是,这两个标准都声明有符号整数溢出是未定义的行为.再次,从C99标准(§3.4.3/1)
未定义行为的一个示例是整数流上的行为
这种差异是否存在历史或(甚至更好!)技术原因?
我想计算一个用于RSA解密的b mod n.我的代码(如下)返回错误的答案.这有什么问题?
unsigned long int decrypt2(int a,int b,int n)
{
unsigned long int res = 1;
for (int i = 0; i < (b / 2); i++)
{
res *= ((a * a) % n);
res %= n;
}
if (b % n == 1)
res *=a;
res %=n;
return res;
}
Run Code Online (Sandbox Code Playgroud) 我需要计算a*amod n但是a相当大,当我对它进行平方时会导致溢出.这样做((a % n)*(a % n)) % n行不通,因为(N-1)2可以溢出.这是用C++编写的,我使用的是int 64.
编辑:示例值= 821037907258和n = 800000000000,如果您将其平方,则会溢出.
我正在使用DevCPP,我已经尝试过让大整数库工作无效.
编辑2:不,这些数字没有模式.
我想生成所有的Motzkin编号并存储在一个数组中.公式如下:

我目前的实施速度太慢了:
void generate_slow() {
mm[0] = 1;
mm[1] = 1;
mm[2] = 2;
mm[3] = 4;
mm[4] = 9;
ull result;
for (int i = 5; i <= MAX_NUMBERS; ++i) {
result = mm[i - 1];
for (int k = 0; k <= (i - 2); ++k) {
result = (result + ((mm[k] * mm[i - 2 - k]) % MODULO)) % MODULO;
}
mm[i] = result;
}
}
void generate_slightly_faster() {
mm[0] = 1;
mm[1] = …Run Code Online (Sandbox Code Playgroud) 我需要找到n!%1000000009.对于范围为1到20的k,n的类型为2 ^ k.我正在使用的函数是:
#define llu unsigned long long
#define MOD 1000000009
llu mulmod(llu a,llu b) // This function calculates (a*b)%MOD caring about overflows
{
llu x=0,y=a%MOD;
while(b > 0)
{
if(b%2 == 1)
{
x = (x+y)%MOD;
}
y = (y*2)%MOD;
b /= 2;
}
return (x%MOD);
}
llu fun(int n) // This function returns answer to my query ie. n!%MOD
{
llu ans=1;
for(int j=1; j<=n; j++)
{
ans=mulmod(ans,j);
}
return ans;
}
Run Code Online (Sandbox Code Playgroud)
我的要求是,我需要调用函数'fun',n/2次.对于15左右的k值,我的代码运行速度太慢了.有没有办法更快?
编辑:实际上我正在计算2*[(i-1)C(2 ^(k-1)-1)]*[((2 ^(k-1))!)^ 2]范围2 ^(k-1)到2 …
我正在寻找一个快速的方法来有效地计算(a⋅ b)模n (在该数学意义上)的a,b,n类型的uint64_t.我可以忍受诸如n!=0甚至是前提条件a<n && b<n.
请注意,C表达式(a*b)%n不会删除它,因为产品被截断为64位.我正在寻找,(uint64_t)(((uint128_t)a*b)%n)除了我没有uint128_t(我知道,在Visual C++中).
我正在使用Visual C++(最好)或GCC/clang内部,充分利用x86-64平台上可用的底层硬件; 或者如果便携式inline功能无法做到这一点.