Kokonaisluvun neliöjuuri

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 .

Algoritmi

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

Käyttämällä vain kokonaislukujakoa

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.

Bittikohtaisten operaatioiden käyttö

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 suuriEhdokas

Tai 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 tuloksen

Laskennallinen alue

Vaikka 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.

Stop Criteria

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.

Katso myös

Muistiinpanot

  1. Menetelmää kutsutaan joskus "babylonialaiseksi"
  2. Fred Akalin, Computing the Integer Square Root , 2014
  3. SG Johnson, MIT Course 18.335, Square Roots via Newton's Method , 4. helmikuuta 2015
  4. Henry Cohen. Laskennallisen algebrallisen lukuteorian kurssi. - Berliini, Heidelberg, New York: Springer, 1996. - T. 138. - S. 38-49. — (Matematiikan tutkinnon tekstit). — ISBN 3-540-55640-0 .

Linkit