Algoritmo radice quadrata intera precisione arbitraria?


9

Esistono algoritmi subquadratici noti per il calcolo del pavimento della radice quadrata di un nintero di bit?

L'algoritmo ingenuo sarebbe qualcosa di simile

def sqrt(x):
    r = 0
    i = x.bit_length() // 2
    while i >= 0:
        inc = (r << (i+1)) + (1 << (i*2))
        if inc <= x:
            x -= inc
            r += 1 << i
        i -= 1
    return r

Questo richiede O(n)iterazioni, ognuna delle quali prevede aggiunte che sono il O(n)tempo, quindi è il O(n^2)tempo complessivo. C'è qualcosa di più veloce? So che per il caso della moltiplicazione ci sono algoritmi speciali che fanno meglio del tempo quadratico, ma non riesco a trovare nulla per le radici quadrate.


La mia risposta a qualcosa di simile potrebbe aiutare cs.stackexchange.com/a/37338/12052 . L'unico problema è che una parte dell'equazione necessaria che dovresti trovare empiricamente per modificarne la precisione.
Francesco Gramano,

@FrancescoGramano: mi dispiace, non credo che aiuti.
Aryabhata,

a proposito, questo requisito sub-quadratico fa parte di un problema più grande? Perché il diverso tra il quadratico semplice e il sub-quadratico complicato potrebbe non essere così grande in pratica. O è solo di interesse teorico?
Aryabhata,

@Aryabhata Mi dispiace non ho visto il tuo commento prima. No, non fa parte di un problema più grande, solo curiosità.
Antimonio,

Risposte:


5

È possibile utilizzare il metodo di Newton o uno qualsiasi dei numerosi altri metodi per trovare approssimazioni alle radici del polinomio .p(x)=x2c

Il tasso di convergenza per il metodo di Newton sarà quadratico, il che significa che il numero di bit corretti raddoppia in ciascuna iterazione. Ciò significa che sono sufficienti iterazioni del metodo di Newton.O(lgn)

Viene calcolata ogni iterazione del metodo di Newton

xj+1=xj(xj2c)/(2xj)=0.5xj+c2xj.

La complessità in bit della moltiplicazione è O ( b lg b ) , per moltiplicare due numeri interi a b b (ignorando i fattori lg lg b ). La complessità dei bit per la divisione (a b bit di precisione) è la stessa. Pertanto, ogni iterazione può essere calcolata in operazioni O ( n lg n ) . Moltiplicando per le iterazioni O ( lg n ) , troviamo che il tempo di esecuzione complessivo per calcolare la radice quadrata in n bit di precisione è O ( n ( lg nO (blgb)blglgbbO (nlgn)O(lgn)n . Questo è sub-quadratico.O (n(lgn)2)

Penso che un'analisi più attenta mostri che questo può essere migliorato al tempo di esecuzione di O ( n lg n ) (tenendo conto del fatto che dobbiamo solo conoscere ogni x j entro circa j bit di precisione, piuttosto che n bit di precisione) . Tuttavia, anche l'analisi più basilare mostra già un tempo di esecuzione chiaramente subquadratico.O (nlgn)xjjn


In un binario ha anche un grande tentativo iniziale utilizzando l'identità . Invece di calcolare il registro, si può approssimare il registro 2x1/2=21/2log2x come il numero di cifre in x . Ad esempio, registro 2 101011 6 . log2xxlog21010116
Nick Alger,

@DW: Ma non stiamo cercando una radice quadrata intera? Se esegui l'iterazione del metodo di Newton usando solo l'aritmetica dei numeri interi, allora abbiamo bisogno di qualche giustificazione aggiuntiva per l' affermazione , no? Altrimenti, stiamo già assumendo una precisione sufficientemente grande ... Scusate se mi manca qualcosa di ovvio. O(logn)
Aryabhata,

@DW: "Il tasso di convergenza per il metodo di Newton" non sarà quadratico se e non so cosa succede per i valori di c che non sono reali non negativi.c=0cLa tua stima per la complessità dei bit della moltiplicazione è più stretta di quanto suggerisca la seguente osservazione .Inoltre, "dobbiamo conoscere ogni entro circa" 2xj "bit di precisione".2j

@Aryabhata: Non stiamo cercando "una radice quadrata intera"; stiamo cercando "il pavimento della radice quadrata". Hai ragione sul problema aritmetico intero, anche se le stesse complessità bit valgono per le operazioni in virgola mobile.

1
@RickyDemer, sì, è un caso speciale, perché quindi la radice di p ( x )c=0p(x) ha molteplicità 2, ma quando , la radice ha molteplicità 1 così metodo di Newton non avere convergenza quadratica. Suppongo che nessuno userebbe il metodo di Newton per calcolare la radice quadrata di c = 0 (perché la radice quadrata di zero è ovviamente zero). Quindi cosa stai cercando di dire? Il tuo commento è un commento banale che viene risolto aggiungendo qualcosa alla mia risposta che dice "caso speciale la radice quadrata di zero" o c'è qualcosa di più profondo qui che mi manca? c>0c=0
DW

6

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(3xri2)

Questo è spesso espresso come:

d i = 1 - w i x r i + 1 = r i

wi=ri2
di=1wix
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=22ex

dove vorremmo che fosse maggiore di, ma vicino a, 1 . Se eseguiamo l'algoritmo sopra su x anziché su x , troviamox1xxr=1x . Quindi, .x=2erx

Adesso dividiamoci in una mantissa ed esponente:r

ri=2eiri

dove ri è 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=ri2
di=2ei+1-wi xi
xi=x22eei+1
ri + 1 =2eiri -ri d
di=2ei+1wixi2ei+1
ri+1=2eiriridi2ei+1

Ad ogni iterazione:

xrix2e+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 sceglieremor0=3ede0=2. (Cioè, scegliamo312231e=31r0=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,r1=11
e2=8,r2=180
e3=16,r3=46338
e4=32,r4=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

2633037000481×263231+32=3037000481

3037000499ei

bO(blogb)ri<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


Questa è roba fantastica. Un commento, però: la complessità bit della divisione non è asintoticamente approssimativamente uguale alla complessità bit della moltiplicazione? Quindi stai parlando di qualcosa che offre un costante miglioramento dei fattori, non un miglioramento asintotico, giusto? Non è stato del tutto chiaro dalla tua risposta.
DW

bO(blgb)O(blgb(lglgb)O(1))

1
@DW: bO(blogb)La parola "bit" appare solo una volta; altrimenti l'avrei già sottolineato.

È una questione di fattori costanti, sì. I migliori algoritmi di divisione di interi di grandi dimensioni utilizzano una tecnica molto simile all'intero algoritmo, come l'iterazione di Newton-Raphson e il raddoppio della precisione effettiva su ogni iterazione. Un loop Newton-Raphson all'interno di un loop Newton-Raphson si accumula sui fattori costanti! Ricky Demer ha ragione; Stavo pensando nella parola modello RAM. Probabilmente avrei dovuto menzionarlo.
Pseudonimo del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.