Calcola la radice quadrata usando (bit) aggiunte e spostamenti come primitive


8

Domanda: Dato un -bit numero naturale , come calcolare utilizzando solo aggiunte e turni (bit)?nNNO(n)

Il consiglio è di usare la ricerca binaria. Tuttavia, non sono riuscito a raggiungere la complessità richiesta (ho ottenuto ).O(n2)


Cosa significa using only $O(n)$ (bit) additions and shifts:

Questo è un esercizio in un libro sugli algoritmi.
A mio avviso, significa che aggiungere due, diciamo -bit, i numeri naturali costa e spostare a, diciamo -bit, il numero naturale costa anche . Poi ci sono solo permesso di utilizzare tale operazioni volte. Non menziona il costo del confronto. Suppongo che possiamo ignorarlo o supporre che il confronto di due, diciamo bit, numeri naturali costa anche .nO(1)nO(1)O(1)O(n)
nO(1)


Il mio algoritmoO(n2) :

  1. Determina l'intervallo del numero di bit di : Pertanto, tN
    2n12N2n22n12N2n2
    t1n12+1tn2+1t2.
  2. Ricerca binaria: trova N tra 2t1 e 2t2 usando la ricerca binaria. Per ciascun numero x , per calcolare x2 con aggiunte e spostamenti come primitivi e confrontarlo con N .

La complessità è quindi per tempi di ricerca binaria e calcolo , ciascuno dei quali a sua volta prende aggiunte e spostamenti.O(n×n)=O(n2)O(n)x2O(n)

Risposte:


7

Un algoritmo iterativo sembra che dovrebbe funzionare.

Sia . Supponiamo di sapere che è l'approssimazione intera a , cioè , e supponiamo di conoscere il valore di (ottenuto in precedenza).M=N/4xMx=Mx2

Ora vogliamo trovare . Quali sono i possibili valori di ? Sono abbastanza sicuro che gli unici valori possibili siano oppure . Ed è facile provarli entrambi e vedere quale è corretto. In particolare, per , abbiamo , che può essere ottenuto da mediante due spostamenti a sinistra ( ); per , abbiamo , che può essere ottenuto da e con quattro turni a sinistra e due aggiunte ( ). Ora confronta questi due valori cony=Nyy=2xy=2x+1y=2xy2=4x2x2O(1)y=2x+1y2=4x2+4x+1x2xO(1)N per vedere quale è corretto.

In questo modo, otteniamo un algoritmo iterativo in cui eseguiamo iterazioni e in cui ogni iterazione richiede tempo . Il tempo di esecuzione totale è , come richiesto.n/2O(1)O(n)

Mi rendo conto che questo non ha usato la ricerca binaria. Oh bene.


Bello! Grazie. Va bene non usare la ricerca binaria. Un nitpicking: prendendo , abbiamo , e . Tuttavia, . Pertanto, può essere oppure . Inoltre, l'idea chiave di riutilizzare quando si calcola nel proprio algoritmo potrebbe essere applicabile anche per il secondo passaggio dell'algoritmo . Lascio questo aperto per un giorno o due. N=9y=N=3M=N/4=2x=M=2y=2x1y=2xy=2x±1x2y2O(n2)
hengxin,

3

Stiamo parlando di numeri interi qui? Dove N è lungo n bit?

A = 2(n/2), B = A  and C = A2
Step: B = B/2
     If C > N,  
         C = C - 2AB + B2    // too high - make smaller
         A = A - B
     Else 
         C = C + 2AB + B2   // keep this bit
         A = A + B                 
Repeat until B = 0                  // =1 on last loop

Il loop viene eseguito n / 2 volte, il che dovrebbe fornire prestazioni O (n)

Modifica: come funziona e perché?
Questa è una versione di Successive Approximation, utilizzata anche negli algoritmi CORDIC.
A partire dal bit singolo più grande possibile (con un quadrato inferiore a N) si imposta un bit alla volta e si calcola il nuovo quadrato.
Se il nuovo quadrato è ancora inferiore a N, mantieni il bit come impostato.
Se il nuovo quadrato è troppo grande, cancella il bit, annulla l'effetto di aggiungerlo e passa al bit successivo.

Esempio: N = 441 (1 1011 1001 binario), n = 9

Start:  A = 24 = 16 (1 0000)  B = 16 C = 256 (100 0000)

1   B = 8 (1000) C = 256 + 2(16)(8) + (8)(8) = 576 (10 0100 0000) {high}
    A = 16 + 8 = 24
2   B = 4  (100) C = 576 - 2(16)(4) + (4)(4) = 400 (1 1001 0000) {low}
    A = 24 - 4 = 20
3   B = 2   (10) C = 400 + 2(20)(2) + (2)(2) = 484  (1 1110 0100) {high}
    A = 20 + 2 = 22
4   B = 1    (1) C = 484 - 2(20)(1) + (1)(1) = 441  (1 1011 1001) {keep this}
    A = 22 - 1 = 21
5   B = 1/2 or 0 in integer math; end

Benvenuti in Informatica ! Nota che puoi usare LaTeX qui per comporre la matematica in un modo più leggibile. Vedi qui per una breve introduzione.
FrankW,

Una spiegazione, perché (e come) funziona questo algoritmo sarebbe buona.
FrankW,

0

Il metodo principale è quello di riempire i bit di da sinistra a destra, mantenendo la nostra stima di sotto di essa, o meglio, la piazza della nostra stima di sotto . Ogni bit una potenza di 2, quindi quadrare o moltiplicare un altro numero per è sempre un bit shift. NNbb

Se la stima corrente è , e conosciamo già , otteniamo e possiamo riscrivere il secondo e il terzo termine come e . Poi aggiungiamo tutto e di prova (suppongo che si può fare ) e impostare il bit se la piazza è ancora al di sotto .ab=2ia2(a+b)2=a2+2ab+b2a<<(i+1)1<<(i<<1)<iN

Si comincia il ciclo presso e contiamo fino a zero, mantenendo e , come andiamo. È una specie di ricerca binaria, ma quella in cui i limiti sono associati a differenze a bit singolo.i=n/2=n>>1aa2


-3

Mi piace la risposta di Alan Campbell : con un'attenta traccia delle ipotesi precedenti, la nuova sottrazione è facile ogni volta, e la radice quadrata binaria di spostamento e aggiunta è più veloce di una divisione binaria di spostamento e aggiunta.

Ma potrebbe essere possibile andare più veloce, invece di rendere la tua prossima ipotesi una singola cifra binaria, invece usando un algoritmo "Ab" x "Ab" e rendendo la tua prossima ipotesi la media della tua ipotesi precedente e il numero originale diviso dall'ipotesi precedente. Sembra che ci vorrebbe più tempo, non più breve. Tuttavia, la divisione non deve essere esatta. Quindi, se la divisione corre solo alla radice quadrata del numero di cifre rimanenti da trovare, allora potresti effettivamente risparmiare tempo. Inoltre, se per la tua divisione usi il metodo francese, di divisione abbreviata, potresti effettivamente rompere la velocità nel tuo calcolo per divisioni davvero grandi.

Ora, se aggiungiamo calcoli in parallelo che producono risultati correggibili preliminari prima che venga trovata la risposta ... allora potremmo essere su qualcosa.


1
Tutto ciò suona molto speculativo. Hai una risposta più definita?
Yuval Filmus,

Sembra un commento di lunga durata.
Raffaello

@Raphael Bene, è una risposta parziale. Non buono, perché è estremamente speculativo, ma è più che una critica alla risposta di Alan.
Gilles 'SO- smetti di essere malvagio' il
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.