Luonnollisen luvun n kokonaisluvun neliöjuuri (isqrt) on positiivinen luku m , joka on yhtä suuri kuin suurin kokonaisluku, joka on pienempi tai yhtä suuri kuin n : n neliöjuuri ,
Esimerkiksi vuodesta ja .
Yksi tapa laskea ja on käyttää Newtonin menetelmää yhtälön ratkaisun löytämiseen iteratiivisen kaavan [1] [2] avulla.
Sekvenssi konvergoi neliöllisesti kohtaan [ 3 ] . Voidaan todistaa, että jos aloitusarvoksi valitaan, voidaan lopettaa heti
,varmistaakseen
Jos haluat laskea erittäin suuria kokonaislukuja n , voit käyttää osamäärän jakoa jäännöksellä molemmissa jakooperaatioissa. Etuna on vain kokonaislukujen käyttö kullekin väliarvolle, mikä vapauttaa lukujen esittämisen liukulukuina . Tämä vastaa iteratiivisen kaavan käyttöä
Perustuu siihen tosiasiaan, että
voidaan osoittaa, että sekvenssi saavuttaa äärellisen määrän iteraatioita [4] .
Se ei kuitenkaan välttämättä ole yllä olevan iteratiivisen kaavan kiinteä piste . Voidaan näyttää, mikä on kiinteä piste, jos ja vain jos se ei ole täydellinen neliö. Jos on täydellinen neliö, sekvenssi ei lähenty, vaan menee sykliin, jonka pituus on kaksi, vuorotellen muuttuen ja . Toiminnan lopettamiseksi riittää, että tarkistetaan, että sekvenssi konvergoi (toistaa edellisen arvon) tai että seuraava arvo on täsmälleen yhtä suurempi kuin nykyinen, jälkimmäisessä tapauksessa uusi arvo hylätään.
Jos *tarkoittaa kertoa, <<tarkoittaa siirtoa vasemmalle ja tarkoittaa >>loogista siirtoa oikealle, rekursiivinen algoritmi minkä tahansa luonnollisen luvun kokonaisluvun neliöjuuren löytämiseksi on seuraava:
funktio integerSqrt(n): jos n < 0: virhe "integerSqrt toimii vain ei-negatiivisen syötteen kanssa" muuten jos n < 2: paluu n muu: smallCandidate = kokonaislukuSqrt(n >> 2) << 1 isoEhdokas = pieniEhdokas + 1 jos suuriEhdokas*suuriEhdokas > n: palauta pieniEhdokas muu: palauta suuriEhdokasTai iterointi rekursion sijaan:
funktio integerSqrt(n): jos n < 0: virhe "integerSqrt toimii vain ei-negatiivisen syötteen kanssa" # Etsi suurin muutos. vaihto = 2 nSiirretty = n >> siirto kun taas nSiirretty ≠ 0 ja nSiirtynyt ≠ n: vaihto = vaihto + 2 nSiirretty = n >> siirto vaihto = vaihto - 2 # Etsi tuloksen numerot. tulos = 0 kun vaihto ≥ 0: tulos = tulos << 1 ehdokasTulos = tulos + 1 jos ehdokasTulos*ehdokasTulos ≤ n >> vaihto: tulos = ehdokasTulos vaihto = vaihto - 2 palauttaa tuloksenVaikka se on irrationaalinen luku useimmille arvoille , sekvenssi sisältää vain rationaalisia jäseniä, jos se on rationaalinen. Näin ollen tätä menetelmää käytettäessä ei tarvitse mennä rationaalisten lukujen kentän ulkopuolelle laskeakseen , jolla on teoreettista etua.
Voidaan näyttää, mikä on pysäytyskriteerin suurin luku
,mikä varmistaa, että yllä olevassa algoritmissa.
Sovelluksissa, jotka käyttävät muita muotoja kuin rationaaleja (esimerkiksi liukulukua), pysäytysvakio tulee valita pienemmäksi kuin yksi pyöristysvirheiden välttämiseksi.
Lukuteoreettiset algoritmit | |
---|---|
Yksinkertaisuustestit | |
Alkulukujen löytäminen | |
Faktorisointi | |
Diskreetti logaritmi | |
GCD:n löytäminen |
|
Modulo-aritmetiikka | |
Lukujen kerto- ja jakolasku | |
Neliöjuuren laskeminen |