La raíz cuadrada entera (isqrt) de un número natural n es un número positivo m , que es igual al entero más grande menor o igual a la raíz cuadrada de n ,
Por ejemplo, ya que y .
Una de las formas de calcular y es usar el método de Newton para encontrar una solución a la ecuación usando la fórmula iterativa [1] [2]
La sucesión converge cuadráticamente a en [3] . Se puede probar que si se elige como valor inicial, uno puede detenerse tan pronto como
,para asegurar eso
Para calcular números enteros muy grandes n , puede usar la división de cociente con un resto en ambas operaciones de división. La ventaja es el uso de solo números enteros para cada valor intermedio, lo que evita el uso de representar números como números de punto flotante . Esto es equivalente a usar la fórmula iterativa
Basado en el hecho de que
se puede demostrar que la secuencia alcanza en un número finito de iteraciones [4] .
Sin embargo, no será necesariamente el punto fijo de la fórmula iterativa anterior. Se puede mostrar lo que será un punto fijo si y sólo si no es un cuadrado perfecto. Si es un cuadrado perfecto, la sucesión no converge, sino que entra en un ciclo de longitud dos, cambiando alternativamente y . Para que deje de funcionar basta comprobar que o bien la sucesión converge (repitiendo el valor anterior), o bien que el siguiente valor es exactamente uno mayor que el actual, en este último caso se descarta el nuevo valor.
Si *significa multiplicar, <<significa desplazar a la izquierda y significa >>desplazar lógico a la derecha, el algoritmo recursivo para encontrar la raíz cuadrada entera de cualquier número natural es el siguiente:
función enteroSqrt(n): si n < 0: error "integerSqrt solo funciona con entrada no negativa" de lo contrario si n < 2: regreso m más: candidatopequeño = integerSqrt(n >> 2) << 1 candidato grande = candidato pequeño + 1 si granCandidato*granCandidato > n: volver pequeñoCandidato más: volver gran CandidatoO iteración en lugar de recursividad:
función enteroSqrt(n): si n < 0: error "integerSqrt solo funciona con entrada no negativa" # Encuentra el cambio más grande. cambio = 2 nDesplazado = n >> desplazamiento mientras que nShifted ≠ 0 y nShifted ≠ n: cambio = cambio + 2 nDesplazado = n >> desplazamiento turno = turno - 2 # Encuentra los dígitos del resultado. resultado = 0 mientras que el desplazamiento ≥ 0: resultado = resultado << 1 resultadocandidato = resultado + 1 si resultadocandidato*resultadocandidato ≤ n >> turno: resultado = resultadocandidato turno = turno - 2 resultado devueltoAunque es un número irracional para la mayoría de los valores , la secuencia contiene solo miembros racionales si es racional. Así, usando este método, no es necesario salirse del campo de los números racionales para calcular , lo que tiene alguna ventaja teórica.
Se puede mostrar cuál es el número más grande para el criterio de parada
,lo que asegura que en el algoritmo anterior.
En aplicaciones que utilizan formatos distintos a los racionales (por ejemplo, punto flotante), la constante de parada debe elegirse menor que uno para evitar errores de redondeo.
Algoritmos de teoría de números | |
---|---|
Pruebas de simplicidad | |
Encontrar números primos | |
Factorización | |
logaritmo discreto | |
Encontrar MCD | |
Módulo aritmético | |
Multiplicación y división de números. | |
Calcular la raíz cuadrada |