Newton yöntemiyle ilgili sorunlardan biri, her yinelemede en yavaş temel tamsayı işlemi olan bir bölme işlemi gerektirmesidir.
Ancak Newton'un karşılıklı karekökü yöntemi böyle değildir. Eğerx bulmak istediğiniz sayıdır 1x√, yineleme:
ri+1=12ri(3−xr2i)
Bu genellikle şu şekilde ifade edilir:
wi=r2i
di=1−wix
ri+1=ri+ridi2
Bu üç çarpma işlemi. İkiye bölünme, bir vardiya hakkı olarak uygulanabilir.
Şimdi sorun şu ki rbir tamsayı değil. Bununla birlikte, kayan noktayı manuel olarak uygulayarak ve uygun olduğunda telafi etmek için bir sürü kaydırma işlemi yaparak bu şekilde değiştirebilirsiniz.
İlk olarak, yeniden ölçeklendirelim x:
x′=2−2ex
nerede isteriz x′ daha büyük, ancak 1. Yukarıdaki algoritmayı çalıştırırsakx′ onun yerine x, bulduk r=1x√′. Sonra,x−−√=2erx′.
Şimdi ayrılalım r bir mantis ve üs içine:
ri=2−eir′i
nerede r′ibir tamsayıdır. sezgisel,ei cevabın kesinliğini temsil eder.
Newton yönteminin doğru anlamlı basamak sayısını kabaca iki katına çıkardığını biliyoruz. Böylece seçebiliriz:
ei+1=2ei
Biraz manipülasyon ile buluyoruz:
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
Her yinelemede:
x−−√≈r′ix2e+ei
Örnek olarak, kare kökünü hesaplamayı deneyelim. x=263. Cevabın2312–√. Karşılıklı karekök12√2−31, bu yüzden e=31 (bu sorunun ölçeğidir) ve ilk tahminimiz için r′0=3 ve e0=2. (Yani, biz seçeriz34 ilk tahminimiz için 12√.)
Sonra:
e1=4,r′1=11
e2=8,r′2=180
e3=16,r′3=46338
e4=32,r′4=3037000481
Karşılaştırma yaparak yinelemeyi ne zaman durduracağımızı hesaplayabiliriz ei to e; if I've calculated correctly, ei>2e should be good enough. We'll stop here, though, and find:
263−−−√≈3037000481×263231+32=3037000481
The correct integer square root is 3037000499, so we're pretty close. We could do another iteration, or do an optimised final iteration which doesn't double ei. The details are left as an exercise.
To analyse the complexity of this method, note that multiplying two b-bit integers takes O(blogb) operations. However, we have arranged things so that r′i<2ei. So the multiplication to calculate wi multiplies two ei-bit numbers to produce a ei+1-bit number, and the other two multiplications multiply two ei+1-bit numbers to produce a 2ei+1-bit number.
In each case, the number of operations per iteration is O(eilogei), and there are O(loge) iterations required. The final multiplication is on the order of 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.