Cálculo de raíz cuadrada dígito a dígito

Publicado por Andrea Navarro en

En este artículo veremos el algoritmo de cálculo dígito a dígito para la resolución de raíces cuadradas y su implementación en diferentes lenguajes de programación

El método de cálculo de raíces dígito a dígito es un procedimiento que permite obtener la raíz cuadrada de cualquier número. Este es un algoritmo iterativo en el que obtiene un dígito del resultado en cada iteración. Es aplicable tanto en raíces enteras como números irracionales.

Resolución para número entero

Resolución para número irracional

Raíces de resolución entera: pasos de cálculo

Paso 1:

  • Colocar el radicando en la columna de la izquierda
  • Separar el radicando en grupos de dos dígitos comenzando por la derecha

En este ejemplo se intenta calcular la raíz cuadrada de 25921.

Al tener un número impar de dígitos el primer dígito quedará solo en el grupo.

Paso 2:

  • Bajar el primer grupo de dígitos al resto
  • Se debe buscar un dígito d tal que el valor del número auxiliar (inicialmente con un valor 0) concatenado con d y multiplicado por d de como resultado el mayor valor menor o igual al resto. AUXd*d <= resto
  • Agregar d al valor de la raíz
  • Restar el resultado de la multiplicación AUXd*d al resto

Se baja el primer dígito 2

Se encuentra el dígito realizando la multiplicación con el número auxiliar que en este momento vale 0:

0x0 = 0

1×1 = 1

2×2 = 4

Ya que el dígito que produce el mayor valor sin pasar el valor 2 del resto se lo selecciona y se coloca como primer dígito de la raíz

Se resta el resultado de la multiplicación al resto dando como resultado 1

Paso 3

  • Se obtiene el nuevo valor auxiliar multiplicando por 2 el valor actual de la raíz

El nuevo valor auxiliar es 2 ya que se multiplica por 2 el valor actual de la raíz que es uno

Paso 5

  • Bajar el siguiente par de dígitos al resto
  • Repetir los pasos hasta lograr un resto 0

El nuevo valor del resto al haber bajado los dígitos 5 y 9 es 159.

Se debe buscar el siguiente dígito de manera que el resultado de la multiplicación no sea mayor a 159.

Ya que el valor auxiliar es 2 las multiplicaciones serán del tipo:

20 x 0 = 0

21 x 1 = 1

22 x 2 = 44

23 x 3 = 69

24 x 4 = 96

25 x 5 = 125

26 x 6 = 156

27 x 7 = 189

El dígito seleccionado es 6 y es agregado a la raíz.

El resultado de la multiplicación 156 es restado al resto dando como resultado 3

El nuevo valor auxiliar se calcula multiplicando el valor de la raíz 16 por 2 dando por resultado 32.

Se bajan los siguientes dos dígitos, 2 y 1, siendo el nuevo resto 321.

Se busca el nuevo dígito a partir del auxiliar 32:

320 x 0 = 0

321 x 1 = 321

La multiplicación da como resultado el valor del resto por lo que se selecciona y se agrega al valor de la raíz

Se resta el resultado al resto dando por resultado 0

Como no hay más dígitos para bajar y el resto es 0 se finaliza el cálculo siendo el valor de la raíz 161.

Código Python

from math import ceil

# Convertir radicando a cadena de caracteres
radicando = str(25921)
raiz_aprox = '0'
resto = ''
auxiliar = ''

#Obtener pares de numeros del radicando
if len(radicando) % 2 == 0:
	pares = [radicando[i:i+2] for i in range(0, len(radicando), 2)]
else:
	pares = [radicando[0]] + [radicando[i:i+2] for i in range(1, len(radicando), 2)]
        
        
for par in pares:
	#Agregar par de números al resto
	resto += par		
	#Buscar el siguiente dígito de la raíz
	digito = 0
	for i in range(1,10):
		if int(auxiliar+str(i))*i <= int(resto):
			digito = i
		else:
			break
	#Agregar digito a la raiz
	raiz_aprox+=str(digito)
	#Restar resultado al resto
	resto = str(int(resto) - (int(auxiliar+str(digito))*int(digito)))
	#Obtener nuevo auxiliar
	auxiliar = str(int(raiz_aprox)*2)
print("Raiz: %d" % int(raiz_aprox))	

Código PHP

<?php
// Colocar radicando como cadena de caracteres
$radicando = '25921';
$raiz_aprox = '0';
$resto = '';
$auxiliar = '';

// Obtener pares de números del radicando
if (strlen($radicando) % 2 == 0) {
    $pares = str_split($radicando, 2);
} else {
    $pares = array_merge(array($radicando[0]), str_split(substr($radicando, 1), 2));
}

foreach ($pares as $par) {
    // Agregar par de números al resto
    $resto .= $par;    
    // Buscar el siguiente dígito de la raíz
    $digito = 0;
    for ($i = 1; $i < 10; $i++) {
        if ((int)($auxiliar . $i) * $i <= (int)$resto) {
            $digito = $i;
        } else {
            break;
        }
    }    
    // Agregar digito a la raiz
    $raiz_aprox .= (string)$digito;    
    // Restar resultado al resto
    $resto = (string)((int)$resto - ((int)($auxiliar . $digito) * $digito));    
    // Obtener nuevo auxiliar
    $auxiliar = (string)((int)$raiz_aprox * 2);
}

echo "Raiz: " . (int)$raiz_aprox;
?>

Raíces de resolución con decimales: pasos de cálculo

En este ejemplo se resolverá la raíz cuadrada de 120

Se comienza separando los dígitos en grupos de 2

Se baja el primer dígito 1 convirtiéndose en el resto

Se busca el valor del primer dígito a partir del número auxiliar que es 0

1×0 = 0

1×1 = 1

2×2 = 4

Se selecciona el valor 1 y se agrega al valor de la raíz

Se le resta el resultado de la multiplicación al resto dando como resultado 0

Se obtiene el nuevo número auxiliar multiplicando el valor actual de la raíz por 2

Se bajan los siguientes dos dígitos agregándolos al resto cuyo nuevo valor es 20

Se busca el siguiente valor para el número auxiliar 2

20×0 = 0

21×1 = 21

El valor del nuevo dígito es 0 y es agregado a la raíz

Se resta el valor al resto quedando en 20

Ya que el resultado no es un número entero no quedan más dígitos para bajar pero el resto es mayor a 0.

Se obtiene el nuevo número auxiliar multiplicando el valor de la raíz por 2 dando como resultado 20

Para continuar con el cálculo se colocan dos 0 al resto

Ya que se han agregado 0 al resto se colocará una coma a la raíz y los nuevos dígitos encontrados se colocaran a continuación.

Se busca el siguiente dígito multiplicando el número auxiliar

207×7 = 1449

208×8 = 1664

209×9 = 1881

Se selecciona el dígito 9 y se agrega al resultado de la raíz

El resultado de la multiplicación se resta al resto dando como resultado 119

Se finaliza el proceso cuando se llega a la cantidad de decimales requeridos

El proceso puede repetirse tantas veces como se requiera para obtener más valores decimales. Cada vez que se quiere obtener un nuevo dígito dos 0 deben agregarse al resto. En el caso que el resultado sea un número irracional el proceso podrá continuarse indefinidamente.

Código Python

from math import ceil

# Convertir radicando a cadena de caracteres
radicando = str(120)
raiz_aprox = '0'
resto = ''
auxiliar = ''
cant_decimales = 3

#Obtener pares de numeros del radicando
if len(radicando) % 2 == 0:
	pares = [radicando[i:i+2] for i in range(0, len(radicando), 2)]
else:
	pares = [radicando[0]] + [radicando[i:i+2] for i in range(1, len(radicando), 2)]
	
# Agregar punto decimal
pares.append(".")

# Agregar tantos pares de ceros como decimales deseados
for i in range(cant_decimales):
	pares.append("00")
        
for par in pares:
	print(par)
	if par == ".":
		raiz_aprox+=par
	else:
		#Agregar par de números al resto
		resto += par	
		#Buscar el siguiente dígito de la raíz
		digito = 0
		for i in range(1,10):
			if int(auxiliar+str(i))*i <= int(resto):
				digito = i
			else:
				break
		#Agregar digito a la raiz
		raiz_aprox+=str(digito)
		#Restar resultado al resto
		resto = str(int(resto) - (int(auxiliar+str(digito))*int(digito)))
		#Obtener nuevo auxiliar
		auxiliar = str(int(raiz_aprox.replace('.', ''))*2)
print("Raiz: %f.cant_decimales" % float(raiz_aprox))	

Código PHP

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Convertir radicando a cadena de caracteres
$radicando = '120';
$raiz_aprox = '0';
$resto = '';
$auxiliar = '';
$cant_decimales = 3;

// Obtener pares de números del radicando
if (strlen($radicando) % 2 == 0) {
    $pares = str_split($radicando, 2);
} else {
    $pares = array_merge(array($radicando[0]), str_split(substr($radicando, 1), 2));
}

# Agregar coma
array_push($pares,".");

# Agregar tantos pares de ceros como decimales deseados
for ($i = 1; $i <= $cant_decimales; $i++) {
	array_push($pares,"00");
}


foreach ($pares as $par) {
	if ($par == "."){
		$raiz_aprox.=$par;
	}else{
		// Agregar par de números al resto
		$resto .= $par;
		// Buscar el siguiente dígito de la raíz
		$digito = 0;
		for ($i = 1; $i < 10; $i++) {
			if ((int)($auxiliar . $i) * $i <= (int)$resto) {
				$digito = $i;
			} else {
				break;
			}
		}    
		// Agregar digito a la raiz
		$raiz_aprox .= (string)$digito;    
		// Restar resultado al resto
		$resto = (string)((int)$resto - ((int)($auxiliar . $digito) * $digito));    
		// Obtener nuevo auxiliar
		$auxiliar = (string)((int)str_replace('.', '', $raiz_aprox) * 2);
	}
}

echo "Raiz: " . (float)$raiz_aprox;
?>

En este artículo hemos visto el funcionamiento del algoritmo dígito a dígito para la búsqueda de raíces cuadradas. También hemos visto la implementación de este algoritmo en varios lenguajes de programación.


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!

Categorías: Programación

Andrea Navarro

- Ingeniera en Informática - Docente universitaria - Investigadora