nasm - 快速整数 sqrt 上限近似

标签 nasm approximation sqrt square-root upperbound

这是一个关于我的家庭作业的问题,特别是关于 NASM 的。

我正在编写一种算法来查找数字的最小整数因子。 (大于 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/2sqrt(n) .但是,我不应该知道如何使用 float ,并且通过牛顿法找到整数 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/2i <= (2^p) , 其中p = ⌈log_2(n)/2⌉或者其他的东西。 ( pn 最高有效位的一半)

最佳答案

有一个寻找平方根的迭代过程:

def approximate_sqrt(number, depth, start_val):
    for i in range(depth):
        start_val=(start_val+number/start_val)/2
    return start_val

初始猜测(start_val)越好,它收敛到合理解的速度就越快。

If start_val>sqrt(number) 

then every iterative value>sqrt(number) 

因此它提供了一个上限(类似于 start_val < sqrt(number) )。如果您的初始猜测非常接近,您可以将迭代深度减少到 1 或 2。因此,为了迭代地猜测素数候选的上限,例如你可以调用

sqrt_appr=approximate_sqrt(i, 1, sqrt_appr+1) 

对于下一个素数候选者,先前估计为 sqrt_appr 的平方根并获得误差约为 10E-6 的上限. (虽然每次我检查近似值的接近程度时,我都会设置 sqrt_appr=sqrt(number)+1 来重置过程。)

关于nasm - 快速整数 sqrt 上限近似,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42732225/

相关文章:

gcc - 无法找到 crtn.o,在 64 位系统上链接 32 位代码

c - C 语言泰勒级数逻辑

math - Swift 中的通用平方根

c++ - 特定的直角三角形在 Cpp 中未被识别为直角

assembly - x86组件: Why Do I Need Stack Frames?

linux - ebx 寄存器在 NASM 中不起作用,但 ecx 可以工作

assembly - 在 NASM 汇编中对数字进行平方而不进行乘法

opencv - 使用线条的简单绘图的近似照片

javascript - SVG:将圆弧转换为三次贝塞尔曲线

algorithm - 如何计算和存储 sqrt(n) 最多 10^6 位小数的数字?