ニュートン法の問題の1つは、反復ごとに除算演算が必要になることです。これは、最も遅い基本的な整数演算です。
しかし、逆平方根に対するニュートンの方法はそうではありません。が検索したい番号の場合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
これが3つの乗算演算です。2による除算は、右シフトとして実装できます。
ここで問題は、が整数ではないことです。ただし、浮動小数点を手動で実装し、必要に応じて一連のシフト操作を実行して補正することで、そのように操作できます。r
まず、再スケーリングします。x
x′=2−2ex
ここで、を1より大きく、ただし1に近くしたいとします。私たちは、上記のアルゴリズムを実行した場合のx "の代わりに、Xを、我々は見つけるR = 1をx′1x′x。次に、√r=1x√′。x−−√=2erx′
次に、を仮数と指数に分割します。r
ri=2−eir′i
ここで、は整数です。直感的に、e iは回答の精度を表します。r′iei
ニュートンの方法では、正確な有効桁数が約2倍になることがわかっています。だから私たちは選ぶことができます:
ei+1=2ei
少し操作すると、次のことがわかります。
w i = r ′ i 2 x ′ i = x
ei+1=2ei
wi=r′i2
di=2ei+1−w ′ i x ′ ix′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) operations. So the overall complexity is O(elog2e) operations, which is sub-quadratic in the number of bits in x. That ticks all the boxes.
However, this analysis hides an important principle which everyone working with large integers should keep in mind: because multiplication is superlinear in the number of bits, any multiplication operations should only be performed on integers which have the roughly the magnitude of the current precision (and, I might add, you should try to multiply numbers together which have a similar order of magnitude). Using integers larger than that is a waste of effort. Constant factors matter, and for large integers, they matter a lot.
As a final observation, two of the multiplications are of the form ab2c. Clearly it's wasteful to compute the all the bits of ab only to throw c of them away with a right-shift. Implementing a smart multiplication method which takes this into account is also left as an exercise.