viernes, 14 de noviembre de 2025

Polidivisibles

Un número se llama polidivisible (aquí se limitará el estudio a base 10) cuando al recorrer sus cifras de izquierda a derecha, las dos primeras forman un múltiplo de 2, las tres primeras, de 3, las cuatro de 4, y así sucesivamente. Por ejemplo, 126006 es polidivisible, porque 12=2*6, 126=3*42, 1260=4*315, 12600=5*2520, 126006=6*21001. Se supone que no se han escrito ceros a la izquierda, o lo que es lo mismo, que la primera cifra es no nula.

Puedes comprobar la afirmación de Wikipedia de que 381654729 es polidivisible.

Si se entiende bien el troceado de cifras, no es difícil crear una función que determine si un número es polidivisible. Propongo esta para VBasic de Excel, fácilmente traducible a otros lenguajes:

Function polidivisible(n) As Boolean ‘Devuelve verdadero o falso

Dim m, i, t

Dim es

 

 

m = numcifras(n)’Función contenida en mi blog “Números y hoja de cálculo”. Es fácil de copiar.

If m < 2 Then polidivisible = False: Exit Function ‘Caso de una cifra

i = 2 ‘Número de cifras primeras a considerar

es = True ‘Suponemos que sí es polidivisible

While i <= m And es ‘Recorremos las primeras cifras

t = Int(n / potencia(10, m - i)) ‘Trozo de cifras

If t / i <> t \ i Then es = False ‘Ha de ser múltiplo de su número de cifras

i = i + 1

Wend

polidivisible = es

End Function

Esta función te devuelve VERDADERO si el número es polidivisible. Con ella y un buscador podemos encontrar los primeros números polidivisibles. En la lista se descubren los comprendidos entre 100 y 200:

102, 105, 108, 120, 123, 126, 129, 141, 144, 147, 162, 165, 168, 180, 183, 186, 189

Los puedes comprobar en https://oeis.org/A144688. Allí se les llama “magic”. Su definición sugiere que si un número es polidivisible, también lo son los trozos de cifras que nos han servido para la definición. Eso ocurre con 20445, que 20, 204 y 2044 también son polidivisibles. Más adelante estudiaremos el proceso contrario, extender un polidivisible a más cifras.

 

Versión en PARI

Excel no es útil para números enteros de muchas cifras, ya que pasa automáticamente al formato científico. Por ello es conveniente el uso de una función en PARI. La de arriba se traduce fácilmente a esta otra:

k=381654729

polidivisible(n)={my(m=#digits(n),i=2,es=1,t);while(es==1&&i<=m,t=truncate(n/10^(m-i));if(t%i<>0,es=0);i+=1);es}

print(polidivisible(k))

Escribimos un valor de k en la primera línea y nos devolverá un 1 si k es polidivisible o un 0 si no lo es. Lo he probado en la web de PARI:


Nos devuelve un 1 porque 381654729 sí es polidivisible.

Añadiendo un bucle podremos buscar polidivisibles en un rango. En la imagen figuran los primeros a partir de 2000000:


Mentalmente se puede comprobar alguno de ellos.

En https://en.wikipedia.org/wiki/Polydivisible_number puedes encontrar un procedimiento sencillo para extender la definición a cualquier base b.

Extensión de un número polidivisible

Si N lo es, podemos intentar añadirle otra cifra más y probar si también es polidivisible. Si N posee k cifras, el siguiente polidivisible estará entre 10*N y 10*N+9 y deberá ser múltiplo de k+1. Si k no es mayor que 10, siempre existirá un múltiplo en ese rango. En valores superiores no se puede garantizar la extensión.

Uso PARI para garantizar un buen número de cifras:

polidivisible(n)={my(m=#digits(n),i=2,es=1,t);while(es==1&&i<=m,t=truncate(n/10^(m-i));if(t%i<>0,es=0);i+=1);es}

extenpoli(n)={my(g=#digits(n),nn=0,i=0,es=0);while(i<=9&&es==0,nn=i+n*10;if(polidivisible(nn),es=1);i+=1);nn*(es==1)}

print(extenpoli(126006))

En primer lugar, vuelvo a definir la función polidivisible. Después, extenpoli, que, como vemos, recorre una cifra adicional (i+n*10) para encontrar un nuevo polidivisible. Si no lo encuentra, devuelve un cero.

En el caso de 126006 nos devuelve un múltiplo de 7. Lo vemos en la web de PARI:


Sería 1260063 el siguiente polidivisible, divisible entre 7. Si proseguimos, el siguiente resulta ser 12600632, divisible entre 8. Seguirían 126006327, 1260063270, 12600632704, 126006327048. Aquí se detiene la secuencia, porque al añadir otra cifra no se logra un múltiplo de 13.

Todo esto funciona si el primer número es polidivisible con seguridad. Si no, llegaríamos a resultados erróneos. Estas secuencias de extensiones no tienen que ser únicas. Un polidivisible puede dar lugar a dos o más cuando se le añade una cifra, ya que en un rango de 10 puede haber dos o más múltiplos del número de cifras.

Secuencia de extensiones

Si usamos una lista, es posible lograr que PARI nos devuelva el conjunto de extensiones (o uno de ellos). Bastará añadir otra función nueva que descubra extensiones mientras sea posible. Todo el conjunto quedaría así:

polidivisible(n)={my(m=#digits(n),i=2,es=1,t);while(es==1&&i<=m,t=truncate(n/10^(m-i));if(t%i<>0,es=0);i+=1);es}

extenpoli(n)={my(g=#digits(n),nn=0,i=0,es=0);while(i<=9&&es==0,nn=i+n*10;if(polidivisible(nn),es=1);i+=1);nn*(es==1)}

secuenpoli(n)={my(m=n,s=List());while(m<>0,listput(~s,m);m=extenpoli(m));s}

print(secuenpoli(126006))

 

Nos daría el mismo resultado para 126006 en forma de lista:

 

List([126006, 1260063, 12600632, 126006327, 1260063270, 12600632704, 126006327048])

 

Otros ejemplos:

 

N=62765

List([62765, 627654, 6276543, 62765432, 627654321, 6276543210, 62765432103, 627654321036, 6276543210366, 62765432103668])

 

N=180402

List([180402, 1804026, 18040264, 180402642, 1804026420, 18040264209, 180402642096, 1804026420963, 18040264209632])

N=747

List([747, 7472, 74720, 747204, 7472045, 74720456, 747204561, 7472045610, 74720456107, 747204561072])

Ejemplo de los primeros párrafos:

N=381654729

List([381654729, 3816547290, 38165472906, 381654729060, 3816547290608])

Con esto terminamos la introducción a este tipo de números. Quedan muchas curiosidades, que puedes encontrar en las dos webs enlazadas más arriba. Aquí nos quedamos con las que son fácilmente tratables con VBasic y PARI.

No hay comentarios: