lunes, 24 de abril de 2023

Suma de los primeros primos y sus potencias (2)


En la anterior entrada sumamos números primos mediante funciones de Excel y Calc, PARI y el Buscador de Naturales. Ahora sumaremos potencias de primos. En este caso nos servirá la función sumprimoene de Excel, que suma las potencias de los primeros primos.

Suma de cuadrados de primos

La función sumprimoene permite sumar cuadrados de primos. El resultado es

Es un cálculo fácil y están publicados los resultados en http://oeis.org/A024450

4, 13, 38, 87, 208, 377, 666, 1027, 1556, 2397, 3358, 4727, 6408, 8257, 10466, 13275, 16756, 20477, 24966, 30007, 35336, 41577, 48466, 56387, 65796, 75997, 86606,…

Como simple curiosidad, y para un estudio más sencillo, este sería el planteamiento con el Buscador de Naturales:


La primera condición detecta cuadrados, la segunda obliga a que la base sea un número primo y la tercera suma. El resultado, como era de esperar, coincide con los anteriores:



Algunas propiedades

Los números primos pueden ser del tipo 4k+1 o 4k+3 (salvo el 2), pero sus cuadrados son siempre del tipo 4k+1, como se observa en estos desarrollos:

(4k+1)2=16k2+8k+1=4q+1

(4k+3)2=16k2+24k+9=4r+1

Esto hace que, al sumarlos, el 1 se vaya acumulando a 2, 3, 0, 1, 2…Los restos de estas sumas respecto al módulo 4 recorrerán el ciclo 0, 1, 2, 3…

Lo vemos en esta tabla, en la que hemos aplicado la función RESIDUO de Excel y Calc con módulo 4.



Así que cada dos sumas nos encontraremos con un número par, y cada dos ellos con un múltiplo de 4.

Si relacionamos los restos con los valores de N nos resulta:

Las sumas de orden 2n-1 son todas pares.

Las de orden 4n-3 son múltiplos de 4

De igual forma, sabemos que todos los primos son del tipo 6k+1 o 6k-1 (salvo el 2). Sus cuadrados serán:

(6k+1)2 = 36k2+12k+1=12m+1

(6k-1)2 = 36k2-12k+1=12m+1

Así que en cada sumando (salvo el primero, 4) recorrerá es sus restos respecto a 12 todos los valores desde 0 hasta 11. Lo puedes comprobar aquí:


De esta tabla se deduce que las sumas de orden 3n+1 son todas números múltiplos de 3, pues equivalen a 12m, 12m+3, 12m+6 o 12m+9.

Así podríamos ir descubriendo otras propiedades similares. Las tienes en la página http://oeis.org/A024450

Las demás sumas, como las del tipo 12k+7 pueden ser números primos. Vemos que es posible, que en la segunda columna de la siguiente tabla son todos primos.



En la tabla se observa algo esperable, y es que los restos módulo 12 solo pueden ser 1, 5, 7 y 11, aunque aquí no forman una sucesión periódica. También en los valores de N faltan los considerados en los párrafos anteriores, como 2n-1, 3n+1, 4n-3,…Es evidente que todos son pares.

Están publicados en http://oeis.org/A098562

Parece ser que el único cuadrado en la suma de cuadrados de primos es el 4 (conjetura). No se han encontrado cubos. De la sucesión de Fibonacci aparecen  13 y 377. De triangulares aparecen dos, 666 y 5022865. De oblongos no aparecen.

 

Suma de cubos de primos

Aquí no se esperan propiedades destacadas, pero lo intentamos.

Las primeras sumas de cubos de primos son del tipo:

(4k+1)3=64k3+48k2+12k+1=4m+1

(4k-1)3=64k3-48k2+12k-1=4m-1=4m+3

Los restos 1 y 3, al sumarse, producen todos los restos posibles: +1=2, 1+2=3, 1+3=0, 0+1=1,…Así, en la siguiente tabla aparecen todos los restos módulo 4:



Esto nos abre posibilidades de buscar primos y, ciertamente, se encuentran con relativa facilidad:

503, 15803, 35287433, 106954091, 3024050339, 3661922443, 7223017657, 10412687891, 11190761311, 12004517137, 25886083477, 36501131837,…

En este tema casi todo está ya publicado. Estos pertenecen a http://oeis.org/A066525 y no parecen tener propiedades interesantes.

 

 

 

lunes, 17 de abril de 2023

Suma de los primeros primos y sus potencias (1)

En esta entrada y la siguiente vamos a trabajar un poco con las sumas de los primeros primos, y ampliaremos a alguna potencia. La idea es encontrar curiosidades o propiedades, así como la naturaleza de esas sumas.

Herramientas previas con Excel y Calc

Comenzamos con una función que sume potencias de los primeros primos:

Public Function sumprimoene(a, k) As Long

Dim prim, n, s As Long

prim = 2 ‘Primer primo

n = 1 ‘Contador

s = 2^k ‘Primera suma

While n < a

prim = primprox(prim) ‘A cada primo le encontramos el siguiente

n = n + 1 ’Se incrementa el contador

s = s + prim ^ k ‘Sumamos la potencia del primo

Wend

sumprimoene = s

End Function

Por ejemplo, con esta función obtenemos la suma de los cubos de los primeros 15 primos:

SUMPRIMOENE(15;3)=385054

Podemos comprobarlo con esta tabla:

Versión PARI

La función básica en PARI es similar. Hemos usado la siguiente función IS en los valores 15 (número de primos) y 3 (exponente):

is(a,k)={my(s=2^k,n=1,p=2);while(n<a,p=nextprime(p+1);n+=1;s=s+p^k);s}

print(is(15,3))

En la web de PARI/GP hemos introducido este código para comprobar el resultado

 


Versión elemental con el Buscador

Nuestro Buscador de Naturales (http://www.hojamat.es/sindecimales/divisibilidad/herramientas/herrdiv.htm#buscador) suma primos, y veremos en la siguiente entrada que también puede sumar potencias. Basta escribir la condición PRIMO y la de EVALUAR TOTALES. En la imagen figuran los primeros primos y sus sumas parciales:

El resultado es 160.


Suma de primos igual a un primo

La suma de los primeros primos puede ser también un número primo. El primer caso elemental, además del mismo 2, es el 2+3=5, y el siguiente, 2+3+5+7=17

Con la función ya explicada en VBA de Excel se puede establecer una búsqueda sencilla de primos que son suma de los primeros primos. El resultado es:


En la primera columna figura el número de primos sumados y en la segunda el primo resultante. Estos últimos están publicados en
http://oeis.org/A013918

 

A013918              Primes equal to the sum of the first k primes for some k.                   

2, 5, 17, 41, 197, 281, 7699, 8893, 22039, 24133, 25237, 28697, 32353, 37561, 38921, 43201, 44683, 55837, 61027, 66463, 70241, 86453, 102001, 109147, 116533, 119069, 121631, 129419, 132059,

Nos vale en PARI el procedimiento publicado por Michael B. Porter en esa página:

n=0; forprime(k=2, 2300, n=n+k; if(isprime(n), print(n)))

Aquí aprovecha que forprime recorre los primos rápidamente.

Procedimiento con el Buscador

El carácter elemental de esta herramienta no permite bucles como los usados hasta ahora, pero una instrucción reciente nos permite visualizar los mismos resultados:


Indica que busquemos primos cuya suma sea también prima. Resulta:


Resalta en la lista los totales que son primos.

Otros resultados

La suma puedes ser un cuadrado, aunque no abundan los resultados.

Cuadrados

Procedimientos similares a los anteriores nos dan hasta seis soluciones. Por ejemplo, con PARI usamos

n=0; forprime(k=2, 2*10^6, n=n+k; if(issquare(n), print1(n,", ")))

Obtenemos cuatro fácilmente:


Están publicados en
http://oeis.org/A061890

100, 25633969, 212372329, 292341604, 3672424151449, 219704732167875184222756

Como estamos comparando números de naturaleza distinta, no es fácil descubrir propiedades.

Triangulares

Para saber si un número T es triangular basta con exigir que 8*T+1 sea cuadrado. Corregimos el código PARI y queda:

n=0; forprime(k=2, 2*10^6, n=n+k; if(issquare(8*n+1), print1(n,", ")))

Lo ejecutamos en la web de PARI:


También están publicados:

http://oeis.org/A066527

A066527              Triangular numbers that for some k are also the sum of the first k primes.         

10, 28, 133386, 4218060, 54047322253, 14756071005948636, 600605016143706003, 41181981873797476176, 240580227206205322973571, 1350027226921161196478736

Otros ejemplos

De números oblongos solo hemos encontrado el 2 entre los menores de 2*10^7. De cubos, ninguno. De la sucesión de Fibonacci, tres: 2, 5 y 2584 (entre los menores de 7*10^7)

Es normal que no se encuentren muchos.

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.