Implementación de algoritmos de teoría de números/Raíz cuadrada entera

De testwiki
Ir a la navegación Ir a la búsqueda

La raíz cuadrada entera (isqrt) de un entero positivo n es un entero positivo m que es el entero menor o igual que la raíz cuadrada de n,

isqrt(n)=n.

Por ejemplo, isqrt(27)=5 porque 55=2527 y 66=36>27.

Algoritmo usando el método de Newton

Una forma de calcular n y isqrt(n) es usar el método de Newton para encontrar la solución de la ecuación x2n=0, dada por la fórmula iterativa

xk+1=12(xk+nxk),k0,x0>0.

La sucesión {xk} converge cuadráticamente a n cuando k. Se puede demostrar que si se toma x0=n como valor inicial, se puede parar tan pronto como |xk+1xk|<1 para asegurar que xk+1=n.

Pseudocódigo

función isqrt(n)
    xk0
    xk+1n
    mientras |xk+1xk|1 hacer
        xkxk+1
        xk+112(xk+nxk)
    devolver xk+1

xy significa "sustituya el valor de x por del de y", y devolver expresa el resultado del algoritmo y su terminación.

Implementación en distintos lenguajes de programación

C

#include <math.h>

unsigned int isqrt(unsigned int n){

	float x0 = 0.0f; 
	float x1 = (float)n;

	while (fabsf(x1 - x0) >= 1.0f){
		x0 = x1;
		x1 = 0.5f*(x0 + n / x0);
	}

	return (unsigned int)floorf(x1);
}