Celá odmocnina

Celá odmocnina (isqrt) přirozeného čísla n je kladné číslo m , které se rovná největšímu celému číslu menšímu nebo rovnému druhé odmocnině z n ,

Například od a .

Algoritmus

Jedním ze způsobů výpočtu a je použít Newtonovu metodu k nalezení řešení rovnice pomocí iteračního vzorce [1] [2]

Posloupnost konverguje kvadraticky k [3 ] . Lze dokázat, že pokud je zvolena jako výchozí hodnota, lze okamžitě přestat

,

abychom to zajistili

Použití pouze celočíselného dělení

Pro výpočet pro velmi velká celá čísla n můžete použít podílové dělení se zbytkem v obou operacích dělení. Výhodou je použití pouze celých čísel pro každou mezihodnotu, což osvobozuje od používání reprezentace čísel jako čísel s pohyblivou řádovou čárkou . To je ekvivalentní použití iteračního vzorce

Na základě toho, že

lze ukázat, že sekvence dosáhne v konečném počtu iterací [4] .

Nebude to však nutně pevný bod výše uvedeného iteračního vzorce. Jeden může ukázat, co bude pevným bodem tehdy a jen tehdy , když to není dokonalý čtverec. Jestliže je dokonalý čtverec, posloupnost nekonverguje, ale jde do cyklu délky dvě, střídavě se mění a . K zastavení práce stačí zkontrolovat, že buď sekvence konverguje (opakování předchozí hodnoty), nebo že další hodnota je přesně o jednu větší než aktuální, v druhém případě se nová hodnota zahodí.

Použití bitových operací

Pokud *znamená násobit, <<znamená posun doleva a znamená >>logický posun doprava, rekurzivní algoritmus pro nalezení celé druhé odmocniny libovolného přirozeného čísla je následující:

funkce integerSqrt(n): pokud n < 0: chyba "integerSqrt funguje pouze s nezáporným vstupem" jinak pokud n < 2: vrátit n jiný: smallCandidate = integerSqrt(n >> 2) << 1 velký Kandidát = malý Kandidát + 1 if largeCandidate*largeCandidate > n: vrátit malý Kandidát jiný: vrátit velkýKandidát

Nebo iterace místo rekurze:

funkce integerSqrt(n): pokud n < 0: chyba "integerSqrt funguje pouze s nezáporným vstupem" # Najděte největší posun. posun = 2 nPosunuto = n >> posun zatímco nPosunuto ≠ 0 a nPosunuto ≠ n: posun = posun + 2 nPosunuto = n >> posun posun = posun - 2 # Najděte číslice výsledku. výsledek = 0 zatímco posun ≥ 0: výsledek = výsledek << 1 kandidátVýsledek = výsledek + 1 pokud kandidátResult*candidateResult ≤ n >> posun: výsledek = kandidátVýsledek posun = posun - 2 vrátit výsledek

Výpočetní oblast

Ačkoli je pro většinu hodnot iracionální číslo , posloupnost obsahuje pouze racionální členy, je-li racionální. Při použití této metody tedy není nutné jít mimo obor racionálních čísel, abychom mohli počítat , což má určitou teoretickou výhodu.

Kritéria zastavení

Lze ukázat, které je největší číslo pro kritérium zastavení

,

což zajišťuje, že ve výše uvedeném algoritmu.

V aplikacích, které používají jiné formáty než racionální (například s plovoucí desetinnou čárkou), by měla být koncová konstanta zvolena menší než jedna, aby se předešlo chybám při zaokrouhlování.

Viz také

Poznámky

  1. Metoda se někdy nazývá „babylonská“
  2. Fred Akalin, Computing the Integer Square Root , 2014
  3. SG Johnson, kurz MIT 18.335, druhé odmocniny pomocí Newtonovy metody , 4. února 2015
  4. Henry Cohen. Kurz výpočetní algebraické teorie čísel. - Berlín, Heidelberg, New York: Springer, 1996. - T. 138. - S. 38-49. — (Absolventské texty z matematiky). — ISBN 3-540-55640-0 .

Odkazy