viernes, 14 de septiembre de 2012

¿Qué hay detrás de los decimales periódicos? (2)



Con el apoyo de la teoría explicada en la anterior entrada describiremos a continuación una sencilla herramienta para hojas de cálculo que encuentra el anteperiodo y el periodo de un desarrollo decimal.

Necesitaremos las siguientes operaciones:

(1) Simplificar la fracción cuyo desarrollo decimal deseamos conocer. Esto se consigue en las hojas de cálculo dividiendo las celdas del numerador y del denominador por su MCD mediante la función M.C.D(A;B)

(2) Extraer del denominador los factores 2 y 5 tomando nota de sus exponentes (cero si no figuran) y quedándonos con el máximo, que será el número de cifras del anteperiodo

Un código posible para la extracción del 2 (igual se procede para el 5) puede ser este:

Public Function expo2(n)
Dim e, m
m = n
e = 0
While m / 2 = m \ 2
e = e + 1
m = m / 2
Wend
expo2 = e
End Function

Nos devuelve cero si el 2 no es divisor del denominador y el exponente en caso afirmativo. En la imagen puedes ver la disposición de cálculo que hemos elegido. El máximo se consigue con la función  MAX(A;B) aplicada a los dos exponentes (del 2 y del 5)










(3) Obtener la parte del denominador coprima con 10. Para ello basta dividir el denominador entre las dos potencias de 2 y 5 obtenidas.

(4) Obtener el gaussiano de 10 respecto a esa parte coprima. Podríamos usar exponenciación modular (ver http://hojaynumeros.blogspot.com.es/2012/03/de-la-multiplicacion-rusa-la.html), pero en este caso, como la generación de restos se realiza mediante mltiplicaciones por 10, hemos elegido el método directo, que no es demasiado lento en el rango de números que manejan las hojas.

(Añadimos comentarios al código)

Public Function gauss10(m)
Dim r, g, i

g = 1
r = 10 - m * (10 \ m) ‘Obtenemos el primer resto
While r <> 1 ‘Mientras no encontremos un resto igual a uno, seguimos
r = r * 10  ‘Cada resto es igual al anterior multiplicado por 10
r = r - m * (r \ m) ‘y convertido en resto módulo m
g = g + 1 ‘En cada ciclo aumenta el gaussiano
Wend
gauss10 = g
End Function








En el caso de la primera imagen el denominador era 30940, que contenía como factor 22*5. Eliminado este, quedó reducido a 1547, y aplicando el cálculo del gaussiano resulta nada menos que un periodo de 48 cifras, fuera del alcance ordinario de una hoja de cálculo.

(5) Expresión del anteperiodo y el periodo. Cuando ambos presentan muchas cifras, como en el caso del ejemplo, es mejor expresarlas en forma de texto, y no de número. El procedimiento consiste básicamente en el mismo usado para encontrar el gaussiano, multiplicar cada resto por 10 y reducirlo a resto módulo el denominador. Sirve igual para las cifras periódicas que para las no periódicas. La diferencia ahora es que los restos los convertimos en texto y los vamos incorporando a una cadena del mismo tipo.

El procedimiento completo puede resultar aburrido y dejamos su estudio a quien descargue la herramienta e inspeccione su código. Para el resto de lectores resultará una buena forma de comprobar los cálculos manuales.

Al necesitar calcular por separado la parte entera, el anteperiodo y el periodo, hemos preferido usar un botón y una macro para mayor comodidad:







Tienes esta herramienta en la dirección

http://hojamat.es/sindecimales/aritmetica/herramientas/herrarit.htm#periodo

3 comentarios:

Anónimo dijo...

Querido Antonio: Me ha chocado que en estas interesantísimas entradas digas "...resulta nada menos que un periodo de 48 cifras, fuera del alcance ordinario de una hoja de cálculo..." Mis alumnos de 1 de la ESO para ver si el resultado es periódico, han creado hojas que les dan los resultados con 200 decimales, para poder "ver" si se repite o no.
Un gran abrazo
Goyo Lekuona

Anónimo dijo...

Vale, vale. Me he precipitado :-( Pero es que ha sido leer la frase, y tener la necesidad de comentarlo ;-) je je je.
Si ellos también lo hacen tratando los decimales como texto.
Eres un fenómeno, Antonio

Antonio Roldán Martínez dijo...

Efectivamente, me refería a números de 48 cifras y de ahí escribirlos como texto.