lunes, 27 de marzo de 2023

Regresos 7 – Otros automórficos

 

En el año 2009 publiqué un pequeño reto sobre cuadrados automórficos

https://hojaynumeros.blogspot.com/2009/05/numeros-automorficos.html

Los números de la primera columna de la siguiente tabla

son automórficos.

Si los estudias adivinarás pronto qué propiedad tienen para recibir este nombre.

¿Cómo podríamos encontrarlos con una hoja de cálculo? Para construir la tabla que se incluye se han usado macros, pero se puede prescindir de ellas. Puedes crear una tabla de números consecutivos y después aplicarles una condición.
Esta tabla es complementaria de la anterior. ¿Qué relación tiene con ella?


La pista que daba la segunda tabla era que a2-a = a(a-1) = N*10

Años más tarde, en 2013, se estudiaron los primos automórficos, que poseen como últimas cifras su número de orden como primo.

https://hojaynumeros.blogspot.com/2013/11/primo-que-tienes-que-ver-con-tu-numero.html

Ahora nos dedicaremos, fundamentalmente, a los números poligonales que sean automórficos. Como los cuadrados son poligonales, incluiremos lo que aparezca de nuevo respecto a la entrada de 2009.

Estos números poseen una fórmula general, y la usaremos en las búsquedas, y si se requiere un estudio algebraico, la simplificaremos para cada caso en particular.

Función de búsqueda

Los poligonales los tenemos muy estudiados en este blog y están contenidos en nuestra publicación

http://www.hojamat.es/publicaciones/poligonales.pdf

Las fórmulas para su formación las puedes estudiar en ella. Aquí las usaremos en su versión para hojas de cálculo:

Function poligonal(n, k)

poligonal = n * (n * (k - 2) - (k - 4)) / 2

End Function

En ella n es el orden o longitud del “lado” y k el tipo, o número de lados.

Una vez contemos con esta función podremos buscar los casos automórficos. La plasmamos así:

Function autopolig(n, k) 'Devuelve el poligonal dado su índice si es automórfico

Dim b, l, u

Dim s$, t$

b = poligonal(n, k) ‘Busca el poligonal

t = ajusta(b) ‘Se convierten los datos a String

s = ajusta(n)

l = Len(s$) ‘Ahora se ve si coinciden las cifras

If s = Right(t, l) Then u = Val(t) else u=0

autopolig = u

End Function

Con esta función podemos buscar poligonales automórficos, a los que llamaremos polimórficos. Con esto se podría dar por terminada la cuestión, porque nos da fácilmente todas las soluciones, pero deseamos estudiar también cada caso por separado. Aquí tenemos algunos listados:

Triangulares: 1, 15, 325, 195625, 43959376, 4106490625,… http://oeis.org/A219253

Cuadrados: , 1, 25, 36, 625, 5776, 141376, 390625, 87909376, 8212890625,… http://oeis.org/A035383

Pentagonales: 1, 35, 925, 585625, 131859376, 12319290625

Estudiaremos ahora cada tipo en particular para casos interesantes.

Triangulares

En el caso de los triangulares el automorfismo se puede expresar con su fórmula clásica N(N+1)/2:

N(N+1)/2 = N módulo 10m siendo m el número de cifras de N

Lo podemos expresar de forma más sencilla:

N(N+1)-2N=N2+N-2N=N2-N=N(N-1) = 0 (mod 10m

Por ejemplo, 325 es automórfico, porque su número de orden es 25, y se cumple que 25(25-1)=25*24=600, que es múltiplo de 102, siendo 2 el número de cifras de 25

Tenemos listado de estos números: 1, 15, 325, 195625, 43959376, 4106490625, 396606890625, 25271617109376, 83084112890625, 22661209212890625, 1596879961787109376, 3344565630081787109376, 1795096118003159918212890625

http://oeis.org/A219253

Vemos que el problema se vuelve algo intratable. Con la propiedad anterior se puede abordar con hoja de cálculo sin gran coste de tiempo. Usamos la función siguiente, similar a la general, en la que hemos integrado la condición modular:

Function trimorfico(n)

Dim a, b, u, l

Dim s$, t$

a = numcifras(n)

If n * (n - 1) Mod 10 ^ a = 0 Then

b = n * (n + 1) / 2

t = ajusta(b)

s = ajusta(n)

l = Len(s$)

If s = Right(t, l) Then u = Val(t) Else u = 0

End If

trimorfico = u

End Function

Con algunos segundos de tiempo se consiguen varios términos:

Esto anima a intentar el mismo proceso con PARI. El código es algo complejo:

issub(vv, v) = {for (i=1, #v - #vv + 1, if (vector(#vv, k, v[k+i-1]) == vv, return(1)); ); }

substring(ss,s)={my(vv=Vec(ss),v=Vec(s));return(issub(vv,v))}

trimorf(n)={my(a,b,u=0,l,s="",t="");a=#Str(n);if(n*(n-1)%10^a==0,b=n*(n+1)/2;t=Str(b);s=Str(n);u=substring(s,t));if(u>0,return(b))}

for (i=1,10^7,m=trimorf(i);if(m>0,print(m)))

Con él se llega más lejos que con hoja de cálculo:

Este ejemplo ilustra la conveniencia de una condición previa para acelerar la velocidad de un algoritmo.


Cuadrados

Con este ejemplo comenzamos el tema en el año 2009. Lo completamos ahora.

Podemos usar la función autopolig con la fórmula n^2, pero merece la pena buscar una condición como procedimos con los triangulares:

N2 = N módulo 10^m siendo m el número de cifras de N

N2-N=N(N-1) = 0(mod 10m

Resulta la misma condición que para los triangulares. En realidad, es similar a la condición de exigir que N termine en una de las cifras 1, 5 o 6, que son las únicas terminaciones que coinciden con sus cuadrados.

Si cambiamos n*(n-1)/2 por n^2 en la función anterior nos resultan bien las soluciones para cuadrados:

Los valores de N coinciden con los primeros de los publicados en http://oeis.org/A003226: 1, 5, 6, 25, 76, 376, 625, 9376, 90625, 109376, 890625, 2890625, 7109376, 12890625, 87109376, 212890625, 787109376, 1787109376, 8212890625, 18212890625, 81787109376, 918212890625, 9918212890625, 40081787109376, 59918212890625, 259918212890625, 740081787109376 

Los valores de N2 los podemos lograr con la misma sustitución en el código PARI:


Otros poligonales

Antes de pasar a algunos casos particulares, es fácil plantear que la condición en la que coinciden triangulares y cuadrados es válida para otros poligonales:

N2-N=N(N-1) = 0(mod 10m

Es sencilla su justificación, basada en la fórmula general del poligonal de lado n y número de lados k:

P(n,k)=n(n(k-2)-(k-4))/2

Con ella se justifica fácilmente:

N(N*(k-2)-(k-4)/2=N mod 10m

(k-2)N2-(k-4)N=2N mod 10m

(k-2)(N2-N)=0 mod 10m

Si k-2 es primo con 100 (sin factores 2 y 5) vale el criterio para todos esos poligonales, y en ellos se simplifica la búsqueda con seguridad, aunque aparecerán otros casos.

Pentagonales

La fórmula de los números pentagonales (además de la general para poligonales usada en autopolig) es (3n2-n)/2. Podemos aplicarle el filtro del módulo, porque k-2=5-2=3 en este caso, primo con 10. El resultado, tanto con ese filtro como sin él, es el mismo:

1, 35, 925, 585625, 131859376, 12319290625,…


Con la adaptación a PARI se llega más lejos en la segunda columna:

Los valores de la primera columna cinciden con los de los triangulares, por ser 5-2 primo con 10.

Hexagonales

En estos aparecen más casos, porque k-2=6-2=4 no es primo con 10. Por esa abundancia, el algoritmo autopolig funciona con más rapidez:


Los valores de N están publicados en http://oeis.org/A039594 y los de HEX(N) en http://oeis.org/A038494


Soluciones universales

 En la equivalencia que hemos usado como filtro para los poligonales, (k-2)(N2-N)=0 mod 10m , los elementos que cumplan (N2-N)=0 mod 10m figurarán en todos ellos como automórficos, porque no les afecta el valor de (k-2). Son soluciones universales, que figuran en todos los casos que hemos estudiado hasta ahora. Coinciden con los valores de N en los triangulares, y son

1, 5, 25, 625, 9376, 90625, 890625, 7109376,…

Si recorres con autopolig los distintos tipos de poligonales, verás que estos valores pertenecerán a todos ellos. Por ejemplo, creamos la sucesión para decágonos (k=10):

1, 5, 6, 25, 26, 50, 51, 75, 76, 125, 126, 250, 251, 375, 376, 500, 501, 625, 626, 750, 751, 875, 876, 1876, 2500, 2501, 3125, 4376, 5000, 5001, 5625, 6876, 7500, 7501, 8125, 9376, 15625, 25000, 25001, 34376, 40625, 50000, 50001, 59376, 65625, 75000, 75001, 84376, 90625, 109376, 140625, 250000, 250001, 359376, 390625, 500000, 500001, 609376, 640625, 750000, 750001, 859376, 890625, 2109376, 2500000, 2500001, 2890625, 4609376, 5000000, 5000001, 5390625, 7109376, 7500000, 7500001, 7890625, 9609376,…

Figuran en negrita los valores universales, que pertenecen a todas las sucesiones dependientes de poligonales. Es un interesante resultado. Por ejemplo, en esta tabla figuran el número de lados k y los poligonales correspondientes al 9376:


Todos terminan en las cifras 9376.

 

 

 

viernes, 17 de marzo de 2023

Números primos del tipo HP (homeprimes)

Como es costumbre en este blog, se extraen temas de los cálculos que publicamos en Twitter @connumeros. El día 31/01/2023, estudiando el número 31123 vimos que OEIS lo calificaba como homeprime con cuatro orígenes. Mantengo esta denominación en inglés porque no he encontrado traducción adecuada. Lo que sigue no tiene un gran interés matemático, pero supone un cierto esfuerzo en la búsqueda de algoritmos y su codificación.

La idea para estos números es la siguiente: Dado un número compuesto cualquiera, como por ejemplo, 42, lo descomponemos en factores primos y los concatenamos de menor a mayor para formar otro número (en base 10). En este caso, 42=2*3*7, luego concatenamos y llegamos a 237. Si existen primos repetidos, no usamos exponentes, sino que los mantenemos repetidos. Por ejemplo, 24=23*3 lo convertimos en 2223. Si el resultado es compuesto, como es el caso de 237=3*79, lo convertimos en 379. Así seguimos hasta llegar a un primo. Este sería el caso de 379, luego sería home prime, y lo podemos representar como HP(42). Un número primo p cumplirá HP(p)=p.

Esto es un entretenimiento sin más trascendencia, publicado por primera vez por Jeffrey Heleen en 1990. Al experimentar con esta idea se descubrió que era un algoritmo que podía dar más juego de lo esperado. Por ejemplo, la función HP no es biunívoca. Puedes comprobar que 379 es imagen de tres números compuestos distintos: 42, 74, 237 y el mismo 379. Esto es lo que parece ocurrir con el número 31123, que posee cuatro oígenes. Lo iremos descubriendo paso a paso.

Algoritmo básico

Podemos idear una función para la operación básica de concatenar factores, y luego pasaremos a reiterarla.

Para hoja de cálculo

La hoja más usada, Excel, presenta el problema de que al representar un número mediante texto le añade un espacio en blanco. Por eso solemos usar en este blog la función ajusta, que le elimina ese carácter si ha lugar. La hemos usado varias veces aquí.

Function ajusta$(a)

Dim d$

 

d$ = Str$(a) ‘Convierte el número en texto

While Left$(d$, 1) = " " ‘Va eliminando espacios en blanco

d$ = Right$(d$, Len(d$) - 1)

Wend

ajusta$ = d$

End Function

Con ella podemos concatenar caracteres sin problema. A continuación vemos la operación básica de concatenar factores primos:

Function concfactores(n)

Dim f, a

Dim s$

s = "" ‘Se inicia una cadena de texto

a = n 'Copia el valor de n

f = 2 'Inicia el listado de primos

While f <= a 'Recorre los primos posibles

While a / f = a \ f

a = a / f: s = s + ajusta(f) ‘Si es factor, concatena

Wend

If f = 2 Then f = 3 Else f = f + 2 ‘Avanza a otro primo

Wend

concfactores = Val(s) ‘Convierte la concatenación en número

End Function

Podemos aplicar esta función a cualquiera de nuestros ejemplos, 42, 237, 74 o 379 para comprobar su funcionamiento. Por ejemplo, CONCFACTORES(144)= 222233.

Es fácil ver que esta operación no disminuye el valor de un número, por lo que si reiteramos, siempre nos encontraremos con una sucesión no decreciente.

Charles R Greathouse IV propone en OEIS un procedimiento PARI similar, pero que se aprovecha de que este lenguaje ya suministra el vector factor con los factores primos y sus exponentes, y solo hay que extraerlos y añadirlos a un Str. El final, con eval(s) lo convierte en número.

step(n)=my(f=factor(n), s=""); for(i=1, #f~, for(j=1, f[i, 2], s=Str(s, f[i, 1]))); eval(s)

Si lo que deseamos es reproducir la función concfactores podemos usar este otro código, que no se apoya en la existencia del vector factor:

step(p)={my(s="",a=p,f=2);while(f<=a,while(a%f==0,a=a/f;s=Str(s,f));f=f+1+(f<>2));eval(s)}

print(step(144))

Está preparado para concatenar los factores de 144, con el resultado de 222233.

Búsqueda del HP(p)

Con esta función ya podemos reiterar hasta llegar al primer primo, el homeprime:

Function hp(n)

Dim p, q, r

 

p = n ‘Copia n

q = 1 ‘Inicia variable auxiliar

 

Do ‘Bucle de búsqueda

r = p

 p = concfactores(p) ‘Da un paso de concatenación

 q = p

Loop Until r = q ‘Si son iguales, es que es primo. Final.

hp = p

End Function

 

Esta función es útil si las iteraciones no llegan muy lejos, pues se entra en la zona en la que las hojas de cálculo pierden exactitud. Probamos con algunos ejemplos:

Observamos que, mientras los primeros llegan al homeprime sin problemas, el 222 sobrepasa la posibilidades de Excel. Podemos seguir  sus trayectorias paso a paso:


Los primeros se van estabilizando hasta llegar a un número primo, pero el 222 sigue buscando hasta que sobrepasa la capacidad de cálculo.

Podemos traducir el algoritmo a PARI, que admite todas las cifras:

step(p)={my(s="",a=p,f=2);while(f<=a,while(a%f==0,a=a/f;s=Str(s,f));f=f+1+(f<>2));eval(s)}

hp(n)={my(p=n,q=1);until(r==p,r=p;p=step(p);q=p);p}

print(hp(222))

 

Se conjetura que cada compuesto posee un homeprime, pero en algunos, como el 49, no se conoce el final del proceso. Tampoco se ha logrado en 77, 49, 146, 246, 312, 320…En nuestro equipo ha resultado difícil seguir el proceso para 222. Se ha llegado a estos pasos:

222, 2337, 31941, 33371313, 311123771, 7149317941, 22931219729, 112084656339, 3347911118189, 11613496501723, 97130517917327, …

El problema reside en la factorización, que puede llegar a ser inabordable.

Búsqueda de los orígenes

Nos queda un último trabajo, y es buscar los compuestos que terminan en un número primo dado, como el 31123 del primer ejemplo. Podíamos recorrer los compuestos menores que el primo, aplicarles la función hp(n) y comprobar si coincide con el primo estudiado, pero, como vimos en el párrafo anterior, el proceso se puede bloquear al llegar a ciertas factorizaciones.

Para evitar estos bloqueos, reproduciremos los pasos, pero parando el proceso si se sobrepasa el número primo dado. Con la siguiente función se resuelve el problema, aunque aumentamos algo la complejidad:

Function origenhp$(n)

Dim i, j, m

Dim s$

 

s = "" ‘Contenedor de las soluciones

If esprimo(n) Then ‘Solo actúa sobre primos

For i = 4 To n – 1 ‘Recorre los posibles compuestos

m = 0 ‘Indicador de solución

j = concfactores(i) ‘Damos pasos hacia HP(i)

While j <= n And m = 0 ‘Nos detenemos al llegar a n

If j = n Then s = s + Str$(i) + ", ": m = 1 ‘Hay un origen

If esprimo(j) Then m = 1 ‘Se llega a un primo menor que n

If m = 0 Then j = concfactores(j) ‘Si no es solución, se avanza

Wend

Next i

End If

origenhp = s

End Function

 

Con este procedimiento encontraremos los orígenes de un presunto homeprime. Lo podemos aplicar a nuestro ejemplo de 379, y resultan los orígenes conocidos, a los que hay que añadir él mismo:

Queda comprobado su funcionamiento. Ahora hay que volver al principio, y es ver qué tres orígenes tiene el número 31123. Tardará un poco en dar la solución, que es:


Hemos resuleto el problema, los cuatro orígenes son 413,
  759,  3369, 31123. En la cuarta fila se compruebas los tres primeros con la función HP. En la siguiente tabla vemos los pasos necesarios para llegar a 31123.


Para emprender otras vbúsquedas posibles, insertamos el código PARI que traduce este procedimiento:

step(p)={my(s="",a=p,f=2);while(f<=a,while(a%f==0,a=a/f;s=Str(s,f));f=f+1+(f<>2));eval(s)}

origenhp(n)={my(i,j,m,s="");if(isprime(n),for(i=4,n-1,m=0;j=step(i);while(j<=n&&m==0,if(j==n,s=Str(s,", ",i);m=1);if(isprime(j),m=1);if(m==0,j=step(j)))));s}

print(origenhp(31123))

 


Esto ha sido una práctica sobre algoritmos, porque la cuestión carece de verdadero interés matemático, pero como tantas otras, es útil como pasatiempo y para pulir códigos. En nuestro caso, nos resultó interesante obviar las limitaciones de las hojas de cálculo en el tratamiento de números naturales grandes. Se logra a medias, porque con instrumentos más potentes siguen existiendo lagunas también.

miércoles, 8 de marzo de 2023

Tríos de cuadrados y de cubos

Releyendo el libro “Las Matemáticas de OZ” de Clifford A. Pickover he encontrado este acertijo: “Encontrar tres números diferentes cuya suma de cubos sea un cuadrado y la de sus cuadrados sea un cubo”. He visto que es una buena razón para practicar algoritmos.

Los tres números iguales

Sin la exigencia de que sean diferentes obtendríamos rápidamente el trío (3, 3, 3), pues 32+32+32=27=93 y 33+33+33=81=92.

También es válido (192,192,192): 1922+1922+1922=483 y 1923+1923+1923=46082

En este caso de que los tres sean iguales se resuelve fácilmente por descomposición en factores primos, pues ambas sumas se reducen a 3n3=p2, 3n2=q3. Debemos buscar un número tal que si e3 es el exponente de 3 en el mismo, se cumpla que 1+3e3 sea múltiplo de 2 y que 1+2e3 lo sea de 3. Claramente es válido en el 3, lo que daría la primera solución. También se cumple en todos aquellos números en los que el exponente de 3 es 1, como 192=3*26. En el resto de casos, el que 1+3e3 sea múltiplo de 2 nos obliga a que e3 sea impar, y el que 1+2e3 sea múltiplo de 3 a que e3 tenga la forma 3k+1 (es fácil razonarlo). Así que los exponentes válidos para el 3 serán 1, 7,13,19,…tipo 6k+1.

En el resto de factores primos del número no se ven afectados sus exponentes por el factor 3, luego deberán ser tales que al multiplicarlos por 3, para formar los cubos, el resultado sea par, luego serán múltiplos de 2. Igualmente, al multiplicarlos por 2, el resultado ha de ser un cubo, luego sus exponentes serán múltiplos de 3. Los únicos exponentes que cumplen esto son los múltiplos de 6, luego ya lo tenemos resuelto:

Si los tres números son iguales, el exponente de 3 ha de ser del tipo 6k+1 y los del resto de factores primos, del tipo 6k.

Hemos realizado un búsqueda con Excel, y las primeras soluciones son


Se observa que los exponentes (segundo número de cada corchete) cumplen lo establecido.

Esto nos permite encontrar más soluciones y comprobar que existen infinitas.

Los tres números diferentes

En este caso nos vemos obligados a usar algún algoritmo. No es difícil, pero sí lento. Para cada N recorremos todos los pares de números menores que N, diferentes de N y entre sí. Les aplicamos la condición de Pickover e imprimimos si es válida. Desgraciadamente, es un proceso lento, pero se consiguen resultados.

Usamos una función dependiente de N:

Function tresnumeros$(n) ’ Es tipo texto para un conjunto

Dim i, j

Dim s$

 

s = ""

For i = 2 To n – 1 ‘Primer número, que no llega a n

For j = 1 To i – 1’ Segundo número, inferior al primero

‘Aplicamos el criterio

If escuad(i ^ 3 + j ^ 3 + n ^ 3) And escubo(i ^ 2 + j ^ 2 + n ^ 2) Then s = s + " # " + Str$(n) + " " + Str$(i) + " " + Str$(j) ‘Solución

Next j

Next i

tresnumeros = s

End Function

Si no es solución, devuelve la cadena vacía “” y si lo es, un texto con los tres números.

Al ser un algoritmo con dos bucles, se tarda mucho en encontrar soluciones. Las primeras son:

A partir de la siguiente, la hoja de cálculo deja de ser fiable para números enteros.

Podemos probar una versión para PARI:

is(n)={my(i=1,j=1,m=0,v=[0,0,0]);for(i=1,n-1,m=0;for(j=1,i-1,if(ispower(i^2+j^2+n^2,3)&&issquare(i^3+j^3+n^3),m=1;v[1]=n;v[2]=i;v[3]=j;print(v))));m}

for(i=1,10000,if(is(i),print(i)))

Es más complicada de seguir, pero nos da alguna solución más en un tiempo de proceso razonable:

252, 234, 198

464, 304, 256

2060, 1854, 1030

4046, 2600, 1122

4394, 4056, 1690

Comprobamos la última solución:

43942+40562+16902=3383

43943+40563+16903= 3954602


Sin restricción de ser diferentes

En ese caso, las variables i, j del algoritmo las dejaremos recorrer todo el rango entre 1 y N. Así se obtendrán todas las soluciones posibles, en la siguiente tabla, hasta un tope de 5000:

3, 3, 3

192, 192, 192

252, 234, 198

464, 304, 256

2060, 1854, 1030

2187, 2187, 2187

4046, 2600, 1122

He probado a comparar otras potencias con un exponente mayor, pero resultan cálculos muy lentos y sin resultado interesante. Sin embargo, al introducir la potencia de exponente 1, las soluciones se han multiplicado. Por ejemplo, este listado corresponde al caso de que los cubos y también la suma con exponente 1 sumen ambas un cuadrado:

6, 2, 1

14, 9, 2

15, 13, 8

16, 14, 6

19, 9, 8

20, 10, 6

20, 17, 12

24, 8, 4

27, 19, 3

28, 22, 14

29, 15, 5

29, 19, 16

35, 25, 4

36, 17, 11

Y siguen muchos más con frecuencia similar. Un ejemplo:

27+19+3=49=72

273+193+33=1632

Con ligeros retoques en los códigos se pueden abordar otros casos similares, pero contando con un equipo que no sea muy lento en los cálculos.