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:
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:
Publicar un comentario