Hace unas semanas, ordenando mis papeles, encontré una hoja
de hace casi cuarenta años en la que resumía un ejercicio para la calculadora
programable Texas Instrument TI-58. Me impresionó recordar lo complicado que
era su lenguaje de programación y las dificultades que tuvimos que soportar
quienes iniciamos el uso de la Informática en las aulas. Por ello, he querido,
a través de mi propia persona, rendir homenaje al profesorado que dio esos
primeros pasos.
Resulta que lo que yo estaba buscando en esa hoja eran los
números de Dudeney (no puedo recordar si en aquellos años los conocía por este
nombre, creo que sí), aquellos que coinciden con el cubo de la suma de sus cifras,
como 4913=(4+9+1+3)3. Yo lo expresaba de distinta forma, como vemos
en mi manuscrito escaneado:
Se expresa en él la búsqueda de números cuya raíz cúbica
coincide con la suma de sus cifras. Es preferible la formulación de más arriba,
que evita el uso de la raíz, con toda la complicación de su expresión decimal.
En este manuscrito se incluía también un diagrama de flujo,
que ahora, con la programación estructurada y la orientada a objetos, ha
quedado como algo antiguo, pero que en su momento nos ayudó mucho a razonar. En
él se evita el uso de la raíz cúbica.
La falta de costumbre me ha obligado a estudiar este esquema
con detenimiento, lo que aumenta mi asombro al recordar la precariedad de
medios de entonces. Y peor era su traducción al lenguaje propio de la TI-58,
muy próximo al ensamblador. Véase una muestra:
¿Cómo abordaríamos
este problema pasadas cuatro décadas?
En el caso de este blog acudiríamos a Excel o Calc, con su
lenguaje Basic, o al lenguaje PARI, que se nos ha hecho imprescindible.
Uso de la función SUMACIFRAS
En este curso hemos usado con frecuencia la suma de cifras
de un número, pero para evitar la consulta a otras entradas, reproduzco de
nuevo aquí la función usada. Se aplica a dos argumentos, el número n y el exponente k al que se elevan las cifras en la suma:
Public Function sumacifras(n, k)
Dim h, i, s, m
h = n ‘Copia el valor de n
s = 0 ‘Variable que contendrá la
suma
While h > 9 ‘Se extraen cifras
hasta que sólo quede una
i = Int(h / 10) ‘Dos líneas para
extraer la siguiente cifra
m = h - i * 10
h = i ‘El valor de h va descendiendo
al extraerle cifras
s = s + m ^ k ‘Se incrementa la suma
Wend
s = s + h ^ k ‘Última cifra
sumacifras = s
End Function
En esta entrada sólo usaremos exponente 1, por lo que las
llamadas a la función serán del tipo sumacifras(n;1)
Con esta función se puede organizar la búsqueda de los
números de Dudeney:
For i = 1 To 100
b = i ^ 3
If sumacifras(b, 1) = i Then msgbox(b)
Next i
Con un código algo más preciso, se puede construir la tabla:
En ella quedan destacadas las igualdades entre la raíz
cúbica y la suma de cifras. No hay más soluciones, como demostraremos más
adelante. Estos números están publicados en blogs y páginas de Matemáticas, y
en especial en
A061209 Numbers which are the
cubes of their digit sum.
0, 1, 512, 4913, 5832,
17576, 19683
Llama la atención la simplicidad del código en PARI:
(PARI) for(n=0,
999999, sumdigits(n)^3==n&&print1(n", ")) \\ M. F. Hasler,
Apr 12 2015
¿Por qué interrumpimos
la búsqueda en las seis cifras? Esto lo razoné hace cuarenta años, cuando
me iniciaba en la programación con números enteros.
Copio y adapto mi
razonamiento:
En un número n de
k cifras, la suma de las mismas S es como máximo 9+9+9+…+9 k veces, luego
S<10k. Por otra parte, n estará
comprendido entre 10(k-1) y 10k. Si el número tiene más
de seis cifras tendremos que su raíz cúbica cumplirá R>=10(k-1)/3
y (k-1)/3>2k.
Será imposible que S=R, ya que S<10k<102k<R
La desigualdad central se ve mejor con logaritmos decimales:
10k<102k equivale a 1+log(k)<2k, en el que
1<k y log(k)<k, luego la desigualdad se cumple.
Esta es la razón por la que es inútil buscar más números de
Dudeney.
Una vez resuelto el problema con la potencia tres, es sencillo
extenderlo a las siguientes potencias. Lo dejamos como ejercicio. Por cierto,
para cuadrados sólo existen dos soluciones, 1 y 81.
Las soluciones con cuartas potencias son
1 1
7 2401
22 234256
25 390625
28 614656
36 1679616
Las tienes publicadas en http://oeis.org/A061210, y se puede
demostrar que no existen soluciones con más de ocho cifras.
Con quintas potencias son estas:
1 1
28 17210368
35 52521875
36 60466176
46 205962976
Caso general
En http://oeis.org/A023106
están publicados todos aquellos números que son potencia de la suma de sus
cifras, sin especificar el exponente:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 81, 512, 2401, 4913,
5832, 17576, 19683, 234256, 390625, 614656, 1679616, 17210368, 34012224,
52521875, 60466176, 205962976, 612220032, 8303765625, 10460353203, 24794911296,
27512614111, 52523350144, 68719476736,…
Podemos reproducir esta lista, no considerando los
de una cifra, que son casos particulares
(exponente 1). Basta usar esta función, que para cada número te devuelve “NO”
si no tiene la propiedad exigida, y la suma de cifras y el exponente si la
tiene:
Public Function tipodudeney(n) As String
Dim p$
Dim i, j, s, t
p$ = "" ‘Resultado, en
principio vacío
For i = 2 To Sqr(n) ‘Recorremos
posibles raíces enésimas de n
s = Int(Log(n) / Log(i) + 0.000001) ‘Evaluamos
el posible exponente entero
If n = i ^ s Then ‘Si efectivamente,
es raíz enésima, sumamos cifras
t = sumacifras(n, 1)
If t = i Then p$ = p$ + Str(i) + "
" + Str(s) + " " ‘Si
existe coincidencia, añadimos solución
End If
Next i
If p = "" Then p = "NO" ‘No
existe solución
tipodudeney = p$ ‘Se publica raíz y
exponente
End Function
Con un poco de paciencia, porque en Excel va lento
(y en Calc más), logramos las primeras soluciones. Estas son las inferiores a
500000:
Entre ellas figuran exponentes 2, 3 y 4, con
soluciones ya conocidas.
Dejamos aquí el estudio. Ha sido interesante
revisar uno de mis primeros trabajos en programación. Si encuentro otro, lo
adaptaré también.
No hay comentarios:
Publicar un comentario