如何计算C中常数的整数幂
我想计算ab mod c,其中如何计算C中常数的整数幂,c,algorithm,math,pow,C,Algorithm,Math,Pow,我想计算ab mod c,其中a,b和c是整数值。有没有一种有效的方法可以做到这一点 pow(a,b)%c似乎不起作用。对于此任务,在中定义的pow功能不是正确的工具,原因有多种: 使用pow()函数计算大数可能会溢出类型double表示的大小,并且精度不会提供模数运算所需的低阶数字 根据其在C库中的实现,pow()可能会为整型参数生成非整型值,将其转换为int可能会截断为不正确的值 %操作未在double类型上定义 为避免丢失低阶位,应在每一步执行模运算 对于考试来说,这不是考官所期望的
a
,b
和c
是整数值。有没有一种有效的方法可以做到这一点
pow(a,b)%c
似乎不起作用。对于此任务,在
中定义的pow
功能不是正确的工具,原因有多种:
- 使用
函数计算大数可能会溢出类型pow()
表示的大小,并且精度不会提供模数运算所需的低阶数字double
- 根据其在C库中的实现,
可能会为整型参数生成非整型值,将其转换为pow()
可能会截断为不正确的值int
操作未在%
类型上定义double
- 为避免丢失低阶位,应在每一步执行模运算
- 对于考试来说,这不是考官所期望的
unsigned exp\u mod(unsigned a、unsigned b、unsigned c){
无符号p=1%c;
而(b-->0){
p=(无符号长)p*a%c;
}
返回p;
}
对于非常大的b
,迭代将花费很长时间。下面是一个有效的求幂算法,它将时间复杂度从O(b)降低到O(log b):
unsigned exp\u mod\u fast(unsigned a、unsigned b、unsigned c)){
无符号p;
对于(p=1%c;b>0;b=b/2){
如果(b%2!=0)
p=(无符号长)p*a%c;
a=(无符号长)a*a%c;
}
返回p;
}
正如rici所建议的,对中间产品使用类型无符号长
,可以避免a
的大值的量级问题。上述函数应为a
、b
和c
的所有32位值生成正确的结果,但c==0
除外
初始步骤
p=1%c
是为c==1&&b==0
生成结果0
所必需的。一个显式测试if(c@klutt):我在回复中引用了这篇文章。这篇文章提供了伪代码和Lua中的一个实现。我认为一个c实现可能有助于程序员访问这个站点。