我正在寻找一种更有效的方法来查找128位数的整数平方根... 需要使用NN Library我将使用它的平台之一,没有足够的内存用于BigNum或MPZ
void NN_SquareRoot(NN_DIGIT *output, NN_DIGIT *input, int digits)
{
NN_DIGIT divisor[NS*2], Temp[NS*2], Temp2[NS*2], Temp3[NS*2];
int t;
int i;
int g;
unsigned char temp3[16];
NN_AssignZero(Temp2,NS);
for(t=0;t<digits;t++){
for(i=0;i<=255;i++){
temp3[t]=i;
NN_AssignZero(Temp,NS);
NN_Decode(Temp,16,temp3,NS/2);
NN_Mult(Temp2,Temp,Temp,NS/2);
if(NN_Cmp(input,Temp2,digits)==-1){
if(i!=0)temp3[t]=i-1;
if(t<digits)break;
t++;
i=0;
}
}
}
NN_Copy(output,Temp,NS);
}
答案 0 :(得分:0)
Charles Ma已经建议进行二进制搜索,只需要64次迭代(需要记录时间,并且平方根必须是&lt; = 64位,因为结果不适合128位)。
您可以加快查找输入中设置的第一位i
,然后您知道结果中设置的第一位必须为i/2
。因此,在进行二进制搜索时,您可以将时区间隔从i
限制为i*2-1
。这可以进一步减少迭代次数。
二进制搜索非常简单:从间隔开始,检查中间元素的平方是否为输入。如果是这样停止并以root身份输出,否则取决于它是小还是大,重复使用新的间隔(旧的最小,中间)或(中间,旧的最大)。 (有很多关于二进制搜索的资源,我想我不需要在这里详细说明它)