Uno dei problemi con il metodo di Newton è che richiede un'operazione di divisione in ogni iterazione, che è l'operazione intera di base più lenta.
Tuttavia, il metodo di Newton per la radice quadrata reciproca no. Se è il numero per il quale si desidera trovare 1x , iterare:1x√
ri+1=12ri(3−xr2i)
Questo è spesso espresso come:
d i = 1 - w i x r i + 1 = r i
wi=r2i
di=1−wix
ri+1=ri+ridi2
Sono tre operazioni di moltiplicazione. La divisione per due può essere implementata come spostamento a destra.
Ora il problema è che non è un numero intero. Tuttavia, è possibile manipolarlo come tale implementando manualmente il virgola mobile e facendo una serie di operazioni di spostamento per compensare, se del caso.r
Innanzitutto, ridimensioniamo :x
x′=2−2ex
dove vorremmo che fosse maggiore di, ma vicino a, 1 . Se eseguiamo l'algoritmo sopra su x ′ anziché su x , troviamox′1x′xr=1x√′ . Quindi, .x−−√=2erx′
Adesso dividiamoci in una mantissa ed esponente:r
ri=2−eir′i
dove r′i è un numero intero. Intuitivamente, rappresento la precisione della risposta.ei
Sappiamo che il metodo di Newton raddoppia approssimativamente il numero di cifre significative accurate. Quindi possiamo scegliere:
ei+1=2ei
Con un po 'di manipolazione, troviamo:
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
r ′ i + 1 =2eir ′ i -r ′ i ddi=2ei+1−w′ix′i2ei+1
r′i+1=2eir′i−r′idi2ei+1
Ad ogni iterazione:
x−−√≈r′ix2e+ei
Ad esempio, proviamo a calcolare la radice quadrata di . Ci capita di sapere che la risposta è 2 31x=263 . La radice quadrata reciproco è 12312–√, quindi imposteremoe=31(questa è la scala del problema) e per la nostra ipotesi iniziale sceglieremor′0=3ede0=2. (Cioè, scegliamo312√2−31e=31r′0=3e0=2 per la nostra stima iniziale a13412√ )
Poi:
e 2 = 8 , r ′ 2 = 180 e 3 = 16 , r ′ 3 = 46338 e 4 = 32 , r ′ 4 = 3037000481
e1=4,r′1=11
e2=8,r′2=180
e3=16,r′3=46338
e4=32,r′4=3037000481
Possiamo capire quando interrompere l'iterazione confrontando con e ; se ho calcolato correttamente, e i > 2 e dovrebbe essere abbastanza buono. Ci fermeremo qui, però, e troveremo:eieei>2e
263−−−√≈3037000481×263231+32=3037000481
3037000499ei
bO(blogb)r′i<2eiwieiei+1ei+12ei+1-bit numero.
O(eilogei)O(loge)O(2elog2e)O(elog2e)x . Questo spunta tutte le caselle.
Tuttavia, questa analisi nasconde un principio importante che tutti coloro che lavorano con numeri interi grandi dovrebbero tenere a mente: poiché la moltiplicazione è superlineare nel numero di bit, qualsiasi operazione di moltiplicazione dovrebbe essere eseguita solo su numeri interi che hanno all'incirca l'entità della precisione corrente (e , Potrei aggiungere, dovresti provare a moltiplicare i numeri che hanno un ordine di grandezza simile). L'uso di numeri interi più grandi di questo è uno spreco di sforzi. I fattori costanti contano e per i numeri interi grandi contano molto.
ab2cabc