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]

Viz také

Reference

externí odkazy