Rădăcină pătrată întreagă

Rădăcina pătrată întreagă (isqrt) a unui număr natural n este un număr pozitiv m , care este egal cu cel mai mare număr întreg mai mic sau egal cu rădăcina pătrată a lui n ,

De exemplu, din moment ce și .

Algoritm

Una dintre modalitățile de a calcula și este de a folosi metoda lui Newton pentru a găsi o soluție a ecuației folosind formula iterativă [1] [2]

Secvența converge pătratic la [ 3] . Se poate dovedi că, dacă este ales ca valoare inițială, se poate opri imediat

,

a se asigura ca

Folosind doar diviziunea întregi

Pentru a calcula pentru numere întregi foarte mari n , puteți utiliza diviziunea de coeficient cu un rest în ambele operațiuni de împărțire. Avantajul este utilizarea numai a numerelor întregi pentru fiecare valoare intermediară, ceea ce eliberează utilizarea reprezentării numerelor ca numere în virgulă mobilă . Acest lucru este echivalent cu utilizarea formulei iterative

Pe baza faptului că

se poate arăta că şirul ajunge într-un număr finit de iteraţii [4] .

Cu toate acestea, nu va fi neapărat punctul fix al formulei iterative de mai sus. Se poate arăta ce va fi un punct fix dacă și numai dacă nu este un pătrat perfect. Dacă este un pătrat perfect, secvența nu converge, ci intră într-un ciclu de lungime doi, schimbându-se alternativ și . Pentru a opri funcționarea, este suficient să verificați fie că secvența converge (repetând valoarea anterioară), fie că următoarea valoare este exact cu una mai mare decât cea actuală, în acest din urmă caz ​​noua valoare fiind aruncată.

Folosind operații pe biți

Dacă *înseamnă înmulțire, <<înseamnă deplasare la stânga și înseamnă >>deplasare logică la dreapta, algoritmul recursiv pentru găsirea rădăcinii pătrate întregi a oricărui număr natural este următorul:

funcția integerSqrt(n): dacă n < 0: eroare „integerSqrt funcționează numai cu intrare nenegativă” altfel, dacă n < 2: întoarcere n altceva: smallCandidate = integerSqrt(n >> 2) << 1 candidat mare = candidat mic + 1 dacă candidat mare*candidat mare > n: return smallCandidate altceva: return largeCandidate

Sau iterație în loc de recursivitate:

funcția integerSqrt(n): dacă n < 0: eroare „integerSqrt funcționează numai cu intrare nenegativă” # Găsiți cea mai mare tură. deplasare = 2 n Deplasat = n >> deplasare în timp ce nShifted ≠ 0 și nShifted ≠ n: shift = shift + 2 n Deplasat = n >> deplasare shift = shift - 2 # Găsiți cifrele rezultatului. rezultat = 0 în timp ce schimbarea ≥ 0: rezultat = rezultat << 1 candidateResult = rezultat + 1 dacă candidateResult*candidateResult ≤ n >> shift: rezultat = candidateResult shift = shift - 2 returnează rezultatul

Zona de calcul

Deși este un număr irațional pentru majoritatea valorilor , secvența conține numai membri raționali dacă este rațional. Astfel, folosind această metodă, nu este necesar să ieși din câmpul numerelor raționale pentru a calcula , ceea ce are un anumit avantaj teoretic.

Criterii de oprire

Se poate arăta care este cel mai mare număr pentru criteriul de oprire

,

ceea ce asigură că în algoritmul de mai sus.

În aplicațiile care utilizează alte formate decât cele raționale (de exemplu, virgulă mobilă), constanta de oprire trebuie aleasă să fie mai mică de unu pentru a evita erorile de rotunjire.

Vezi și

Note

  1. Metoda este uneori numită „babilonian”
  2. ^ Fred Akalin, Computing the Integer Square Root , 2014
  3. SG Johnson, MIT Curs 18.335, Square Roots via Newton's Method , 4 februarie 2015
  4. Henry Cohen. Un curs în teoria numerelor algebrice computaționale. - Berlin, Heidelberg, New York: Springer, 1996. - T. 138. - S. 38-49. — (Texte universitare de matematică). — ISBN 3-540-55640-0 .

Link -uri