miércoles, 3 de diciembre de 2025

Un número como diferencia entre potencias (2)

En la anterior entrada sobre este tema se usó la descomposición en factores primos de un número. Esto supone declarar los vectores primo() y expo() de forma global y puede resultar un poco técnico. En esta segunda entrada consideraré otras alternativas.

Si no te quieres complicar con factores primos, puedes usar esta función, que te da las primeras soluciones y resulta rápida:

Function dospoten$(n)

 

Dim i, p, q, a, b, c, x

Dim s$

 

s$ = ""

x = n

For p = 2 To 12 ‘Se buscan potencias de exponentes del 2 al 12.Esto se puede cambiar

a = Int(x ^ (1 / p)) + 1 ‘Posible raíz p-nésima

For i = a To 10 * a

b = i ^ p – n ‘Se halla la diferencia con N

For q = 2 To 20

c = Int(b ^ (1 / q) + 0.000001) ‘Se identifica como potencia

If c ^ q = b Then ‘Si todo va bien, se publica

s$ = s$ + "# " + ajusta(i) + "^" + ajusta(p) + "-" + ajusta(c) + "^" + ajusta(q) ‘Si no se cuenta con la función AJUSTA, se puede usar Str$

End If

Next q

Next i

Next p

If s = "" Then s = "NO"

dospoten = s$ ‘Publica la lista de diferencias de potencias

End Function

Con alguna limitación, es útil, y yo la uso en mis cálculos diarios. Puede que no llegue a alguna solución, pero suele funcionar bien.

Unos ejemplos:

60=8^2-2^2# 16^2-14^2# 4^3-2^2# 4^4-14^2# 2^6-2^2# 2^8-14^2

112=# 11^2-3^2# 12^2-2^5# 16^2-12^2# 29^2-27^2# 29^2-9^3# 29^2-3^6# 8^3-20^2# 4^4-12^2# 2^7-4^2# 2^7-2^4# 2^8-12^2# 2^9-20^2# 2^11-44^2

13# 7^2-6^2# 16^2-3^5# 17^3-70^2# 4^4-3^5# 2^8-3^5


Uso de la herramienta CARTESIUS

Mi máquina de construir productos cartesianos condicionados también nos puede ayudar a encontrar diferencias de potencias dentro de un nivel elemental. En ella se puede exigir que las columnas a combinar sean potencias, lo que facilita su uso en esta cuestión. La puedes descargar desde

https://www.hojamat.es/sindecimales/combinatoria/herramientas/herrcomb.htm#cartesius

El problema es que la actualizo a veces, pero no la versión publicada, pero aquí valdrá.

La programación de esta búsqueda sería esta, concretada para el número 28:

xtotal=2

xt=1..100

xt=etiq(potencia)

ES x1-x2=28

 

Declara que se combinarán dos columnas (X1 y X2)

En ellas se escribirán 100 datos (pueden ser más a costa del tiempo de proceso)

Cada columna contendrá las primeras potencias.

Se deberá cumplir que X1 menos X2 sea 28 (esto es un ejemplo)

Al pulsar sobre el botón Iniciar se construirán las columnas de potencias:



En la siguiente página Producto obtendremos las primeras diferencias de potencias que equivalen a 28.

 

Esto es un simple complemento, para comprobar otros resultados y para conocer una posibilidad alternativa. No tiene más importancia.

Esta sería la solución para 28 con las anteriores herramientas:

# 6^2-2^3# 8^2-6^2# 4^3-6^2# 8^3-22^2# 37^3-225^2# 37^3-15^4# 2^5-2^2# 2^6-6^2# 2^7-10^2# 2^9-22^2

Las soluciones de Cartesius están contenidas en esta lista.


Uso del Buscador de Naturales

Mi herramienta Buscador de Naturales posee la función POTENCIA, tanto de forma booleana, como True o False como actuando sobre un parámetro. Esto nos permite plantear una búsqueda de diferencia de potencias de forma sencilla. Basta condicionar N a que sea potencia y después volverla a usar pero con parámetro N+K.

Lo vemos más claramente con el número 24 como ejemplo:


Las condiciones han sido:

POTENCIA: Busca los números que son potencias

ES POTENCIA(N+24): La partícula ES anuncia que se exigirá una condición complementaria mediante expresiones o funciones. Aquí es que N+24 sea también potencia.

EVALUAR: Indica qué se escribirá en la segunda columna. Aquí hemos pedido que sea N, una coma, y N+24

Puedes descargar esta herramienta desde

https://www.hojamat.es/sindecimales/divisibilidad/herramientas/herrdiv.htm#buscador

No resulta muy lento. Le hemos exigido tratar el 28 hasta un tope de 20000 y no ha tardado demasiado:


Coincide con anteriores planteamientos:

28 =2^5-2^2=6^2-2^3=2^6-6^2=2^7-10^2=2^9-22^2

Se han creado dos columnas que después se pueden copiar en otra parte de Excel y añadirles detalles:


Despedida simplista

¿No queremos seguir con algoritmos? Pues podemos construir una tabla de doble entrada en la que figuren las potencias ordenadas tanto en filas como en columnas, y usar las búsquedas de Excel para localizar el número deseado. Se podía comenzar el tema por aquí, y el trabajo pesado que da puede justificar el pensar en algoritmos.

Aquí se pueden localizar algunos de los ejemplos que se han usado. Los he destacado en rojo:


lunes, 24 de noviembre de 2025

Un número como diferencia entre potencias (1)

Antecedentes

En este blog se han estudiado varios tipos de diferencias de potencias. Por ejemplo, ya hemos visto aquí las diferencias de cuadrados, como puedes buscar en

https://hojaynumeros.blogspot.com/

También se han tratado las de cubos:

https://hojaynumeros.blogspot.com/2024/09/diferencias-de-cubos-enteros-positivos.html

O bien de cubos menos cuadrados y también el caso en el que los dos exponentes son iguales:

https://hojaynumeros.blogspot.com/2025/01/regresos-13-diferencia-de-potencias.html

Por último, algunas curiosidades sobre diferencias de potencias, como, por ejemplo. Acercamientos entre potencias

https://hojaynumeros.blogspot.com/2018/10/acercamiento-entre-potencias.html

En mi reciente publicación “Números y potencias” están contenidas varias cuestiones interesantes (descargable desde

https://www.hojamat.es/publicaciones/numpot.pdf)


Diferencias entre potencias de distinto exponente

No he abordado nunca (creo que es así, porque a mi edad la memoria falla), la diferencia entre dos potencias de distinto exponente. Aprovecharé el tema para presentar varias alternativas.

Función ESPOTENCIA

Hay varias formas de identificar una potencia perfecta. La más directa es la de descomponer el número en factores primos y encontrar el MCD de sus exponentes. Si este es mayor que 1, estaremos ante una potencia. Por ejemplo, 576=26*32. EL MCD de 6 y 2 es 2, luego 576 es un cuadrado. Esta técnica nos da el mayor exponente si el número es multipotencia, como el 64, que lo catalogará como sexta potencia. Para la cuestión actual lo que nos interesa es que sea verdaderamente una potencia.

Para sacar los factores primos disponemos de nuestra función SACAPRIMOS, que la puedes encontrar en

https://hojaynumeros.blogspot.com/2022/06/numeros-con-cifras-crecientes-o_02105820646.html

Esta función te devuelve los factores primos en el vector primo() y sus exponentes en expo(), además de indicar el número de esos factores en NUMOMEGA.

Esas variables se han de declarar de forma global en VBasic:

Global primo(50), expo(50)

Global numomega

 

Esta es la función ESPOTENCIA:

Public Function espotencia(n)

Dim i, j, s, p

 

If n = 1 Or n = 0 Then espotencia = 1: Exit Function

p = n

j = sacaprimos(p) ‘Explicado en el párrafo anterior

s = expo(1) ‘El vector expo está también explicado

If j > 1 Then

For i = 2 To j

s = mcd(s, expo(i)) ‘Calcula el MCD

Next i

End If

If s = 1 Then s = 0 ‘Si MCD es 1, no es potencia

espotencia = s ‘Devuelve el exponente o un cero

End Function

 

Búsqueda de diferencias con la función ESPOTENCIA

Haré uso de mi función ESPOTENCIA y de la correspondiente ISPOWER del lenguaje PARI. Esta última me permitirá llegar a números grandes con más facilidad.

La idea para buscar diferencias de potencias que coincidan con N será la de recorrer todos los números K hasta un tope prefijado, y estudiar si K y K+N son potencias. En caso afirmativo, habremos dado con una solución. Se les halla la raíz exacta y se incorporan al resultado.

La función quedaría así:

Function difepote$(n, tope)

Dim b, m, p, q, r, t

Dim s$

 

s = "" ‘Contenedor de soluciones

m = 0 ‘Contador de soluciones

For b = 1 To tope – n ‘El tope es parámetro prefijado

q = espotencia(b) ‘Daría cero o un exponente

p = espotencia(b + n) ‘Daría cero o un exponente

If p > 0 And q > 0 Then ‘Si no dan cero, es que son potencias

r = raiz_exacta(b + n, p)

t = raiz_exacta(b, q)

m = m + 1 ‘Nueva solución

s = s + "=" + ajusta(r) + "^" + ajusta(p) + "-" + ajusta(t) + "^" + ajusta(q)

End If

Next b

If s = "" Then s = "NO" Else s = ajusta(m) + ": " + s

difepote = s

End Function

La función RAIZ_EXACTA también se basa en los vectores PRIMO y EXPO. Para quien tenga interés, adjunto su código sin comentarios:

Function raiz_exacta(n, k)

Dim p, r, i

 

If n = 1 Or n = 0 Then raiz_exacta = n: Exit Function

p = espotencia(n)

If p Mod k = 0 Then

r = 1

For i = 1 To numomega

r = r * primo(i) ^ (expo(i) / k)

Next i

End If

If r = 1 Then r = 0

raiz_exacta = r

End Function

Un ejemplo del uso de esta función DIFEPOTE lo vemos con el número 28 y tope 200000:

Difepote(28;200000)=7:=2^5-2^2=6^2-2^3=2^6-6^2=2^7-10^2=2^9-22^2=37^3-15^4=2^17-362^2

Nos indica que ha encontrado siete soluciones y escribe sus desarrollos.

No es un algoritmo rápido. En el caso del 28 sí devuelve el resultado en pocos segundos, pero con un tope mayor puede tardar.

Elijo ahora el número 120 para destacar dos resultados que pueden resultar:

120=11^2-1^1=2^7-2^3=13^2-7^2=17^2-13^2=31^2-29^2

Una de las bases puede ser 1 (en ese caso tendrá exponente 1) y las dos bases pueden ser iguales, como en 2^7-2^3. Es normal que esto ocurra.

Versión en PARI

Para lograr más rapidez y llegar a números más grandes, he traducido la función DIFEPOTE al lenguaje PARI. No necesita explicación, salvo que en él es preferible presentar los resultados como lista y no como cadena de texto.

Una novedad en este lenguaje es que ISPOWER, además de devolver el exponente, guarda la base en una variable. Así, ispower(343,,&k) devolverá 3, porque es un cubo, y guardará la base 7 en la variable k. Tiene el inconveniente de que no maneja bien al caso del 1, pues lo considera siempre potencia de exponente cero. Esto se puede ignorar o intentar corregirlo en el código. He elegido esta última posibilidad, aunque el código se alarga demasiado. Es este:

difepote(n,tope)={my(b,b1,s=List(),r1,r2);p=ispower(n+1,,&r1);if(p>0,listput(~s,r1);listput(~s,p);listput(~s,1);listput(~s,1);listput(~s,"#"));for(b=2,tope-n,q=ispower(b,,&r2);b1=b+n;p=ispower(b1,,&r1);if(p<>0&&q<>0,listput(~s,r1);listput(~s,p);listput(~s,r2);listput(~s,q);listput(~s,"#")));s}

print(difepote(132608,2000000))

Aquí se trocea en líneas, pero hay que escribirlo sin saltos de línea. Este es el resultado en la web de PARI:


He elegido este ejemplo porque en él se destaca la mayor potencia de cálculo de PARI, ya que Excel tardaría más. Una solución más restringida, con un tope menor, es

4: =372^2-76^2=52^3-20^3=387^2-131^2=408^2-184^2

Si llegamos a un tope de 2000000, tarda sus buenos minutos en Excel, y al final devuelve:

10:=372^2-76^2=52^3-20^3=387^2-131^2=408^2-184^2=522^2-374^2=582^2-454^2=648^2-536^2=933^2-859^2=1068^2-1004^2=1212^2-34^4

El mismo resultado, pero con más lentitud.

Es una preferencia personal el pasar o no a PARI en esta cuestión.

Seguiré con el tema en la siguiente entrada.

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.

lunes, 3 de noviembre de 2025

Primos pitagóricos

Después de dos entradas publicadas sobre ternas pitagóricas, es útil completarlas con las hipotenusas más simples, que son los primos pitagóricos, es decir, los del tipo 4K+1. Estos primos se caracterizan por poder ser expresados mediante una suma de dos cuadrados de forma única. Este tema ha aparecido tanto en mis publicaciones que lo doy por sabido.

Por ejemplo, 13=4*3+1=22+32

 

Relacionando estos números con el estudio reciente sobre el número de ternas pitagóricas de las que un número es hipotenusa, podemos afirmar que estos primos sólo pueden ser hipotenusa de una sola terna. Así, el ejemplo del 13 se traduce en la terna única 132=122+52.

 

Los primeros primos pitagóricos están publicados en https://oeis.org/A002144, y son sencillos de identificar. La terna que producen es siempre primitiva, pues su carácter de primos impide su simplificación.


Según lo aprendido en las anteriores entradas, sus potencias serán hipotenusas de tantas ternas como indique su exponente. Por ejemplo, 13^5=371293 lo es de las cinco siguientes:

371293=31072+3712802=1399322+3439152=1428052+3427322=1456682+3415252=2614432+2636402

 

Propiedades

 

Una propiedad interesante de estos primos es que poseen un resto cuadrático igual a -1. Su justificación requiere teoría de nivel algo superior al que se mantiene en este blog, pero podemos efectuar comprobaciones. Por ejemplo, el primo 29=7*4+1 presenta el resto 28, que equivale a -1. En la siguiente captura de pantalla se observa su presencia:

 

 


El cuadrado de estos primos será promedio de otros cuadrados. Con lo aprendido en las dos últimas entradas es fácil comprobarlo:

Tomamos N=2(4K+1)2, que según Gauss se podrá descomponer en suma de cuadrados dos veces. Una de ellas es trivial, pues sería (4K+1)2+(4K+1)2, pero la otra convertirá a N2 en promedio de dos cuadrados.

 

(Ver https://hojaynumeros.blogspot.com/2024/03/potencias-equidistantes-de-cuadrados.html)

 

Por ejemplo, 73 es primo del tipo 4K+1, luego su cuadrado deberá ser promedio de dos cuadrados. Descomponemos 2*732 en cuadrados:

 

2*732=72+1032=732+732

 

De ahí se deduce la propiedad:

 

732=(72+1032)/2

 

Estos valores se pueden lograr también con la función ENTREDOS contenida en el enlace de más arriba.

 

También estos primos, sin elevar al cuadrado, son promedios de dos cuadrados. Basta recordar que si p es del tipo 4K+1, 2p sólo se descompone en una suma de cuadrados, como ocurre con el número 41:

 

41*2=82=12+92, luego 41=(12+92)/2

412*2=3362=312+492, luego 412=(312+492)/2

 

Tanto los primos pitagóricos como sus cuadrados son promedios de otros cuadrados.

 

Pasamos a la posibilidad de estos números de actuar como catetos.

 

Los primos pitagóricos como catetos de una terna

 

Este tema ya está resuelto anteriormente, pues si p es primo impar, su cuadrado se puede descomponer en dos factores de la misma paridad impar, aparte del trivial p*p, como serían p2 y 1. Por tanto, se cumple:


p2=((p2+1)/2)2-((p2-1)/2)2

Por ejemplo: 

 

732=26652-26642

  

Es fácil ver que el primo pitagórico es la raíz cuadrada de la suma de los catetos, que siempre es un cuadrado perfecto.

 

También, todo número del tipo (p2+1)/2 es posible hipotenusa que sea una unidad mayor que un cateto, aunque p no sea primo.

lunes, 20 de octubre de 2025

En cuantas ternas pitagóricas (2)

En la entrada anterior se discutió la posibilidad de que un número fuera hipotenusa de varias ternas pitagóricas. Continuará aquí el tema calculando de cuantas ternas puede ser cateto un número dado N.

Se tratará de buscar soluciones a la ecuación

N2=a2-b2

Estamos suponiendo implícitamente que a es mayor que b, luego podemos descomponer la diferencia de cuadrados de esta forma, llamando a=b+k

N2=(a+b)(a-b)=(b+k+b)(b+k-b)=k(2b+k)

Esto nos lleva a que la diferencia k entre a y b ha de ser divisor de N2, al igual que 2b+k. Es claro que

N2=k(2b+k)>k2, luego k<N

Estas consideraciones nos llevan a un protocolo para encontrar ternas con un cateto dado N.

Recorremos todos los divisores de N, sean K.

Para cada K estudiamos N2/K-K, que ha de ser un número par positivo. Su mitad será el número b, el otro cateto. La hipotenusa se calculará como b+K.

Este procedimiento lo plasma la siguiente función para VBasic:

Function escateto$(n)

Dim s$

Dim k, b, m, a, nn

 

s = "" ‘Contenedor de soluciones

m = 0 ‘Número de soluciones

nn = n * n’ Cuadrado de n

For k = 1 To n

If nn / k = nn \ k Then ‘Es un divisor del cuadrado

b = (nn / k - k) / 2 ‘Posible valor del otro cateto

If b > 0 And b = Int(b + 0.000001) Then ‘Solución válida

m = m + 1’Aumenta el contador

a = b + k ‘Hipotenusa

s = s + "+" + ajusta(a) + "^2-" + ajusta(b) + "^2" + " " ‘Se incorpora la solución

End If

End If

Next k

s = ajusta(m) + ":: " + s ‘Toma nota del número de soluciones

escateto = s

End Function

 

Esta función es razonablemente rápida, y eso que pueden aparecer más de 20 soluciones frecuentemente.

 

Un ejemplo: ¿De cuántas ternas pitagóricas es cateto el número 812?

Resultan trece ternas con cateto 812:

13:: +164837^2-164835^2 +82420^2-82416^2 +41213^2-41205^2 +23555^2-23541^2 +11788^2-11760^2 +5915^2-5859^2 +5713^2-5655^2 +3413^2-3315^2 +2900^2-2784^2 +1780^2-1584^2 +1537^2-1305^2 +1037^2-645^2 +1015^2-609^2

Se puede comprobar alguna, y la diferencia de cuadrados deberá ser 659344, el cuadrado de 812.

Es evidente que el posible cateto deberá ser un número tal que su cuadrado sea compuesto y que sea producto de un par de divisores de la misma paridad, como veremos más adelante. Esta condición la cumplen todos los números enteros positivos. Por esa razón todos pueden ser catetos.

En esta captura de pantalla de un rango elegido al azar se observa que todos los números naturales pueden ser catetos, pero que los números primos sólo lo son una vez:

 


Llaman la atención las 40 soluciones de 2208.

Otro procedimiento

El protocolo elegido es el más rápido, pero se puede usar un argumento sencillo y popular para encontrar las soluciones.

La idea es muy simple:

Si N2=a2-b2=(a+b)(a-b), los paréntesis han de ser de la misma paridad, llamémosles m y n respectivamente, ya que a=(m+n)/2 y b=(m-n)/2, y ambos han de ser enteros. Entonces la búsqueda de soluciones se reduce a encontrar productos de dos factores, ambos pares o ambos impares, con resultado N2.

Esta idea daría lugar a otra función parecida a la anterior:

Function escateto2$(n)

Dim s$

Dim k, b, m, a, nn, kk

 

s = ""

m = 0

nn = n * n

For k = 1 To nn

If nn / k = nn \ k Then

kk = nn / k

If k > kk And (k - kk) Mod 2 = 0 Then ‘Aquí se exige misma paridad

a = (k + kk) / 2: b = (k - kk) / 2

m = m + 1

s = s + "+" + ajusta(a) + "^2-" + ajusta(b) + "^2" + " "

End If

End If

Next k

s = ajusta(m) + ":: " + s

escateto2 = s

End Function

 

Probamos la función con el anterior ejemplo, 812:

13:: +1015^2-609^2 +1037^2-645^2 +1537^2-1305^2 +1780^2-1584^2 +2900^2-2784^2 +3413^2-3315^2 +5713^2-5655^2 +5915^2-5859^2 +11788^2-11760^2 +23555^2-23541^2 +41213^2-41205^2 +82420^2-82416^2 +164837^2-164835^2

Obtenemos los mismos trece resultados.

Casos particulares

Primos impares

Los números primos impares presentarán siempre un resultado, pues, si llamamos p al primo, su cuadrado p2 tendrá tres divisores, 1, p y p2, con lo que el único par a, b con a>b y de la misma paridad será 1 y p2. Las soluciones serán, pues, a=(p2+1)/2 y b=(p2-1)/2. En la siguiente imagen se observa esto en un pequeño rango de primos:



Semiprimos impares no cuadrados

Los números de este tipo son producto de dos primos impares distintos, p1 y p2. Sus divisores serán 1, p1, p2 y p1p2. Los divisores de su cuadrado serán 1, p1, p2, p1p2, p12, p22, p1p22, p2p12, p12p22, nueve divisores, que dan lugar a cuatro pares de productos con factores distintos de igual paridad. Por ejemplo, 15 y 35 se descomponen así:

15     4:: +113^2-112^2 +39^2-36^2 +25^2-20^2 +17^2-8^2

35     4:: +613^2-612^2 +125^2-120^2 +91^2-84^2 +37^2-12^2

Dejo como ejercicio sencillo razonar que los semiprimos no cuadrados pares presentan una descomposición:

14     1:: +50^2-48^2

26     1:: +170^2-168^2

Los semiprimos cuadrados se descomponen de una forma el 4 y de dos los impares.

4       1:: +5^2-3^2      

49     2:: +1201^2-1200^2 +175^2-168^2       

169   2:: +14281^2-14280^2 +1105^2-1092^2        

Las potencias de un primo tienen tantas descomposiciones como indique su exponente:

3       1:: +5^2-4^2      

9       2:: +41^2-40^2 +15^2-12^2

27     3:: +365^2-364^2 +123^2-120^2 +45^2-36^2

81     4:: +3281^2-3280^2 +1095^2-1092^2 +369^2-360^2 +135^2-108^2  

243   5:: +29525^2-29524^2 +9843^2-9840^2 +3285^2-3276^2 +1107^2-1080^2 +405^2-324^2   

Hay que recordar que se debe razonar sobre el cuadrado del número propuesto.

Esta función de número de descomposiciones no es multiplicativa, por lo que no es útil descomponer N en factores y contar uno por uno para luego multiplicar.

Un ejemplo:

4       1:: +5^2-3^2                                                   

9       2:: +41^2-40^2 +15^2-12^2                                              

36     7:: +325^2-323^2 +164^2-160^2 +111^2-105^2 +85^2-77^2 +60^2-48^2 +45^2-27^2 +39^2-15^2

Dejo aquí los casos particulares

Fórmula general

Lo que sigue es una adaptación de mi estudio contenido en https://hojaynumeros.blogspot.com/2017/01/numero-de-descomposiciones-en.html

En él se explican todos los casos de descomposición en diferencia de cuadrados, pero al no ser hipotenusa y cateto, se admite el caso en el que b=0. Bastará restar una unidad a la fórmula general para cuadrados, o, preferiblemente, corregir la función que se propone, restando 1 al final. Se copia a continuación:

Public Function numcatetos(n)

Dim p, q, r, s, t, nm

 

q = n * n: p = 0

While q Mod 2 = 0: q = q / 2: p = p + 1: Wend 'Extraemos la potencia de 2

If p = 1 Then nm = 0: Exit Function 'Caso imposible

'q es la parte impar

If q = 1 And p > 1 Then nm = Int((p - 1) / 2) + (p - 1) Mod 2

'Es potencia de 2 pura

If p = 0 And q > 1 Then t = fsigma(q, 0): nm = Int(t / 2) + t Mod 2

'Es un número impar

If p > 1 And q > 1 Then t = fsigma(q, 0): nm = t * Int((p - 1) / 2) + ((p - 1) Mod 2) * (Int(t / 2) + t Mod 2)

numcatetos = nm - 1

'Tiene parte par y parte impar

End Function

 

Con esta función doy por terminado el tema del número de ternas pitagóricas que produce un número dado, tanto como hipotenusa como siendo un cateto.