【发布时间】:2015-02-08 05:45:53
【问题描述】:
我哪里弄错了? c/c++ 中的 pow(double,double) 函数在 O(log n) 时间内运行,这意味着计算长数字的幂不需要明显的时间。我编写了一个函数来以对数时间计算 a^b mod m,这又比预期的要长。 函数定义为:
float pow(float a,float n,float m){
float temp,temp2;
if(n==0)
return 1;
temp=pow(a,n/2,m);
if(fmod(n,2)==0){
if(temp>m){
temp=fmod(temp,m);
}
temp2=temp*temp;
if(temp2>m)
temp2=fmod(temp2,m);
return temp2;
}
else{
if(temp>m){
temp=fmod(temp,m);
}
temp2=temp*temp*a;
if(temp2>m)
temp2=fmod(temp2,m);
return temp2;
}
}
如果我调用 pow(10^9,10^9,123) 我希望它以 ~ O(log(10^9)) 复杂度运行,因此在我的计算机上完成不到 1 秒(O(10^8)运行 1 秒)。但它就像永远一样。 std::pow(double,double) 也是如此。
【问题讨论】:
-
你递归直到一个浮点数,反复除以 2,变成 0?真的吗?
-
对此我很抱歉。但这不是问题。我只传递 n 的整数值。现在会更新。 @hobbs
-
fmod的复杂度是多少? -
这里使用大 O 表示法不太正确。 O(10^8) 和 O(1) 是一样的。
-
将函数命名为与标准函数相同是不好的