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 .
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
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ă.
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 largeCandidateSau 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ă rezultatulDeș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.
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.
Algoritmi teoretici numerelor | |
---|---|
Teste de simplitate | |
Găsirea numerelor prime | |
Factorizarea | |
Logaritm discret | |
Găsirea GCD | |
Modul de aritmetică | |
Înmulțirea și împărțirea numerelor | |
Calcularea rădăcinii pătrate |