牛顿方法的问题之一是它在每次迭代中都需要除法运算,这是最慢的基本整数运算。
但是,牛顿的平方根倒数方法却没有。如果是您要查找的数字1x,迭代:1x√
ri+1=12ri(3−xr2i)
通常表示为:
d i = 1 − w i x r i + 1 = r i + r i d i
wi=r2i
di=1−wix
ri+1=ri+ridi2
那是三个乘法运算。除以二可以实现为右移。
现在的问题是不是整数。但是,您可以通过手动实现浮点,并在适当的时候进行大量的移位操作来进行补偿,从而进行操作。r
首先,让我们重新缩放:x
x′=2−2ex
x′1x′xr=1x√′x−−√=2erx′
r
ri=2−eir′i
r′iei
我们知道,牛顿的方法使精确有效数字的数量大约增加了一倍。因此我们可以选择:
ei+1=2ei
经过一点操作,我们发现:
ei+1=2ei
wi=r′i2
x′i=x22e−ei+1
di=2ei+1−w′ix′i2ei+1
r′i+1=2eir′i−r′idi2ei+1
在每次迭代中:
x−−√≈r′ix2e+ei
x=2632312–√12√2−31e=31r′0=3e0=23412√
然后:
e1=4,r′1=11
e2=8,r′2=180
e3=16,r′3=46338
e4=32,r′4=3037000481
eieei>2e
263−−−√≈3037000481×263231+32=3037000481
3037000499ei
bO(blogb)r′i<2eiwieiei+1ei+12ei+1位数字。
O(eilogei)O(loge)O(2elog2e)O(elog2e)x
但是,此分析隐藏了一个重要原则,每个使用大整数的人都应记住:因为乘法的位数是超线性的,所以任何乘法运算都只能在具有当前精度大小的整数上执行(并且,我可能会补充,您应该尝试将数量级相似的数字相乘)。使用大于该整数的整数会浪费精力。常数因子很重要,对于大整数,它们非常重要。
ab2cabc