Celočíselná odmocnina - Integer square root - Wikipedia
v teorie čísel, druhá odmocnina (isqrt) z kladné celé číslo n je kladné celé číslo m který je největší celé číslo menší nebo rovno do odmocnina z n,
Například, protože a .
Algoritmus využívající Newtonovu metodu
Jeden způsob výpočtu a je použít Newtonova metoda najít řešení pro rovnici , což dává iterativní vzorec
The sekvence konverguje kvadraticky na tak jako . Je dokázáno, že pokud je vybrán jako počáteční odhad, lze zastavit, jakmile
zajistit to
Používá se pouze celočíselné dělení
Pro výpočet pro velmi velká celá čísla n, lze použít podíl z Euklidovské dělení pro obě operace divize. To má tu výhodu, že se pro každou mezilehlou hodnotu používají pouze celá čísla, a proto se používá plovoucí bod reprezentace velkého počtu zbytečné. Je to ekvivalentní použití iteračního vzorce
Použitím skutečnosti, že
lze ukázat, že to dosáhne v konečném počtu iterací.
Nicméně, není nutně a pevný bod výše uvedeného iteračního vzorce. Je skutečně možné ukázat, že je pevný bod právě tehdy, když není dokonalý čtverec. Li je dokonalý čtverec, posloupnost končí v cyklu dvou období mezi a místo konvergence.
Doména výpočtu
Ačkoli je iracionální pro mnoho , sekvence obsahuje pouze Racionální podmínky kdy je racionální. U této metody tedy není nutné opouštět pole racionálních čísel za účelem výpočtu , což má některé teoretické výhody.
Kritérium zastavení
Dá se to dokázat je největší možné číslo, pro které je kritérium zastavení
zajišťuje ve výše uvedeném algoritmu.
V implementacích, které používají formáty čísel, které nemohou přesně reprezentovat všechna racionální čísla (například s plovoucí desetinnou čárkou), by měla být použita konstantní konstanta menší než jedna k ochraně před chybami zaokrouhlování.
Příklad implementace v C
// Druhá odmocnina celého číslanepodepsaný dlouho int_sqrt ( nepodepsaný dlouho s ){ nepodepsaný dlouho x0 = s >> 1; // Počáteční odhad // Kontrola duševního zdraví -li ( x0 ) { nepodepsaný dlouho x1 = ( x0 + s / x0 ) >> 1; // Aktualizace zatímco ( x1 < x0 ) // Tím se také zkontroluje cyklus { x0 = x1; x1 = ( x0 + s / x0 ) >> 1; } vrátit se x0; } jiný { vrátit se s; }}
Algoritmus číslice po číslici
Tradiční algoritmus pero a papír pro výpočet druhé odmocniny je založen na práci z míst s vyššími číslicemi na nižší a s každou novou číslicí vyberte největší, které bude stále přinášet čtverec . Pokud se zastavíte za místem někoho, bude vypočítaným výsledkem celá druhá odmocnina.
Použití bitových operací
Pokud pracujete v základna 2 „je volba číslice zjednodušena na volbu mezi 0 („ malý kandidát “) a 1 („ velký kandidát “) a manipulace s číslicemi lze vyjádřit pomocí operací binárního posunu. S *
množení, <<
při levém posunu a >>
být logickým posunem doprava, a rekurzivní algoritmus k vyhledání celé odmocniny jakéhokoli čísla přirozené číslo je:
def integer_sqrt(n: int) -> int: tvrdit n >= 0, "sqrt funguje pouze pro nezáporné vstupy" -li n < 2: vrátit se n # Rekurzivní volání: small_cand = integer_sqrt(n >> 2) << 1 large_cand = small_cand + 1 -li large_cand * large_cand > n: vrátit se small_cand jiný: vrátit se large_cand# ekvivalentně:def integer_sqrt_iter(n: int) -> int: tvrdit n >= 0, "sqrt funguje pouze pro nezáporné vstupy" -li n < 2: vrátit se n # Najděte částku směny. Viz také [[najít první sadu]], # shift = strop (log2 (n) * 0,5) * 2 = strop (ffs (n) * 0,5) * 2 posun = 2 zatímco (n >> posun) != 0: posun += 2 # Odviňte smyčku nastavení bitů. výsledek = 0 zatímco posun >= 0: výsledek = výsledek << 1 large_cand = ( výsledek + 1 ) # Stejné jako výsledek ^ 1 (xor), protože poslední bit je vždy 0. -li large_cand * large_cand <= n >> posun: výsledek = large_cand posun -= 2 vrátit se výsledek
Tradiční prezentace algoritmu digit-by-digit perem a papírem zahrnují různé optimalizace, které nejsou obsaženy ve výše uvedeném kódu, zejména trik předčtení čtverce předchozích číslic, díky kterému je obecný krok násobení zbytečný. Vidět Metody výpočtu druhé odmocniny § Woo počítadlo například.[1]