Llegamos hoy a otra entrada de este blog que se basa en un
“twitt” publicado en nuestra cuenta de Twitter (@connumeros) el 11/6/19.
El número de fecha de
hoy, 11619, presenta dos múltiplos sencillos anagramáticos (mismas cifras en
distinto orden):
11619*13 =
151047
11619*9 =
104571
Se puede sospechar que todo número puede cumplir el tener
dos múltiplos anagramáticos para factores convenientemente grandes, pero como
no tenemos herramientas para este tipo de búsquedas nos limitaremos a múltiplos
que usan factores no mayores que un número determinado. Después nos podemos
plantear una extensión del estudio.
Para investigar esta cuestión necesitamos una función que
nos indique si dos números poseen las mismas cifras y con la misma frecuencia
pero en distinto orden. Contamos con dos versiones de esta función. La primera,
de hace años, se basa en la conversión de cada número en cadena de texto, para
después investigar si cada carácter de uno se encuentra en el otro. Las
frecuencias las tiene en cuenta borrando cada carácter encontrado en ambas
cadenas. La puedes consultar en una entrada de 2012 de este blog:
Aquí usaremos otra versión, que no necesita funciones de
texto, pero sí varias memorias que almacenen las cifras de cada uno de los
números.
Public Function cifras_identicas(m, n) As
Boolean
Dim i, h, s
Dim ci As Boolean
Dim ca(10), cb(10)
For i = 1 To 10: ca(i) = 0: cb(i) = 0: Next
i ‘Prepara memorias para recibir frecuencias de cifras
h = m ‘Extracción de cifras del
primer número
While h > 0
i = Int(h / 10)
s = h - i * 10
h = i
ca(s + 1) = ca(s + 1) + 1 ‘Almacenamiento
de las frecuencia de una cifra
Wend
h = n ‘El mismo proceso para el otro
número
While h > 0
i = Int(h / 10)
s = h - i * 10
h = i
cb(s + 1) = cb(s + 1) + 1
Wend
ci = True
For i = 1 To 10
If ca(i) <> cb(i) Then ci = False ‘Si
una de las frecuencias no coincide, las cifras no son idénticas
Next i
cifras_identicas = ci
End Function
Con esta función podemos encontrar dos múltiplos
de un número que presenten las mismas cifras.
En PARI es mucho más simple, pues permite la
ordenación de los dígitos de un número en forma de vector:
anagram(a,b)=vecsort(digits(a))==vecsort(digits(b))
Listado de
soluciones
Podemos investigar si un número dado posee dos
múltiplos anagramáticos al menos. Tal como explicamos más arriba, solo
buscaremos múltiplos hasta un factor dado, para no alargar ni bloquear el
proceso. Hemos creado la función multianagram,
que busca los múltiplos anagramáticos hasta una cota k.
Como lo que nos interesa es saber si existe
solución o no, está construida de forma que detiene el proceso cuando encuentra
la primera solución. Sus parámetros son n,
el número dado, y k, la cota para
los factores que formarán los múltiplos pedidos.
Public Function multianagram(n, k) As String
Dim s$
Dim i, j, a, b, l
s$ = "" ‘Si no hay
solución, devuelve un string vacío.
i = 2
While i <= k And s$ = "" ‘Recorre los factores hasta una cota k
j = 1
While j < i And s$ = "" ’Busca el segundo múltiplo
If i <> j Then
a = n * i: b = n * j
If cifras_identicas(a, b) Then s$ = s$ + Str$(i)
+ Str$(j) + Str$(a) + Str$(b)
‘Si las cifras son idénticas, devuelve los dos
factores y los múltiplos resultantes
End If
j = j + 1
Wend
i = i + 1
Wend
multianagram = s$
End Function
Hemos preparado varias búsquedas con la cota 1000
para los factores que producirán los múltiplos anagramáticos. Parece que todos
los primeros números presentan la propiedad.
Por ejemplo, entre 30 y 45, todos poseen un par al
menos de múltiplos anagramáticos. En el listado figura cada número, después el
par de factores necesarios y al final los dos múltiplos pedidos, que presentan
las mismas cifras:
Modificando ligeramente la función multianagram podemos tener una idea del
máximo factor necesario para lograr el par de múltiplos anagramáticos. Para los
número del 1 al 100, el máximo es 137, necesario para el número 95 y sus
múltiplos 95*137=13015 y 95*119=11305.
Hasta el 500 el número que necesita un factor
mayor es el 425, que forma los múltiplos 12750 y 70125 con un factor máximo de
165. De este orden de magnitud suelen ser los factores. Por eso, para cota 1000
todos los primeros números poseen múltiplos anagramáticos.
Con PARI podemos investigar qué factor presenta
cada número de los dados (que por ahora son todos). Con este listado se logra:
anagram(a,b)=vecsort(digits(a))==vecsort(digits(b))
for(n=200,500,k=2;e=0;while(k<=200&&e==0,h=1;while(h<=k-1&&e==0,a=n*k;b=n*h;e=anagram(a,b);if(e<>0,print(n,",
",k));h+=1);k+=1))
En primer lugar definimos anagram(a,b), que
devuelve 1 si los números son anagramáticos y 0 si no lo son. Después
construimos los múltiplos posibles e investigamos si existen anagramáticos y
cuál es el factor máximo. En el ejemplo buscamos entre 2 y 200 con un factor
máximo de 200 (Observa k<=200) Después se pueden cambiar
los parámetros. Estos serían los resultados desde 420 a 430:
420, 22
421, 65
422, 74
423, 4
424, 84
425, 165
426, 58
427, 45
428, 147
429, 47
430, 41
Comprobamos que 425 es el que necesita un factor
mayor (dentro de la cota 200)
Problema
contrario
Podemos plantear el problema contrario, y es la
búsqueda de números que no posean múltiplos anagramáticos para una cota
razonable, como puede ser 1000. Si encontramos alguno, subimos la cota.
Podemos usar nuestro buscador en Excel o el código
anterior de PARI ligeramente modificado.
anagram(a,b)=vecsort(digits(a))==vecsort(digits(b))
for(n=2,5000,k=2;e=0;while(k<=1000&&e==0,h=1;while(h<=k-1&&e==0,a=n*k;b=n*h;e=anagram(a,b);h+=1);k+=1);if(e==0,print(n)))
En este caso solo imprimimos resultados si después
de recorrer los múltiplos no se encuentra ningún par anagramático. Usamos cota
1000, a ver qué ocurre. Hasta 5000 no hemos encontrado ninguno. Vamos aumentando
el rango de búsqueda, aunque se va lentificando el proceso. Hasta una cota de
100000, con un factor máximo de 1000, no ha aparecido ningún caso. Es
arriesgado conjeturar nada, porque si aumenta el factor, también lo hace el
número de cifras del múltiplo, lo que dificulta la coincidencia. Lo dejamos
aquí.
No hay comentarios:
Publicar un comentario