如何计算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类型上定义 为避免丢失低阶位,应在每一步执行模运算 对于考试来说,这不是考官所期望的

我想计算ab mod c,其中
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实现可能有助于程序员访问这个站点。