Heltalskvadratroden (isqrt) af et naturligt tal n er et positivt tal m , som er lig med det største heltal mindre end eller lig med kvadratroden af n ,
For eksempel siden og .
En af måderne at beregne og er at bruge Newtons metode til at finde en løsning på ligningen ved hjælp af den iterative formel [1] [2]
Sekvensen konvergerer kvadratisk til ved [3] . Det kan bevises, at hvis det vælges som startværdi, kan man stoppe så snart
,at sikre det
For at beregne meget store heltal n kan du bruge kvotientdivision med en rest i begge divisionsoperationer. Fordelen er brugen af kun heltal for hver mellemværdi, hvilket frigør brugen af at repræsentere tal som flydende kommatal . Dette svarer til at bruge den iterative formel
Baseret på det faktum, at
det kan vises, at sekvensen når i et endeligt antal iterationer [4] .
Det vil dog ikke nødvendigvis være det faste punkt i den iterative formel ovenfor. Man kan vise, hvad der vil være et fikspunkt, hvis og kun hvis ikke er et perfekt kvadrat. Hvis er et perfekt kvadrat, konvergerer sekvensen ikke, men går ind i en cyklus af længde to, skiftevis skiftende og . For at stoppe med at arbejde er det nok at kontrollere, at enten sekvensen konvergerer (gentagelse af den forrige værdi), eller at den næste værdi er nøjagtigt en større end den nuværende, i sidstnævnte tilfælde kasseres den nye værdi.
Hvis *middel gange, <<betyder skift til venstre og betyder >>logisk skift til højre, er den rekursive algoritme til at finde heltalskvadratroden af ethvert naturligt tal som følger:
funktion heltalSqrt(n): hvis n < 0: fejl "integerSqrt virker kun med ikke-negativ input" ellers hvis n < 2: retur n andet: smallCandidate = heltalSqrt(n >> 2) << 1 storKandidat = lilleKandidat + 1 hvis storCandidate*largeCandidate > n: returnere lilleKandidat andet: returner storKandidatEller iteration i stedet for rekursion:
funktion heltalSqrt(n): hvis n < 0: fejl "integerSqrt virker kun med ikke-negativ input" # Find det største skift. skift = 2 nSkiftet = n >> skift mens nShifted ≠ 0 og nShifted ≠ n: skift = skift + 2 nSkiftet = n >> skift skift = skift - 2 # Find cifrene i resultatet. resultat = 0 mens skift ≥ 0: resultat = resultat << 1 kandidatResultat = resultat + 1 hvis kandidatResultat*kandidatResultat ≤ n >> skift: resultat = kandidatResultat skift = skift - 2 returnere resultatSelvom det er et irrationelt tal for de fleste værdier , indeholder sekvensen kun rationelle medlemmer, hvis de er rationelle. Ved hjælp af denne metode er det således ikke nødvendigt at gå uden for feltet af rationelle tal for at beregne , hvilket har en teoretisk fordel.
Det kan vises, hvilket er det største tal for standsningskriteriet
,som sikrer, at i ovenstående algoritme.
I applikationer, der bruger andre formater end rationale (f.eks. flydende komma), skal stopkonstanten vælges til at være mindre end én for at undgå afrundingsfejl.
Talteoretiske algoritmer | |
---|---|
Enkelthedstest | |
At finde primtal | |
Faktorisering |
|
Diskret logaritme | |
Finder GCD | |
Modulo aritmetik | |
Multiplikation og division af tal | |
Beregning af kvadratroden |