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 .
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
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í.
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átNebo 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ýsledekAč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.
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í.
Číselné teoretické algoritmy | |
---|---|
Testy jednoduchosti | |
Hledání prvočísel | |
Faktorizace | |
Diskrétní logaritmus | |
Hledání GCD | |
Modulová aritmetika | |
Násobení a dělení čísel | |
Výpočet druhé odmocniny |