这是牛顿法计算平方根的典型应用n。您正在计算序列的限制:
x_0 = n
x_{i+1} = (x_i + n / x_i) / 2
您的变量x是当前术语x_i,您的变量y是n / x_i.
要了解为什么必须计算此限制,您需要考虑以下函数:
f(x) = x^2 - n
你想找到这个函数的根。它的导数是
f'(x) = 2 * x
和牛顿的方法给你公式:
x_{i+1} = x_i - f(x_i) / f'(x_1) = ... = (x_i + n / x_i) / 2
为了完整起见,我在这里复制了@rodrigo 回答的基本原理,并结合了我对它的评论。如果您想忘记牛顿法并尝试单独理解此算法,这将很有帮助。
诀窍是,如果x不是 的平方根n,那么它是一个近似值,位于实根之上或之下,并且y = n/x总是在另一边。因此,如果您计算 的中点(x+y)/2,它将比这两个近似值(x或y)中最差的一个更接近实根。当x和y足够接近时,你就完成了。
这也将帮助您找到算法的复杂性。假设这d是两个近似值中最差的一个到真实根的距离r。然后中点之间的距离(x+y)/2最多r为d/2(如果你画一条线来可视化它会帮助你)。这意味着,每次迭代,距离减半。因此,最坏情况的复杂度与初始近似的距离和所寻求的精度成对数。对于给定的程序,它是
log(|n-sqrt(n)|/epsilon)