jueves, 2 de junio de 2022

Los pandigitales completos

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: