Métodos para calcular raíces cuadradas

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 13 de enero de 2022; las comprobaciones requieren 4 ediciones .

Los métodos de raíz cuadrada son algoritmos computacionales para calcular los valores aproximados de las raíces cuadradas principales (o no negativas) (generalmente indicadas como , o ) de un número real. Aritméticamente, esto significa que si se da un número , el procedimiento encuentra un número que, cuando se multiplica por sí mismo, da . Algebraicamente, esto significa el procedimiento para encontrar una raíz no negativa de una ecuación . Geométricamente, esto significa construir un lado de un cuadrado con un área dada.

Cualquier número real tiene dos raíces [1] . El valor principal de la raíz cuadrada de la mayoría de los números es un número irracional con una secuencia infinita de dígitos decimales. Como resultado, la representación decimal de cualquier raíz cuadrada solo puede calcularse aproximadamente con una precisión finita (lugares decimales). Sin embargo, incluso si tomamos la raíz cuadrada de un número entero, para que el resultado tenga una representación finita, algunos de los procedimientos utilizados para calcular la raíz solo pueden devolver una serie de aproximaciones con precisión creciente.

La representación de fracción continua de un número real se puede utilizar en lugar de la expansión decimal o binaria y esta representación tiene la propiedad de que la raíz cuadrada de cualquier número racional (que no es un cuadrado perfecto) tiene un período, es decir, una expansión periódica similar a cómo los números racionales tienen expansión repetitiva del sistema numérico decimal.

Los métodos analíticos más comúnmente aceptados son iterativos y constan de dos pasos: encontrar un valor inicial adecuado y luego refinar iterativamente hasta alcanzar un cierto criterio de parada. El valor inicial puede ser cualquier número, pero si está más cerca del valor final, se requerirán menos iteraciones. El método de este tipo más famoso, e incluso más conveniente para la programación, es el método de Newton, que se basa en el cálculo de la derivada. Varios métodos, como la división manual de Horner o la expansión en serie, no requieren un valor inicial. En algunas aplicaciones, se requiere encontrar la raíz cuadrada entera , que es la raíz cuadrada redondeada al entero más cercano (en este caso, se puede usar un procedimiento modificado).

El método utilizado depende de cómo se utilizará el resultado (es decir, qué tan preciso debe ser el resultado) y qué herramientas están disponibles. Los métodos se pueden dividir aproximadamente en aquellos que se pueden hacer mentalmente, que requieren lápiz y papel, o aquellos que se implementan como un programa y se ejecutan en computadoras u otros dispositivos informáticos. Se puede tener en cuenta la velocidad de convergencia (cuántas iteraciones se requerirán para lograr una precisión determinada), la complejidad computacional de las operaciones individuales (como la división) o iteraciones y la distribución de errores (la precisión del resultado).

Los procedimientos para encontrar raíces cuadradas (en particular, la raíz de 2) se conocen desde al menos la época de la antigua Babilonia (siglo XVII a. C.). El método de Heron del siglo I en Egipto fue el primer algoritmo verificable para calcular la raíz cuadrada. Los métodos analíticos modernos comenzaron a desarrollarse después de la adopción de los números arábigos en Europa occidental a principios del Renacimiento . En estos días, casi todos los dispositivos informáticos tienen una función de raíz cuadrada rápida y precisa como una construcción de lenguaje de programación integrada, una función de biblioteca o una declaración de hardware que se basa en los procedimientos que se describen a continuación.

Puntuación inicial

Muchos algoritmos iterativos de raíz cuadrada requieren un valor aleatorio inicial. Este valor debe ser un número positivo distinto de cero. Debe estar entre 1 y , el número cuya raíz cuadrada buscamos, ya que la raíz cuadrada debe estar dentro de estos límites. Si el valor inicial está muy lejos de la raíz, el algoritmo necesitará más iteraciones. Si comienza con (o con ), funcionará con iteraciones adicionales solo para obtener el orden de la raíz. Por lo tanto, es útil tener una estimación aproximada de la raíz, que puede tener poca precisión, pero es fácil de calcular. En general, cuanto más precisa sea la estimación, más rápida será la convergencia. Para el método de Newton (también llamado método de Babilonia o de Heron), un valor inicial ligeramente mayor que la raíz proporciona una convergencia más rápida que un valor inicial menor que la raíz.

En términos generales, la estimación se considera en un intervalo arbitrario en el que se sabe que contiene una raíz (como ). Obtener una mejor estimación implica obtener límites más estrechos en el intervalo o una mejor aproximación funcional a. Esta última generalmente significa usar polinomios de orden superior para la aproximación, aunque no todas las aproximaciones usan polinomios. Los métodos de estimación comunes son escalares, lineales, hiperbólicos y logarítmicos. El sistema decimal generalmente se usa para estimar mentalmente o en papel. El sistema numérico binario es más adecuado para evaluaciones por computadora. Al evaluar, el exponente y la mantisa generalmente se tratan por separado.

Puntuación decimal

Por lo general, el número se expresa en forma exponencial como , donde , y n es un número entero, entonces una estimación de la posible raíz cuadrada puede ser , donde .

Estimaciones escalares

Los métodos escalares dividen todo el rango en contenedores y la puntuación en cada contenedor se representa con un solo número. Si el rango se trata como un solo intervalo, entonces la media aritmética (5.5) o la media geométrica () son estimaciones aceptables. Las estimaciones absolutas y relativas para estas estimaciones diferirán. En general, un solo número será muy inexacto. Más estimaciones precisas dividen el rango en dos o más intervalos, pero la estimación escalar sigue siendo muy aproximada.

Para dos intervalos divididos geométricamente, la raíz cuadrada se puede estimar como [2] .

Esta estimación tiene un error absoluto máximo en el punto = 100 y un error relativo máximo del 100 % en el punto = 1.

Por ejemplo, con una descomposición , la puntuación será . , con un error absoluto de 246 y un error relativo de casi el 70%.

Estimación lineal

La mejor estimación y el método estándar es la aproximación lineal de la función en un arco pequeño. Si, como se indicó anteriormente, el exponente se extrae del número y el intervalo se reduce a , puede usar una secante o una tangente en algún lugar del arco para aproximar, pero la regresión directa por mínimos cuadrados será más precisa.

La línea recta, obtenida por el método de los mínimos cuadrados, minimiza la distancia media entre la estimación y el valor de la función. Su ecuación es . Después de transformar y redondear los coeficientes para simplificar los cálculos, obtenemos

Esta es la mejor estimación promedio que se puede obtener con un intento de aproximación lineal de la función en el intervalo . La estimación tiene un error absoluto máximo de 1,2 en el punto a=100 y un error relativo máximo del 30 % en los puntos S=1 y 10 [3] .

Para dividir por 10, resta uno del exponente o, en sentido figurado, mueve el punto decimal una posición hacia la izquierda. Para esta fórmula, cualquier constante sumada igual a 1 más un pequeño incremento da una estimación satisfactoria, por lo que no es necesario memorizar el número exacto. La aproximación (redondeada o no redondeada) utilizando una línea recta que resta la región en términos de precisión no da más de un signo correcto. El error relativo es más de 1/2 2 , por lo que da menos de 2 bits de información. La precisión está muy limitada, ya que la región abarca dos órdenes de magnitud, que es bastante grande para este tipo de estimación.

Se puede obtener una estimación significativamente mejor usando una aproximación lineal por partes, es decir, usando varios segmentos que se aproximan al subarco del arco original. Cuantos más segmentos se utilicen, mejor será la aproximación. El uso más común de las tangentes. El punto crítico es cómo dividir el arco y dónde colocar los puntos de contacto. Un método efectivo para dividir el arco de y=1 a y=100 es el geométrico: para dos intervalos, el límite del intervalo es la raíz cuadrada del intervalo original, 1 * 100, es decir, y . Para tres intervalos habrá raíces cúbicas - , y , y así sucesivamente. Para dos intervalos, este es un número muy conveniente. Es fácil obtener rectas tangentes en los puntos de contacto y . Sus ecuaciones son: y . Invirtiendo las ecuaciones, obtenemos que las raíces cuadradas son iguales a y . Entonces para :

Los valores absolutos máximos están en los límites derechos de los intervalos, en los puntos a=10 y 100, y son iguales a 0,54 y 1,7, respectivamente. Los errores relativos máximos aparecen en los extremos de los intervalos, en los puntos a=1, 10 y 100, y son iguales al 17%. 17% o 0,17. Son mayores que 1/10, por lo que el método da una precisión de menos de un dígito significativo.

Estimación hiperbólica

En algunos casos, la estimación hiperbólica puede ser válida, ya que la hipérbola también es una curva convexa y puede ubicarse a lo largo del arco Y = x 2 mejor que una línea recta. El estimador hiperbólico es computacionalmente más difícil porque requiere la división por un número de punto flotante. Una aproximación hiperbólica casi óptima a x 2 en el intervalo es . Después de la transformación obtenemos . Entonces para :

La división de punto flotante debe tener una precisión de un decimal, ya que toda evaluación da esa precisión, y tal división se puede hacer mentalmente. La estimación hiperbólica es, en promedio, mejor que la estimación escalar o lineal. Su error absoluto máximo es 1,58 en el punto 100 y su error relativo máximo es 16,0% en el punto 10. Para el peor de los casos a=10, la puntuación es 3,67. Si comenzamos en 10 y aplicamos las iteraciones de Newton-Rapson directamente, se necesitan dos iteraciones, que arrojan 3,66, antes de alcanzar la precisión de la estimación hiperbólica. Para un caso más típico como 75, la estimación hiperbólica es 8,00 y se necesitan 5 iteraciones de Newton-Rapson a partir de 75 para obtener un resultado más preciso.

Evaluación aritmética

Un método similar a la aproximación lineal por partes, pero que usa solo operaciones aritméticas en lugar de ecuaciones algebraicas, usa la tabla de multiplicar a la inversa: la raíz cuadrada de los números entre 1 y 100 está entre 1 y 10, así que como sabemos que 25 es un cuadrado exacto (5 × 5) y 36 es un cuadrado exacto (6 × 6), entonces la raíz cuadrada de un número que es mayor que 25 pero menor que 36 comienza con el número 5. Lo mismo ocurre con los números entre otros cuadrados. Este método da el primer dígito correcto, pero su precisión es solo de un dígito: el primer dígito de la raíz cuadrada de 35, por ejemplo, es 5, pero la raíz de 35 en sí misma es casi igual a 6.

Es mejor dividir el intervalo entre dos cuadrados por la mitad. Entonces, la raíz de cualquier número entre 25 y la mitad de 36 (que es 30,5) se evalúa como 5, otros números mayores que 30,5 hasta 36 se evalúan como 6 [4] . El procedimiento requiere muy poca aritmética para encontrar el medio de dos productos de la tabla. Aquí hay una tabla de tales números:

a plaza más cercana est.
1 a 2.5 1 (= 1 2 ) una
2,5 a 6,5 4 (= 2 2 ) 2
6,5 a 12,5 9 (= 3 2 ) 3
12,5 a 20,5 16 (= 4 2 ) cuatro
20,5 a 30,5 25 (= 5 2 ) 5
30,5 a 42,5 36 (= 6 2 ) 6
42,5 a 56,5 49 (= 72 ) 7
56,5 a 72,5 64 (= 82 ) ocho
72,5 a 90,5 81 (= 9 2 ) 9
90,5 a 100 100 (= 102 ) diez

La operación final será la multiplicación de la puntuación k por la potencia de las decenas dividida por la mitad, de modo que para ,

El método proporciona una precisión de un dígito significativo porque redondea al mejor primer dígito.

El método se puede extender a 3 cifras significativas en la mayoría de los casos interpolando entre los cuadrados más cercanos. Si , entonces es aproximadamente igual a k más una fracción igual a la diferencia entre a y , dividida por la diferencia entre los dos cuadrados:

dónde

La operación final, como la anterior, es la multiplicación del resultado por la potencia de diez dividida por la mitad

El número k es el dígito decimal y R es la fracción a convertir a decimal. Una fracción generalmente tiene un dígito en el numerador y uno o dos dígitos en el denominador, por lo que la conversión a decimal se puede hacer mentalmente.

Ejemplo: encuentre la raíz cuadrada de 75. , entonces a es 75 y n es 0. Según la tabla de multiplicar, la raíz cuadrada de la mantisa debe ser 8 con una fracción porque , a , es demasiado grande. Entonces k es 8 siendo la fracción la representación decimal de R . La fracción R tiene un numerador y un denominador. 11/17 es un poco más pequeño que 12/18, que es 2/3 o 0,67, por lo que 0,66 es una buena suposición (está bien adivinar aquí ya que el error es pequeño). Entonces el valor de la raíz es . 75 a tres cifras significativas sería 8,66, por lo que una puntuación de tres cifras significativas es buena. No todas las estimaciones que utilizan este método son tan precisas, pero están bastante cerca.

Evaluación binaria

Cuando el trabajo se lleva a cabo en el sistema binario (digamos, en un procesador de computadora), se expresa como , donde , la raíz cuadrada se puede estimar como

que es una regresión de mínimos cuadrados sobre los 3 bits más significativos. tiene un error absoluto máximo de 0.0408 en el punto =2 y un error relativo máximo de 3.0% en el punto =1. Para los cálculos, es conveniente una estimación redondeada (porque los coeficientes son potencias de 2)

[5]

que tiene un error absoluto máximo de 0.086 en el punto 2 y un error relativo máximo de 6.1% en los puntos y .

Para la aproximación binaria da Desde , la estimación da un error absoluto de 19 y un error relativo de 5,3%. El error relativo es ligeramente inferior a 1/2 4 , por lo que la aproximación tiene una precisión de más de 4 bits.

Se puede obtener una estimación de hasta 8 bits buscando en la tabla los 8 bits más significativos , dado que el bit más significativo está implícito en la mayoría de las representaciones de punto flotante, y los bits menos significativos después de los 8 bits deben redondearse. La tabla contiene 256 bytes de raíces cuadradas de 8 bits precalculadas. Por ejemplo, para el índice 11101101 2 , que es 1,8515625 10 en decimal , el valor de la tabla es 10101110 2 , que es 1,359375 10 en decimal , la raíz cuadrada de 1,8515625 10 a 8 bits (2+ signo decimal).

método babilónico

Quizás el primer algoritmo utilizado para la aproximación sea el método conocido como método babilónico , aunque no hay evidencia directa, aparte de la inferencia hipotética, de que los matemáticos babilónicos usaran este método [6] . El método también se conoce como el método de Heron , en honor al matemático griego del siglo I Heron , quien dio la primera descripción explícita del método en su trabajo de 60 años Metrica [7] La ​​técnica básica es que si x es mayor que el cuadrado raíz de un número real no negativo S , entonces será menos raíz y viceversa. Por lo tanto, es razonable esperar que el promedio de estos dos números esté más cerca de la raíz (la prueba formal de este hecho se basa en la desigualdad sobre la media aritmética, geométrica y armónica , que muestra que este promedio es siempre mayor que el cuadrado raíz, lo que asegura la convergencia). El método es equivalente a usar el método de Newton para resolver la ecuación .

Más precisamente, si x es una suposición inicial para , y el error en nuestra estimación es tal que , podemos expandir los paréntesis y obtener

porque _

Por lo tanto, podemos compensar el error y actualizar nuestra estimación anterior

Dado que el error calculado no fue exacto, se convertirá en nuestra próxima aproximación. El proceso de actualización continúa hasta que alcanzamos la precisión deseada. Es un algoritmo con convergencia cuadrática , lo que significa que el número de dígitos correctos de la aproximación (en términos generales) se duplica con cada iteración. Funciona así:

  1. Empezamos con cualquier valor inicial positivo (cuanto más cerca de la verdadera raíz cuadrada de S , mejor).
  2. Igualamos el promedio entre y (usamos la media aritmética para aproximar la media geométrica ).
  3. Repita el paso 2 hasta que alcancemos la precisión deseada.

El algoritmo se puede representar de la siguiente manera:

El algoritmo también funciona bien para números p -ádicos , pero no se puede usar para identificar raíces cuadradas reales con raíces cuadradas p -ádicas. Se puede, por ejemplo, construir una sucesión de números racionales obtenida por este método que converge a +3 en el caso de los números reales, pero a -3 en los números biádicos.

Ejemplo

Para calcular S , donde S = 125348, con seis dígitos significativos, utilice el método de estimación aproximada descrito anteriormente

Por lo tanto

Convergencia

Suponga que x 0 > 0 y S > 0. Entonces, para cualquier n x n > 0. El error relativo x n se define como

y entonces

Ahora se puede demostrar que

y consecuentemente

y esto implica convergencia garantizada, y esta convergencia es cuadrática .

Convergencia en el peor de los casos

Si usamos un método de estimación aproximada con el método babilónico, los peores casos de precisión en orden descendente son:

y luego de todos modos

Los errores de redondeo debilitan la convergencia. Se recomienda almacenar al menos un dígito adicional por encima de la precisión x n deseada para minimizar los errores de redondeo.

Método Bakhshali

Este método para encontrar la aproximación de la raíz cuadrada fue escrito en un antiguo manuscrito indio llamado el manuscrito Bakhshali . El método es equivalente a dos iteraciones del método babilónico con valor inicial x 0 . Por lo tanto, el algoritmo es cuadráticamente convergente, lo que significa que el número de signos válidos de la aproximación aumenta unas cuatro veces con cada iteración [8] . La representación del algoritmo en notación moderna es la siguiente: Calcular , sea x 0 2 la aproximación inicial a la raíz S . Las iteraciones se realizan secuencialmente.

Esto se puede usar para construir una aproximación racional a la raíz cuadrada, comenzando con un número entero. Si es un entero elegido cercano a S y es la diferencia cuyo valor absoluto se minimiza, entonces la primera iteración se puede escribir de la siguiente manera:

El método de Bakhshali se puede generalizar para calcular una raíz arbitraria, incluidas las raíces fraccionarias [9] .

Ejemplo

Usemos el mismo ejemplo que se dio para el método babilónico. Sea Entonces la primera iteración da

De manera similar, la segunda iteración da

Número por número

Este es un método para encontrar secuencialmente cada dígito de la raíz cuadrada. El método es más lento que el babilónico, pero tiene algunas ventajas.

  • Es más fácil de calcular manualmente.
  • Se sabe que cada signo encontrado de la raíz es correcto, es decir, no se cambiará en las próximas iteraciones.
  • Si la representación de la raíz cuadrada tiene un número finito de dígitos, el algoritmo termina después del último dígito encontrado. Por lo tanto, se puede usar para probar que un número dado es un cuadrado perfecto .
  • El algoritmo funciona en cualquier sistema numérico y, por supuesto, el funcionamiento del algoritmo depende del sistema numérico elegido.

Los palos de Napier incluyen funciones adicionales para realizar este algoritmo. El algoritmo para calcular la raíz enésima dígito a dígito es una generalización de este método.

Principio básico

Considere primero el caso de encontrar la raíz cuadrada de un número Z , que es el cuadrado de un número de dos dígitos XY , donde X es el dígito de las decenas e Y es el dígito de las unidades. Tenemos:

Primero, definamos el valor de X . X es el dígito más grande tal que X 2 no excede a Z , del cual se eliminan los dos últimos dígitos.

En la siguiente iteración, conectamos un par de dígitos multiplicando X por 2 y colocando el resultado en la posición de las decenas, y luego tratando de averiguar a qué es igual Y.

Dado que en nuestro caso la respuesta es la raíz cuadrada exacta, el algoritmo se detiene.

La misma idea se puede extender para calcular una raíz cuadrada arbitraria. Imagina que podemos encontrar la raíz cuadrada de N como la suma de n números positivos tales que

Al reutilizar la identidad

el lado derecho se puede representar como

Esta expresión nos permite encontrar la raíz cuadrada por selección sucesiva de valores . Suponga que los números ya han sido seleccionados, entonces el término m-ésimo está dado por , donde es la aproximación encontrada a la raíz cuadrada. Ahora cada nueva selección debe satisfacer la recursividad

entonces para todos en el valor inicial Si se encuentra la raíz cuadrada exacta. Si no, entonces la suma da una aproximación adecuada a la raíz cuadrada y será un error de aproximación.

Por ejemplo, en decimal tenemos

donde son indicadores de la posición de los dígitos, y los coeficientes . En cada m-ésimo paso del cálculo de la raíz cuadrada, se encuentra una raíz cuadrada aproximada. La magnitud y los términos sumables están dados por las fórmulas

Dado que los indicadores de posición tienen una potencia par de 10, solo necesitamos trabajar con el par de dígitos más altos en el término restante en cualquier paso m-ésimo. La siguiente sección organiza este procedimiento.

Obviamente, se puede usar un método similar para calcular la raíz cuadrada en cualquier sistema numérico, no necesariamente en decimal. Por ejemplo, encontrar la raíz cuadrada dígito por dígito en binario es bastante eficiente porque el valor se busca en el pequeño conjunto de dígitos {0,1}. Esto hace que el cálculo sea más rápido, ya que en cada paso el valor es igual o igual a . El hecho de que solo haya dos posibilidades para también facilita la elección de un valor en el m-ésimo paso del cálculo. Esto se debe a que solo necesitamos verificar que para Si esta condición se cumple, tomamos ; y si no, entonces tomamos También el hecho de que la multiplicación por 2 se lleva a cabo desplazando hacia la izquierda ayuda en los cálculos.

Sistema numérico decimal

Escribamos el número original en forma decimal. Los números se escriben de forma similar a la división mediante un algoritmo de división larga y , como en la división larga, la raíz cuadrada se escribirá en la línea superior. Ahora dividamos los números en pares, comenzando con una coma, en ambos lados. El punto decimal de la raíz cuadrada estará en el punto decimal del cuadrado. Un dígito de raíz cuadrada se escribe sobre un par de dígitos de raíz cuadrada.

Comenzando desde la posición más a la izquierda, realizamos el siguiente procedimiento para cada par de dígitos:

  1. Bajamos el par más alto de dígitos no usados ​​(si se usan todos los dígitos, escribimos "00") y los escribimos a la derecha del resto del paso anterior (no hay resto en el primer paso). En otras palabras, multiplica el resto por 100 y suma dos dígitos. Este será el valor actual de c .
  2. Encuentre p , y y x así:
    • Que sea parte de la raíz ya encontrada , ignorando el punto decimal. (Para el primer paso, p = 0.)
    • Determine el mayor número tal que . Usaremos una nueva variable .
      • Tenga en cuenta que simplemente se duplica p con el dígito x adjunto a la derecha .
      • Tenga en cuenta que x se puede encontrar adivinando al azar cuál debería ser c /(20• p ), con un cálculo de prueba de y , luego x se toma más alto o más bajo dependiendo del resultado.
    • Colocamos el dígito como el siguiente dígito de la raíz, es decir, encima del par de dígitos cuadrados que se acaban de bajar. Ahora el próximo valor de p se obtiene del valor anterior usando la fórmula .
  3. Resta y de c para formar un nuevo residuo.
  4. Si el resto es cero y no hay más dígitos para bajar, el algoritmo se detiene. De lo contrario, volvemos al paso 1 y realizamos la siguiente iteración.
Ejemplos

Encuentra la raíz cuadrada de 152.2756.

1 2. 3 4 / \/ 01 52.27 56 01 1*1 <= 1 < 2*2 x = 1 01 y = x*x = 1*1 = 1 00 52 22*2 <= 52 < 23*3 x = 2 00 44 y = (20+x)*x = 22*2 = 44 08 27 243*3 <= 827 < 244*4 x = 3 07 29 y = (240+x)*x = 243*3 = 729 98 56 2464*4 <= 9856 < 2465*5 x = 4 98 56 y = (2460+x)*x = 2464*4 = 9856 00 00 El algoritmo se detiene: Respuesta 12.34

Sistema numérico binario

Esta sección utiliza el formalismo de la sección Cálculo dígito por dígito , con modificaciones menores, que y cada uno es igual a o . Ahora repasamos todo desde abajo hasta y construimos una solución aproximada como la suma de todos para los que encontramos un valor. Para determinar si o es igual a , tomamos . Si (es decir, el cuadrado de nuestra aproximación incluida no excede el cuadrado original), entonces establecemos , de lo contrario establecemos y . Para evitar elevar al cuadrado cada paso, almacenamos la diferencia y la actualizamos en cada iteración configurando c . Inicialmente configuramos para el más grande con .



Como optimización adicional, almacenamos y , dos términos en el caso de que no sea cero, en variables separadas , :

y se puede actualizar de manera eficiente en cada paso:

Darse cuenta de

, que es el resultado final devuelto por la siguiente función.

Implementación del algoritmo en lenguaje C [10] :

int32_t isqrt(int32_tn) {afirme(("el valor de entrada debe ser no negativo", n > 0)); int32_t x = n; // int32_t c = 0; // // comienza con la mayor potencia de cuatro <= n int32_t d = 1 << 30; // Establece el segundo bit más significativo en 1. // Igual que ((sin firmar)INT32_MAX + 1) / 2. mientras que (d > n) d >>= 2; while (d != 0) // para { si (x >= c + d) // si , entonces { x -= c + d; // c = (c >> 1) + d; // } más c >>= 1; // re >>= 2; // } volver c; // }

Es posible implementar un algoritmo más rápido tanto en notación binaria como decimal si se utilizan tablas para la selección, es decir, la implementación del principio de usar más memoria reduce el tiempo de ejecución [11] .

Identidad exponencial

Las calculadoras de bolsillo suelen implementar buenos programas de logaritmo exponencial y natural . Luego, el cálculo de la raíz cuadrada S se realiza utilizando las propiedades de los logaritmos ( ) y exponenciales ( ):

El denominador de la fracción corresponde a la raíz enésima . En nuestro caso, el denominador es 2. La misma identidad se usa para calcular la raíz cuadrada usando tablas de logaritmos o reglas de cálculo .

Un método iterativo con dos variables

Este método es aplicable para encontrar la raíz cuadrada de y converge mejor para . Esto, sin embargo, no es una limitación significativa para la computación en computadoras, ya que en las representaciones de números binarios en punto flotante y punto fijo es trivial multiplicar por una potencia entera de 4 y luego corregir a la potencia deseada de 2 cambiando el exponente o desplazamiento, respectivamente. Por lo tanto, se puede desplazar dentro de . Además, el siguiente método no usa divisiones generales, sino solo sumas, restas, multiplicaciones y divisiones por una potencia de dos. La última de estas acciones se implementa trivialmente. La desventaja del método es la acumulación de errores, a diferencia de los métodos iterativos con una variable como el babilónico.

Paso inicial del método

pasos iterativos

Entonces (para ).

Tenga en cuenta que la convergencia , y por lo tanto , es cuadrática.

La demostración del método es bastante sencilla. Primero reescribimos la definición iterativa como

.

Ahora, de frente, se prueba que

y por tanto la convergencia al resultado deseado está asegurada por la convergencia a 0, que, a su vez, se sigue de .

Este método fue desarrollado alrededor de 1950 por M. W. Wilks , D. J. Wheeler y S. Gill [12] para su uso en el EDSAC , una de las primeras computadoras electrónicas [13] . Posteriormente, el método se generalizó a raíces no cuadradas [14] .

Métodos iterativos para calcular el recíproco de la raíz cuadrada de un número

Los siguientes son métodos iterativos para calcular el recíproco de la raíz cuadrada de S , es decir, . Si se encuentra tal valor, lo encontramos simplemente multiplicando: . Estas iteraciones solo usan multiplicaciones y no usan divisiones. Porque los métodos son más rápidos que el método babilónico . Sin embargo, los métodos son inestables, si el valor inicial no está cerca del recíproco del valor raíz, las iteraciones divergen. Por lo tanto, puede ser ventajoso iterar primero con el método babilónico para obtener una estimación aproximada de la raíz antes de comenzar a utilizar estos métodos.

  • La aplicación del método de Newton a la ecuación produce un método que converge cuadráticamente y usa tres multiplicaciones en cada paso:
  • Otra iteración se obtiene del método Halley , que es el método del Jefe de Hogar de segundo orden. El método converge cúbicamente , pero usa cinco multiplicaciones por iteración: .
  • Cuando se trabaja con números de punto fijo , la multiplicación por 3 y la división por 8 se pueden implementar por turnos y sumas. Cuando se trabaja con coma flotante, el método de Halley se puede reducir a cuatro multiplicaciones por iteración precalculando y ajustando todas las demás constantes para compensar: , .

Algoritmo de Goldschmidt

Algunas computadoras usan el algoritmo de Goldschmidt para calcular y simultáneamente . El algoritmo de Goldschmidt encuentra más rápido que la iteración de Newton-Rapson en computadoras con operaciones de suma y multiplicación compartidas y un procesador de punto flotante canalizado o dos procesadores de punto flotante independientes [15] .

La primera forma de escribir el algoritmo de Goldschmidt comienza con

(generalmente se usa la búsqueda de tabla)

y se realizan iteraciones

hasta que esté lo suficientemente cerca de 1 o se haya realizado un número fijo de iteraciones. Las iteraciones convergen a

, .

Tenga en cuenta que puede omitir el cálculo de o , y si desea ambos, puede usarlo al final en lugar de evaluar en cada iteración.

El segundo método, que usa las operaciones combinadas de multiplicación y suma , comienza con

(generalmente se usa la búsqueda de tabla)

y se realizan iteraciones

hasta que se acerque lo suficiente a 0, o se realice un número fijo de iteraciones. Los valores convergen a

.

Serie de Taylor

Si N es una aproximación a , la mejor aproximación se puede encontrar utilizando la serie de Taylor de la función de raíz cuadrada :

El orden de convergencia es igual al número de términos utilizados en la serie. Cuando se usan dos términos, el método es equivalente al método babilónico . Cuando se usan tres términos, cada iteración usa casi tantas operaciones como las que usa la aproximación de Bakhshali , pero la convergencia es más débil. Por lo tanto, este método no es un método de cálculo particularmente eficiente. Para maximizar la tasa de convergencia, se debe elegir N para que sea lo más pequeño posible.

Expansión en fracciones continuas

Las irracionalidades cuadráticas (números de la forma , donde a , b y c son números enteros), y en particular las raíces cuadradas de números enteros, tienen fracciones continuas periódicas . A veces, el objetivo no es encontrar el valor numérico de la raíz cuadrada, sino expandirlo a una fracción continua y, por lo tanto, a su aproximación racional. Sea S un número positivo cuya raíz se encuentra. Ahora sea a la aproximación inicial y r el resto, entonces podemos escribir Como tenemos , podemos expresar la raíz cuadrada de S como

Aplicando esta expresión para al denominador de la fracción, obtenemos

notación compacta

El numerador/denominador de la expansión de fracción continua (ver a la izquierda) es difícil de escribir y también difícil de encajar en el sistema de formato de documentos existente. Por esta razón, se ha desarrollado una notación especial para representar de forma compacta las partes enteras y periódicas de las fracciones continuas. Una de esas convenciones usa la "línea discontinua" léxica para representar la barra entre el numerador y el denominador, lo que permite que la fracción se escriba horizontalmente en lugar de verticalmente:

Aquí, cada trazo horizontal (en fracción) está representado por tres trazos, dos verticales y uno horizontal, que se separan de .

Una notación aún más compacta tiene una forma especial

Para las fracciones continuas periódicas (que son todas raíces cuadradas), la parte repetida se enumera solo una vez, con una barra sobre la parte repetida:

Para 2 el valor es 1, por lo que la representación será

Siguiendo este camino, obtenemos la fracción continua generalizada para la raíz cuadrada

El primer paso para calcular dicha fracción para obtener una raíz cuadrada es sustituir la raíz y elegir el número de denominadores. Por ejemplo, en forma canónica es 1 y para 2 , es 1, entonces la fracción continua numérica para 3 denominadores es

Paso 2. La fracción continua se enrolla, un denominador a la vez, para obtener una fracción racional cuyo numerador y denominador son números enteros. El proceso de plegado se ve así (tomando los primeros tres denominadores):

Finalmente (paso 3), dividimos el numerador por el denominador de la fracción racional para obtener una aproximación de la raíz:

redondeado a tres decimales.

El valor real de la raíz 2 es 1,41 con tres dígitos significativos. El error relativo es 0,17%, por lo que una fracción racional es buena hasta casi tres decimales. Si tomamos más denominadores, obtenemos una mejora constante en la aproximación: cuatro denominadores dan una fracción , lo que da casi 4 dígitos de precisión, etc.

Las fracciones continuas están disponibles en tablas para al menos números pequeños y constantes bien conocidas. Para números arbitrarios en notación decimal, los valores precalculados son probablemente inútiles. La siguiente tabla de fracciones racionales pequeñas, llamadas convergentes , se deriva de fracciones continuas canónicas para varias constantes:

S tiro continuo ~ decimal Fracciones adecuadas
√2 _ 1.41421
3 1.73205
√5 _ 2.23607
6 2.44949
10 3.16228
1.77245
1.64872
1.27202

Nota: Todas las fracciones aplicables se enumeran hasta el denominador 99.

En general, cuanto mayor sea el denominador de una fracción racional, mejor será la aproximación. También se puede demostrar que cortar una fracción continua da como resultado una fracción racional, con una mejor aproximación a la raíz de cualquier fracción con un denominador menor o igual que el denominador de esa fracción. Por ejemplo, ninguna fracción con un denominador inferior a 70 es tan buena como 99/70 que se aproxima a √2 .

Método de secuencia de Luke

La sucesión de Lucas del primer tipo está definida por la relación recursiva

y su polinomio característico es

, tiene un discriminante y raíces

Todo esto da el siguiente valor positivo

. Entonces, si queremos obtener , podemos elegir y , y luego calcular usando y para valores grandes . La forma más eficiente de calcular y −

Salir:

y luego en :

Aproximaciones dependientes de la representación de punto flotante

El número se representa como un número de punto flotante como . Este formato de notación también se llama notación exponencial . La raíz cuadrada de este número es igual y se pueden presentar fórmulas similares para raíces cúbicas y logaritmos. Esto no simplifica la tarea, pero si solo se requiere una aproximación, entonces es una buena estimación del orden de la mantisa. Además, entendemos que algunas potencias de p pueden resultar impares, entonces en vez de trabajar con potencias fraccionarias de la base, multiplicamos por ella y le restamos uno al grado, haciéndola par. La representación refinada se convierte en , por lo que la raíz cuadrada será .

Si solo se toma la parte entera de la mantisa, esta puede tomar valores del 1 al 99 y esto puede usarse como índice en una tabla de 99 raíces precalculadas para completar la estimación. Una computadora que usa la base hexadecimal puede requerir una tabla más grande, pero usando la base 2, la tabla solo constará de tres valores: los posibles bits de la parte entera de la representación refinada de la mantisa pueden ser 01 (si el exponente es par, por lo tanto, no hay cambio, y tenga en cuenta que el punto flotante del número normalizado siempre tiene un dígito alto distinto de cero), o si el exponente era impar, 10 u 11, estos son los dos primeros bits de la mantisa original. Luego, 6,25 (= 110,01 en binario) se normaliza a una potencia par, por lo que el par de bits de la mantisa es 01, mientras que 0,625 (= 0,101 en binario) se normaliza a una potencia impar, por lo que se requiere una conversión numérica a , y luego el par de bits será 10. Nótese que el bit menos significativo de la orden se refleja en el bit más significativo de la mantisa agrupada en pares. Un exponente par tiene el bit menos significativo de cero y la mantisa cuádruple comenzará en cero, mientras que un exponente impar tendrá un 1 en el bit menos significativo y la mantisa cuádruple comenzará en 1. Entonces, cuando el exponente se reduce a la mitad, es equivalente a desplazar el bit menos significativo del exponente al primer bit de la mantisa agrupada por pares.

Una tabla con tres elementos se puede ampliar para incluir bits de mantisa adicionales. Sin embargo, en el caso de las computadoras, en lugar de calcular la interpolación en una tabla, muchas veces es mejor buscar una forma de cálculo más simple que dé los mismos resultados. Ahora todo depende de los detalles exactos del formato de representación del número y de las operaciones disponibles para obtener partes del número y trabajar con ellas. Por ejemplo, Fortran contiene una función EXPONENT(x)para obtener un título. El esfuerzo invertido en obtener una buena aproximación inicial vale la pena al eliminar las iteraciones adicionales del proceso de refinamiento que serían necesarias en el caso de una mala aproximación.

Muchas computadoras siguen el estándar de punto flotante IEEE (o una representación bastante cercana) y se puede obtener una aproximación de raíz cuadrada muy rápida como punto de partida para el método de Newton. La técnica para esta aproximación surge del hecho de que el formato de número flotante (base dos) se aproxima al logaritmo en base 2. Es decir,

Entonces, para un número de punto flotante IEEE de 32 bits (en el que el exponente tiene un desplazamiento de 127 [16] ), puede obtener un logaritmo aproximado interpretando el número como un número entero de 32 bits, multiplicándolo por y restando el desplazamiento 127, es decir

Por ejemplo, el número 1.0 en hexadecimal es 0x3F800000, que puede representarse como un número entero. Usando la fórmula anterior, obtendrá lo esperado de . Del mismo modo, obtendrá 0,5 de 1,5 (=0x3FC00000).

Para obtener la raíz cuadrada, divide el logaritmo por 2 y vuelve a convertir el resultado. El siguiente programa demuestra la idea. Tenga en cuenta que el bit menos significativo del exponente se traduce deliberadamente a la mantisa. Una forma de justificar los pasos de este programa, asumiendo que es el desplazamiento del grado y es el número de bits almacenados en la mantisa, es probar

/* Supongamos que el número flotante está en formato IEEE 754 */ #incluir <stdint.h> flotar sqrt_approx ( flotar z ) { unión { flotador f ; uint32_ti ; _ } valor = { z }; /* Convierte el tipo sin cambiar la representación de bits */ /* * Demostrar que * ((((val.i / 2^m) - b) / 2) + b) * 2^m = ((val.i - 2^m) / 2) + ((b + 1) / 2) * 2^m) * donde * b = compensación de potencia * m = número de bits en la mantisa */ valor _ yo -= 1 << 23 ; /* Resta 2^m. */ valor _ yo >>= 1 ; /* Dividir por 2. */ valor _ yo += 1 << 29 ; /* Sumar ((b + 1) / 2) * 2^m. */ valor de retorno f ; /* Interpretar como float de nuevo */ }

Las tres operaciones aritméticas que forman el núcleo de la función se pueden representar en una línea. Se puede agregar un refinamiento adicional para reducir el error relativo máximo. Por lo tanto, las tres operaciones, sin incluir la reducción a real, se pueden reescribir como

valor _ i = ( 1 << 29 ) + ( val . i >> 1 ) - ( 1 << 22 ) + a ;

donde a es un desplazamiento para reducir los errores de aproximación. Por ejemplo, con a = 0 los resultados son exactos para potencias pares de 2 (por ejemplo, 1,0), pero para otros números el resultado será algo grande (por ejemplo, 1,5 para 2,0 en lugar de 1,414... con un error del 6%). Para a = −0x4B0D2, el error relativo máximo se reduce a ±3,5%.

Si la aproximación se va a utilizar como valor inicial para el método de Newton en la ecuación , entonces es preferible la forma inversa que se muestra en la siguiente sección.

El recíproco de la raíz cuadrada

Una variante del procedimiento anterior se presenta a continuación y se puede utilizar para calcular el inverso de la raíz cuadrada, es decir, . Esta variante fue escrita por Greg Walsh. La aproximación de desplazamiento da un error relativo de menos del 4 % y el error se reduce al 0,15 % después de una iteración del método de Newton [17] . En gráficos por computadora, esta es una forma muy eficiente de normalizar un vector.

flotar invSqrt ( flotar x ) { float xhalf = 0.5f * x ; unión { flotar x ; ent i ; } tu ; tu _ x = x ; tu _ yo = 0x5f375a86 - ( u . yo >> 1 ); /* La siguiente línea se puede repetir un número arbitrario de veces para aumentar la precisión */ tu _ x = tu _ x * ( 1.5f - xmitad * u . x * u . x ); te devuelvo _ x ; }

Algunos VLSI implementan la búsqueda del recíproco de la raíz cuadrada utilizando una estimación polinomial seguida de una iteración de Goldschmidt [18] .


La raíz de un número negativo o complejo

Si , entonces su raíz principal es igual a

Si , donde a y b son números reales y , entonces su raíz principal es igual a

Esto se puede verificar elevando al cuadrado [19] [20] . Aquí

es el módulo del número S . La raíz principal de un número complejo se define como una raíz con parte real no negativa.

Véase también

Notas

  1. Además de la raíz principal, existe una raíz cuadrada negativa igual en valor absoluto a la raíz principal, pero de signo contrario, excepto en el caso del cero, cuando hay dos raíces cero idénticas.
  2. Los factores dos y seis se usan porque aproximan la media geométrica de los posibles valores inferior y superior con un número dado de dígitos: y .
  3. La estimación no redondeada tiene un error absoluto máximo de 2,65 en el punto 100 y un error relativo máximo de 26,5 % en los puntos y=1, 10 y 100
  4. Si el número está exactamente a la mitad de dos cuadrados, como 30,5, toma el número mayor, que en nuestro caso es 6
  5. Esta es la ecuación de la recta tangente a y=x 2 en el punto y=1.
  6. Fowler y Robson 1998 , pág. 376.
  7. Heath, 1921 , pág. 323–324.
  8. Bailey, Borwein, 2012 , pág. 646–657.
  9. Regresando al manuscrito Bakhshali . Blog Simply Curious (5 de junio de 2018). Consultado el 21 de diciembre de 2020. Archivado desde el original el 26 de octubre de 2020.
  10. Raíz cuadrada entera rápida por Mr. Algoritmo del ábaco de Woo (archivado)
  11. Función de raíz cuadrada entera . Consultado el 30 de diciembre de 2021. Archivado desde el original el 30 de septiembre de 2007.
  12. Wilkes, Wheeler, Gill, 1951 .
  13. Campbell-Kelly, 2009 .
  14. Gower, 1958 , pág. 142-143, 1958.
  15. Markstein, Peter (noviembre de 2004). División de software y raíz cuadrada usando algoritmos de Goldschmidt (PDF) . VI Jornadas de Números Reales y Computadores . Dagstuhl , Alemania. CiteSeerX  10.1.1.85.9648 . Archivado (PDF) desde el original el 28 de abril de 2022 . Consultado el 30 de diciembre de 2021 . Parámetro obsoleto utilizado |deadlink=( ayuda )
  16. Se suma 127 al exponente del número, lo que permite interpretar el exponente como un número sin signo.
  17. Raíz cuadrada inversa rápida . Archivado el 6 de febrero de 2009 en Wayback Machine por Chris Lomont.
  18. "Cálculo de Alta Velocidad y Doble Precisión de Recíproco, División, Raíz Cuadrada y Raíz Cuadrada Inversa" por José-Alejandro Piñeiro y Javier Díaz Bruguera 2002 (resumen)
  19. Abramowitz, Stegun, 1964 , pág. 17
  20. Cooke, 2008 , pág. 59.

Literatura

Referencias Weisstein, Eric W. Algoritmos de raíz cuadrada  (inglés) en el sitio Wolfram MathWorld .