这是一个关于我的作业,特别是关于NASM的问题。快速整数sqrt上限近似
我正在写一个算法来查找数字的最小整数。 (大于1)
在伪代码可以概括为:
if(n%2==0)
return 2;
for(i=3; i <= n/2; i+=2)
if(n%i==0)
return i;
return n;
该方案是仅比为大量的要求稍微慢一些。 (n
> 1 000 000 000)
最明显的(对我来说)改进将取代n/2
与sqrt(n)
。然而,我不应该知道如何使用浮点数,并且通过牛顿的方法找到整数sqrt似乎过分。 (因为我实际上并不需要知道确切的值,虽然我没有测试它,但我会想象找到isqrt递归地/迭代地会很慢)
所以我想知道,是否有快速算法的一些功能,如sqrt(n) < f(n) < n/2
。 “快”我的意思是最好是恒定的时间,由f(n) < n/2
我的意思是大大减少大n
。
一些我正在考虑的选项有:
检查,为
i <= min(sqrt(2^32), n/2)
,其中sqrt(2^32) = 2^16
是一个常数。用
i <= n/2
替换i <= (2^p)
,其中p = ⌈log_2(n)/2⌉
什么的。 (p
是n
最显著位的一半的位置)
我想你的意思是'我*我<= n'。我肯定会尝试这一点,当我回家时,但不会执行大约50000次额外的乘法操作,比我提到的'log_2'选项慢,即使它节省了一些迭代时间。 – RuRo
好的,我可能做错了什么,但是在循环中计算'i * i'时算法变慢了。在最坏的情况下(大素数)它会持续5秒左右。相同的输入我的旧版本大约2秒。我最终选择的算法得到的是0.025s。无论如何,感谢你的努力。 – RuRo