Se llaman pandigitales a los números que presentan en su representación todas las cifras posibles en una base de numeración. Aquí nos restringiremos a base 10 y a aquellos números que contienen todas las cifras del 0 al 9 (completos), pero sin repetición. Es el concepto más simple y útil respecto a otras variantes.
Es claro que el pandigital más pequeño de este tipo será
1023456789, y el mayor 9876543210. Como no consideramos repeticiones de cifras,
su número será 10!=3628800 si admitimos el cero inicial, y 10!-9!= 3265920
si no lo admitimos.
Ningún número pandigital de este tipo puede ser un número
primo, porque cumple el criterio de divisibilidad entre 9 y 3, al sumar sus
cifras 45
Reconocimiento
de pandigitales
No es fácil reconocer mediante un algoritmo si un número
(del que no conocemos en principio su expresión decimal) es pandigital o no. Es
evidente que normalmente conocemos sus cifras, pero en una búsqueda no. Por
ejemplo, si buscamos un pandigital que sea triangular, no conocemos sus cifras
hasta que lo encontremos.
Aquí, como es costumbre, estudiaremos dos versiones, una
para hoja de cálculo y otra para PARI.
Proceso
en PARI
La segunda es muy fácil de entender:
pandigi(n)= #vecsort(digits(m),
, 8)==10
Literalmente nos dice, que si ordenamos el vector formado
por las cifras (vecsort(digits),
eliminamos repetidos (parámetro 8), y
luego las contamos (signo #), ha de
resultar un número igual a 10, que sería el número de cifras sin repetición.
Un ejemplo de uso de esta función es el de encontrar el
primer pandigital cuadrado. Tomamos la menor base cuyo cuadrado tiene diez
cifras, que es 31623, y vamos avanzando
cuadrados hasta encontrar un pandigital. Sería así:
pandigi(m)=#vecsort(digits(m), , 8)==10
m=31623;q=m^2;while(pandigi(q)==0,m+=1;q=m^2);print(m)
En primer lugar define la función pandigi, para reconocer pandigitales, y después avanza los cuadrados en un bucle while hasta encontrar un valor de pandigi que no sea cero.
El resultado es 1026753849=32043^2
El resto de los pandigitales cuadrados los puedes
consultar en http://oeis.org/A036745
Proceso en hojas de cálculo
En este caso perdemos la potencia del lenguaje PARI, pero
podemos imitar nuestro reconocimiento de un pandigital:
Nosotros iríamos recorriendo las cifras del número, y si
falta una, lo rechazaríamos, y si existe una repetición, también. Después contaríamos
que estuvieran las diez cifras.
Pues algo así realizaremos con VBasic. Para ello
prepararemos diez memorias que alojen las frecuencias de las cifras. Cada vez
que aparezca una incrementamos la memoria correspondiente. Podemos organizar
todo con esta función:
Public
Function pandigital(a) As Boolean
Dim ci(10)
Dim i
Dim t As Boolean
t = True
For i = 0 To 9: ci(i) = 0: Next i ‘Preparamos
diez memorias
If numcifras(a)<>10 then
pandigital=false:exit function
For i = 1 To 10
ci(cifra(a, i)) = ci(cifra(a, i)) + 1 ’Anotamos cada cifra
‘Si la frecuencia es mayor que 1, se rechaza
el número
If ci(cifra(a, i)) > 1 Then
pandigital = False: Exit Function
Next i
s = 0
For i = 0 To 9
If ci(i) = 0 Then t = False ‘Si
queda una memoria vacía, se rechaza
Next i
pandigital = t ‘Devuelve
verdadero o falso
End Function
Con esta función es fácil obtener un listado de los primeros pandigitales:
Podemos usar esta función para encontrar, por ejemplo, el primer número pandigital triangular. Partimos de 1000006281, primer triangular de 10 cifras, de orden 44721, y vamos recorriendo triangulares hasta encontrar un pandigital. Todo se basa en la fórmula de los triangulares, N(N+1)/2.Function panditrian(n)
Dim m
m = n
Do Until pandigital(m * (m + 1) / 2)
m = m + 1
Loop
panditrian = m * (m + 1) / 2
End Function
Con esta función encontramos el primer pandigital triangular, 1062489753, de orden 46097. Está publicado en http://oeis.org/A241812, pero es interesante volverlo a encontrar con nuestros propios medios.
De esta forma podemos encontrar cubos, oblongos y otros
que sean pandigitales sin repetición.
Por ejemplo, el menor oblongo de diez cifras es 1000045752=31623*31624. Con un pequeño cambio en la función de arriba obtenemos
1492083756=38627*38628 como el menor oblongo pandigital. No está publicado.
En el caso de los cubos, no hemos encontrado ningún
ejemplo.
Los tipos que hemos buscado tienen forma polinómica, lo
que ha acelerado el proceso. En otros casos la búsqueda sería mucho más lenta.
Existen muchos casos en los que un pandigital es múltiplo
de otro, pero su búsqueda es lenta y no la abordaremos. Sí es sencillo buscar
un múltiplo pandigital de cualquier otro número menor. En casi todos los casos
se encuentra con éxito, e incluso circula por ahí la conjetura de que todos los
números poseen un múltiplo pandigital, pero no es cierta, ya que los números
terminados en 00 no lo tienen, y también muchos múltiplos de 25.
Con este código PARI encuentras fácilmente un múltiplo
pandigital de otro cualquiera menor que 10^9:
multipan(n)={my(e=0,i=1,m=n);while(m<=10^10&&e==0,m=n*i;if(#vecsort(digits(m),
, 8)==10,e=m);i+=1);e}
print(multipan(23322))
En el ejemplo se busca el múltiplo de 23322, y resulta ser 1053967824=45192*23322
Si cambias 23322 por otro número, obtendrás su múltiplo
pandigital. Si no existe, te devolverá un cero. Prueba con un número terminado
en dos ceros.
No hay comentarios:
Publicar un comentario