martes, 31 de marzo de 2020

Números que equivalen a áreas de triángulos pitagóricos



El 18 de septiembre de 2009 publiqué una de mis primeras entradas de este blog, con el siguiente breve texto:

Ternas pitagóricas que comparten área

La lectura de la biografía de Lewis Carroll me ha sugerido el proponer la siguiente búsqueda, inspirada en un problema que le impidió dormir una noche:

¿Qué números enteros equivalen al área de un triángulo rectángulo de lados también enteros, de tres formas distintas?

La primera solución es 840, porque las tres ternas

15, 112 y 113
24, 70 y 74
40, 42 y 58

pertenecen a lados de triángulos rectángulos de área 840.

¿Cuáles son las siguientes soluciones?

A partir de ella, mi amigo Claudio Meller (https://twitter.com/MellerClaudio) publicó en OEIS el resto de soluciones, como puedes comprobar en http://oeis.org/A177021

A partir de cálculos que no vienen al caso, me ha apetecido volver a este tema, estudiando otros casos parecidos y los procedimientos para llegar a ellos.

Procedimiento general de búsqueda

Las condiciones del problema se traducen, dado un número N, en encontrar los dos catetos de una terna pitagórica adecuada, sea a2+b2=c2, tales que a*b=2*N. Bastará entonces buscar pares de divisores de 2N que sean catetos en una terna pitagórica. La hipotenusa c no tiene por qué intervenir.

Si organizamos la búsqueda con estas propiedades, será útil contar los pares válidos, para ver a cuántas áreas equivale N. También, según decidimos últimamente, podemos crear una función que devuelva una cadena de texto con los valores de los catetos. Proponemos esta, para Excel o Calc:

Function areapitag$(n)
Dim p, q, m
Dim s$
s$ = "": m = 0  ‘Se pone a cero el contador y el resultado
For p = 2 To Sqr(2 * n) ‘Un cateto no puede sobrepasar la raíz cuadrada de 2N
q = 2 * n / p ‘El otro divisor
If q = Int(q) Then ‘Tiene que ser entero
‘Si es terna pitagórica, se memoriza y se incrementa el contador
If escuad(p ^ 2 + q ^ 2) Then m = m + 1: s$ = s$ + " # " + Str$(p) + ", " + Str$(q)
End If
Next p
If s$ = "" Then s$ = "NO" Else s$ = Str$(m) + s$
areapitag = s
End Function

Así, si tomamos, por ejemplo el 840 del texto de arriba, nos devolverá:
AREAPITAG(840)=” 3 #  15,  112 #  24,  70 #  40,  42”

Significará que hay tres soluciones (primer 3 de la cadena) y que los catetos de cada una son (15,112), (24,70) y (40, 42), tal como afirmamos hace más de diez años.

Con esta función, si leemos el primer dígito del resultado S$, sabremos cuántas soluciones presenta cada número dado. En Excel podemos usar LEFT$(S;2), sabiendo el número está precedido por un espacio en blanco, o bien MID$(S,2,1). En cualquier bucle de búsqueda que organicemos, usaremos una de estas dos condiciones para identificar qué números no presentan solución o bien una o más de una.

Antes de emprender búsquedas, hay que advertir que si un número a posee un número de soluciones, también las tendrá a*m2, por la generación de las distintas ternas como múltiplos de una terna primitiva.

Números que son área de al menos una terna

La primera cuestión puede consistir en descubrir qué números coinciden con al menos un área de triángulo pitagórico. Con la función anterior areapitag basta exigir que el resultado sea distinto de “NO”. Los primeros números de este tipo son:




Todos equivalen a un área, salvo 210 que admite dos. Están ya publicados, como algunos de los que estudiaremos hoy.

Areas of Pythagorean triangles: numbers which can be the area of a right triangle with integer sides.

6, 24, 30, 54, 60, 84, 96, 120, 150, 180, 210, 216, 240, 270, 294, 330, 336, 384, 480, 486, 504, 540, 546, 600, 630, 720, 726, 750, 756, 840, 864, 924, 960, 990, 1014, 1080, 1176, 1224, 1320, 1344, 1350, 1386, 1470, 1500, 1536, 1560, 1620, 1710, 1716, 1734, 1890


Todos los términos son múltiplos de 6.

Se generan en PARI con un código algo oscuro. Es preferible este otro que proponemos, copia de la función areapitag:

for(i=1,2000,m=0;for(p=2,sqrt(2*i),q=2*i/p;if(q==truncate(q)&&issquare(p^2+q^2),m+=1));if(m>0,print1(i,", ")))

Puedes comprobar que se llega al mismo listado.

De ellos, algunos solo admiten una representación, como se ha visto en la tabla de más arriba. Si en el código PARI sustituimos m>0 por m==1, los obtendremos:

6, 24, 30, 54, 60, 84, 96, 120, 150, 180, 216, 240, 270, 294, 330, 336, 384, 480, 486, 504, 540, 546, 600, 630, 720, 726, 750, 756, 864, 924, 960, 990, 1014, 1080, 1176, 1224, 1344, 1350, 1386, 1470, 1500, 1536, 1560, 1620, 1710, 1716, 1734, 1920, 1944,…

Observamos que ya no está 210, que equivale a dos áreas. Esta sucesión no figura en OEIS.

Si en el código cambiamos m==1 por m==2, obtendremos los números que equivalen a dos áreas.

210, 1320, 1890, 2730, 4914, 5250, 5280, 7980, 10290, 11880, 17010, 18480, 19656, 21120, 24570, 25410, 29400, 30600, 32130, 33000, 34650, 35490, 41580, 44226,…

Por último, si igualamos a 3, resultará la sucesión con la que comenzamos la entrada

A177021                            Numbers which are the area of exactly three Pythagorean triangles.                        
840, 3360, 7560, 10920, 13440, 21000, 30240, 31920, 41160, 43680, 53760, 68040, 84000, 98280, 101640, 120960, 127680, 141960, 164640, 166320, 174720, 189000, 215040, 242760, 272160, 273000, 286440, 287280, 303240, 336000, 370440, 393120, 406560, 444360
AUTHOR Claudio Meller, on a suggestion by Antonio Roldán, Dec 08 2010

Para finalizar, si deseas practicar un poco, intenta encontrar estos números con nuestra función areapitag (con Excel o PARI). En esta sucesión a(n) es el menor número que equivale a las áreas de n triángulos pitagóricos:

A055193                            Smallest number that is the area of n distinct Pythagorean triangles.
6, 210, 840, 341880, 71831760, 64648584000, 2216650756320, 22861058133513600

jueves, 19 de marzo de 2020

Números casi amigos o comprometidos



Hoy repasaremos los llamados números comprometidos o casi amigos. Son dos números m y n tales que la suma de los divisores no triviales de uno coincide con el valor del otro. Así, son de ese tipo, 48 y 75, ya que la suma de divisores (función SIGMA) de 48 es 48+24+16+12+8+6+4+3+2+1=124, pero si no contamos el 1 y el propio 48 (divisores triviales) nos queda 75, que es el otro número. Recíprocamente, SIGMA(75)=124, y eliminando 75 y 1, nos queda 48.

Esta idea de divisores no triviales se recoge en la función de Chowla, que se puede definir como

CHOWLA(n)=SIGMA(n)-n-1. 

Así que en estos números se cumple

CHOWLA(48)=75 y CHOWLA(75)=48

Es evidente que esta función tiene valor 0 si un número es primo. Esto confirma que estos  números que estudiamos son todos compuestos.

Es trivial también que la función SIGMA coincide en ambos números m y n del par (en el ejemplo, 124) y que su valor es m+n+1. Este hecho se toma también como definición de números comprometidos:



Estos números están publicados en varios sitios. Destacamos la de OEIS, en la que se les da el nombre de “números comprometidos”:


Betrothed (or quasi-amicable) numbers.

48, 75, 140, 195, 1050, 1575, 1648, 1925, 2024, 2295, 5775, 6128, 8892, 9504, 16587, 20735, 62744, 75495, 186615, 196664, 199760, 206504, 219975, 266000, 309135, 312620, 507759, 526575, 544784, 549219, 573560, 587460, 817479, 1000824, 1057595, 1081184,…

Están insertados por pares, por lo que son casi amigos 48 con 75, 140 con 195, y así hasta el final.

Búsqueda de números comprometidos

No es difícil encontrar estos pares de números. En la página de OEIS enlazada más arriba podéis consultar un procedimiento en PARI, pero, es tan sintético, que es preferible desarrollar una función en VBasic de Excel, aunque se traduce fácilmente a otro lenguaje de programación.

Para cada número N, calcularemos la función SIGMA, suma de divisores y analizaremos si es mayor que N+1.

Si lo es, la diferencia M=SIGMA(N)-N-1 es un candidato a pareja de N

Si SIGMA(M)=M+N+1, hemos dado con un número N del tipo buscado y M será su pareja.

La función SIGMA se ha usado mucho en este blog. Una versión sencilla la tienes en https://hojaynumeros.blogspot.com/2019/10/la-funcion-sigma-y-sus-traslados.html

Con ella construimos una función que nos devuelva un 0 si el número no es comprometido, o su pareja M si lo es.

Function comprometido(n)
Dim m, s, c
s = sigma(n)
If s > n + 1 Then ‘Sigma suficientemente grande
‘Si m cumple la reciprocidad, vale, Si no, devuelve un cero
m = s - n - 1: If sigma(m) = m + n + 1 Then c = m Else c = 0
End If
comprometido = c
End Function

Esta función permite reproducir fácilmente las parejas comprometidas ya publicadas. Basta organizar una búsqueda y publicar solo las que presentan un resultado distinto de cero. En Excel las primeras serían:


Era previsible que las parejas aparecieran duplicadas, por la reciprocidad interna en ellas. Se puede programar que solo se publique uno de los miembros de la pareja.

De esta función deducimos un listado sencillo en PARI:

for(n=1,500,a=sigma(n)-n-1;if(a>1,if(sigma(a)-a-1==n, print1(n, ", "))))

Se confirma el listado:

48, 75, 140, 195, 1050, 1575, 1648, 1925, 2024, 2295, 5775, 6128, 8892, 9504, 16587, 20735,…

Cuestiones derivadas

Todos los pares conocidos, hasta 1010, tienen distinta paridad.

Con esta función podemos preguntarnos cuál es el primer par de comprometidos a partir de un número, por ejemplo, un millón. Hemos organizado la búsqueda y resultan
1000824 y 1902215

También podemos interpretar esto como una secuencia cíclica de dos pasos:
CHOWLA(CHOWLA(N))=N

Existen números en los que estos ciclos son de más de dos pasos. Son los casi sociales, estudiados por Mitchell Dickerman, como 1215571544, que da lugar a un ciclo de ocho pasos:

1215571544
1270824975
1467511664
1530808335
1579407344
1638031815
1727239544
1512587175
1215571544

Por último, estos números parecen no poseer otras propiedades, aparte de ser compuestos. Entre los primeros no hemos encontrado cuadrados, ni triangulares, o semiprimos, por ejemplo. Así que los dejamos aquí.

martes, 10 de marzo de 2020

Suma y producto de cubo y otro tipo (2)



En la anterior entrada estudiamos los números que son suma y también producto de un cubo y un capicúa. En esta buscaremos casos similares con cuadrados y triangulares.

Caso cubo y cuadrado

Tal como anunciamos en la entrada anterior, si sustituimos ESCAPICUA en la función CUBOYOTRO por ESCUAD, que determina si un número es cuadrado perfecto, podríamos repetir el estudio para cuando los factores y sumandos fueran uno cubo y otro cuadrado. El listado de esta otra función puede ser el siguiente:

Public Function escuad(n) As Boolean
If n < 0 Then
escuad = False
Else
If n = Int(Sqr(n)) ^ 2 Then escuad = True Else escuad = False
End If
End function

Efectuando la sustitución, resultan los números de la tabla, como los menores que cumplen las condiciones exigidas:



Ejemplo: 1323=3^3+36^2=3^3*7^2

Con PARI hay que cambiar un poco el algoritmo, por las peculiaridades de la función issquare:

condi1(n)= my(c=0); a=truncate(n^(1/3)); for(x=2, a, for(b=2,sqrt(n),if(n==x^3*b^2,c=1)));c
condi2(n)= my(c=0); a=truncate(n^(1/3)); for(x=1, a, b=n-x^3;if(issquare(b)&&b>0,c=x));c
for(y=1,20000, if(condi1(y)&&condi2(y),print1(y,", ")))

Así podemos ampliar el listado anterior:

72, 108, 128, 392, 512, 576, 968, 1323, 1372, 1568, 1944, 2000, 2304, 2312, 2700, 2888, 3200, 3267, 3456, 3528, 4000, 4608, 5400, 6272, 6400, 6561, 6912, 8192, 8748, 9000, 9800, 10125, 10952, 12168, 12348, 12544, 14283, 14400, 16200, 16928, 17496, 18000, 18252, 18496, 19773,…

La simultaneidad de un cubo y de un cuadrado en un producto hace sospechar que algunos términos sean potencias perfectas en esta sucesión. En efecto, los primeros casos son:

128=2^7, 512=2^9, 6561=3^8, 8192=2^13, …

En ellos el exponente se ha formado combinando el 3 del cubo con el 2 del cuadrado.

Caso cubo y triangular

En la función CUBOYOTRO podemos sustituir la función ESCUAD por la ESTRIANGULAR. Un número es triangular cuando al multiplicarlo por 8 y sumar 1 se convierte en cuadrado. Lo puedes ver con un sencillo desarrollo:

8*T(n)+1 = 8*n*(n+1)/2+1 = 4n2+4n+1 =(2n+1)2

Con esta propiedad se construye un criterio para saber si un número es triangular:

Function estriangular(n) As Boolean
Dim a
If escuad(8 * n + 1) Then estriangular = True Else estriangular = False
End Function

Sustituimos en CUBOYOTRO la función ESCAPICUA (o ESCUAD) por esta otra y obtendremos los números que son producto de cubo y triangular y también una suma del mismo tipo. Los primeros son:



Como en anteriores ocasiones, C1 y C2 son los dos cubos y CAP1, CAP2, en este caso, los triangulares (se ha deslizado la abreviatura de capicúa).

Por ejemplo, 1029=9^3+300=9^3+24*25/2, suma de cubo y triangular, y además, 1029=7^3*3=7^3*2*3/2. Producto de cubo y triangular.

En estos ejemplos está incluido el 0 como triangular. En el siguiente listado, obtenido con PARI, no figuran:

48, 405, 567, 648, 750, 960, 1029, 1215, 1344, 1680, 1848, 2024, 2106, 2160, 2835, 2880, 3240, 3248, 3430, 3480, 3672, 4760, 5145, 5328, 5670, 7203, 8100, 8232, 10125, 12160, 12320, 12555, 13392, 15000, 15147, 15309, 15435, 15624, 16128, 16848, 17982, 18865, 19656,…

Con vistas a estudiar este lenguaje, se inserta el código usado:

condi1(n)= my(c=0); a=truncate(n^(1/3)); for(x=2, a, for(b=2,sqrt(2*n),if(n==x^3*b*(b+1)/2,c=1)));c
condi2(n)= my(c=0); a=truncate(n^(1/3)); for(x=1, a, b=n-x^3;if(issquare(8*b+1)&&b>0,c=x));c
for(y=1,20000, if(condi1(y)&&condi2(y),print1(y,", ")))

Cubos con primos

Para esta modalidad necesitamos la función  ESPRIMO, muy usada en este blog. La puedes consultar, por ejemplo,  en la dirección


Al igual que se procedió en casos anteriores, sustituimos ESCAPICUA por ESPRIMO en la función CUBOYOTRO, con el resultado:


Si observamos las dos últimas filas, descubriremos muchos números primos como base del segundo cubo. En este caso, el número tendrá una descomposición en factores primos del tipo N=p^3*q, con lo que poseerá ocho divisores si p es distinto de q, porque TAU(N)=(3+1)(1+1)

Por ejemplo, 189=2^3+181=3^3*7, y sus ocho divisores son  189, 63, 27, 21, 9, 7, 3 y 1.

Si p=q, N=p^4, como es el caso de 81, y TAU(81)=1+4=5, siendo sus divisores 81, 27, 9, 3 y 1.

Terminamos aquí los casos. Podríamos ahora repetir el trabajo con cuartas o quintas potencias, pero se intuye que no tendrían demasiado interés. Como propuesta, se incluyen los primeros de algunos casos:

Potencias cuartas con primos

Número               Descomposición                                           
32          C1  1 PR1  31 C2  2 PR2  2                                         
48          C1  1 PR1  47 C2  2 PR2  3                                         
80          C1  1 PR1  79 C2  2 PR2  5                                         
112        C1  3 PR1  31 C2  2 PR2  7                                         
208        C1  3 PR1  127 C2  2 PR2  13                                    
243        C1  2 PR1  227 C2  3 PR2  3                                       

Por ejemplo, 112=3^4+31=2^4*7

Potencias cuartas con cuadrados

Número               Descomposición          
                                 
400        C1  4 PR1  144 C2  2 PR2  25                      
2025      C1  6 PR1  729 C2  3 PR2  25                      
3600      C1  6 PR1  2304 C2  2 PR2  225                 
6400      C1  8 PR1  2304 C2  4 PR2  25                   
15625    C1  10 PR1  5625 C2  5 PR2  25                 

Así, 3600=6^4+48^2=2^4*15^2

Es fácil razonar que todos los números de este tipo son cuadrados.

Potencias cuartas con triangulares

16          C1  1 PR1  15 C2  2 PR2  1                          
96          C1  3 PR1  15 C2  2 PR2  6                          
2401      C1  4 PR1  2145 C2  7 PR2  1                      
3040      C1  5 PR1  2415 C2  2 PR2  190                 

No tiene interés seguir con más ejemplos. Aquí terminamos.



martes, 25 de febrero de 2020

Suma y producto de cubo y otro tipo (1)



Muchas de las entradas de este blog surgen de los cálculos diarios que publico en Twitter (@Connumeros). El que sigue nos va a dar materia para más de una entrada.

El día 21/5/19 obtuve esta propiedad:

El número de fecha de hoy, 21519 se descompone en un producto de un cubo por un capicúa y también en una suma del mismo tipo:
21519=3^3×797
21519=12^3+19791

No sabía en ese momento si existirían muchos números que compartieran las dos expresiones N=p^3*q y N=r^3+s, y parece que sí, que son abundantes.

Para acotar la búsqueda, exigiremos que los cuatro números p, q, r y s sean enteros positivos. La exclusión del 0 evita casos triviales.

Al iniciar el estudio he pensado que el número que acompaña al cubo puede ser cuadrado o triangular, por ejemplo, en lugar de capicúa. Esto amplía el estudio y por eso es posible que se necesiten varias entradas.

Suma y producto de cubo y capicúa

La primera condición, N=p^3*q, permite desechar aquellos números N que no sean múltiplos de un cubo. Esto se logra fácilmente con la descomposición factorial y el estudio de los exponentes de los factores primos. El inconveniente es que en un blog como este se alargaría mucho la explicación del procedimiento para crear nuestra función FACTORES y la rutina SACAPRIMOS. Por eso, y no es nuevo en estas entradas, emprenderemos la búsqueda con medios más sencillos. El peligro estribaría en la lentitud, pero no es inconveniente en este caso. Con Excel se consiguen listas con una rapidez aceptable.

Comenzamos, como es usual en estas búsquedas, con la creación de una función, a la que llamaré CUBOYOTRO, que nos indique si un número N cumple los dos requisitos N=p^3*q y N=r^3+s. Su estructura nos va a permitir adaptarla a todos los casos que estudiemos, pues bastará sustituir la función ESCAPICUA (para el caso inicial) por ESCUAD, ESTRIANGULAR u otra. En cada tipo explicaremos estas funciones auxiliares. Comenzamos con los capicúas. La función recomendada es la siguiente:

Public Function cuboyotro$(n, k) ‘Añadimos un parámetro k por si deseamos cambiar cubo por otra potencia
Dim x, a, y, b, c
Dim s$


s$ = "" ‘Usamos un string para presentar bien los cuatro números p, q, r y s
a = n ^ (1 / k) ‘En este primer caso k valdrá 3. La variable a es el tope de búsqueda
For x = 1 To a
c = n - x ^ k ‘Se resta del número la potencia (en el primer ejemplo, un cubo)
If escapicua(c) And c > 10 Then ‘Más adelante se cambiará ESCAPICUA
For y = 2 To a ‘En esta parte ya se ha cumplido la segunda condición N=r^3+s
If n Mod y ^ k = 0 Then ‘Para la primera condición p^3 ha de ser un divisor de n
b = n / y ^ k
If escapicua(b) and b>10 Then ‘Si el cociente es capicúa, se publica la solución
s$ = " C1 " + Str$(x) + " O1 " + Str$(c) + " C2 " + Str$(y) + " O2 " + Str$(b)
‘El string nos presenta los cubos C1 y C2 y sus compañeros O1 y O2.Puede haber más soluciones.
End If
End If
Next y
End If
Next x
If s$ = "" Then s$ = "NO" ‘Asignamos un “NO” al caso sin solución
cuboyotro = s$
End Function

Hay que advertir algún detalle sobre esta función.

La decisión de evaluar en primer lugar la segunda condición y después la primera no ha sido deliberada, y de hecho, poco eficiente, pues si se  cambia el orden se incrementa la velocidad de respuesta de la función. Como resulta rápida así, no se ha corregido y lo dejamos como ejercicio.

Este esquema es la base para otras búsquedas. Ya se ha destacado que con un cambio de ESCAPICUA por otra función se podrían abordar otros casos. Igualmente, aunque en lo que sigue haremos k=3 para buscar cubos, se deja abierta la posibilidad de aumentar el exponente.

La función ESCAPICUA se inserta en el Anexo del final de esta entrada. La costumbre es considerar capicúas los números de una cifra, pero aquí no nos interesa esta posibilidad, pues aparecen casos sin interés. Exigiremos que sean mayores que 10, como puedes comprobar en el listado de la función.

Los primeros números con esta propiedad son


Junto a cada uno se presentan los cubos C1 y C2 y el otro componente, en este caso capicúa, en O1 y O2.

Por ejemplo, 2176=4^3+2112=2^3*272, dos cubos y dos capicúas.

En PARI

Al tener que cumplir varias condiciones, el listado para PARI resulta algo extenso, pero es bastante rápido en su ejecución.

maxexpo(n) = s=1; f=factor(n); for(i=1, matsize(f)[1], t=f[i,2]; if(t>>s, s=t)); s
palind(n)=n==eval(concat(Vecrev(Str(n))))
condi1(n)= c=0; if(maxexpo(n)>=3,  a=n^(1/3); for(x=2, a, if(n%x^3==0,b=n/x^3;if(palind(b)&&b>=10,c=x))));c
condi2(n)= c=0; a=n^(1/3); for(x=2, a, b=n-x^3;if(palind(b)&&b>=10,c=x));c
for(y=2,20000, if(condi1(y)&&condi2(y),print1(y,", ")))

Con él podemos reproducir y ampliar la lista de arriba:

528, 704, 888, 1128, 1208, 1375, 1408, 1616, 1696, 1856, 2176, 2424, 2727, 2904, 2984, 3064, 3552, 3632, 3773, 3952, 4280, 4347, 4440, 4520, 4752, 5488, 5568, 5736, 5994, 6296, 6336, 6464, 6784, 7352, 7752, 8181, 8384, 8888, 10071, 10944, 11000, 11264, 11319, 12224, 12798, 13635, 13875, 14168, 14641, 15928, 16128, 16362, 16375, 17172, 18048, 18656, 19008, 19536, 19629, 19899,…

Hay que recordar que todos ellos son múltiplos de un cubo con base no trivial  y, por tanto, todos son compuestos. Entre ellos aparecen casos particulares interesantes. Por ejemplo:

Números del tipo p^3*11 o p^3*101. En estos dos casos y otros similares, el capicúa correspondiente al producto es un número primo, como ocurre en 704=4^3*11=2^3+696.

Caso del 14641: Como equivale a 11^4, su desarrollo sería 11^3*11. Hay que esperar que pertenezcan a este listado potencias de primos, aunque sin buscarlos no se puede asegurar. Por ejemplo, 101^4 cumple la primera condición (producto), pero no es suma de cubo y capicúa. El siguiente es 40353607, que es potencia de primo (40353607=7^9) y se descompone en producto de cubo y capicúa (40353607=49^3*343) y en suma de cubo y capicúa (40353607=334^3+3093903). Hasta una cota de 8*10^7 ya no hay más casos.

El número 14641 es capicúa. Podríamos preguntarnos si existen más capicúas en la sucesión. En la primera tabla hemos visto algún capicúa. Los primeros son: 888, 3773, 6336, 8888, 14641, 80008, 88088,…

Por ejemplo, 3773 es capicúa, y equivale a 11^3+2442 y a 7^3*11.
Igualmente, el capicúa 6336 es igual a 11^3+5005 y a 4^3*99.

Finalmente, destacamos el número 74088, que es el cubo de 42, y también coincide con la suma de otro cubo y un capicúa, 35^3+31213, y también con un producto similar, 6^3*343. Esto es posible por ser 343 capicúa y cubo de 7.
Se podría buscar más casos particulares, pero es preferible pasar a otras estructuras, que dejaremos para la siguiente entrada.

ANEXO

Código de la función ESCAPICUA

Public Function escapicua(n) As Boolean
Dim l, i, k
Dim c As Boolean
Dim auxi$,nn$

nn$ =Str$(n)

auxi= Right(nn$, Len(nn$) - 1)
l = Len(auxi)
c=True
If l >1 Then
c = True
i = 1
k = Int(l / 2)
While i <= k And c
  If Mid(auxi, i, 1) <> Mid(auxi, l - i + 1, 1) Then c = False
  i = i + 1
  Wend
End If
escapicua = c
End Function


jueves, 13 de febrero de 2020

Uso de la fuerza bruta



El día 29/12/19 descubrí este tweet de @d_r_o_n_e:


En él podemos ver un ejemplo que puede reproducirse mediante el uso de la “fuerza bruta”, herramienta que aparece en este blog muchas veces, aunque no se confiesen todas. Consiste en recorrer todas las variantes de un problema sin usar razonamientos ni condiciones complementarias. Es una buena estrategia comenzar con esta forma de buscar para después ir afinando resultados, explicarlos y, si es posible, justificarlos.

Uso de la herramienta Cartesius

Nuestra herramienta Cartesius también ayuda a combinar variables de todas las formas posibles, pero se hace lenta cuando nos acercamos al rango de los números de cuatro cifras. La puedes descargar desde


Con ella hemos intentado este planteo:

XTOTAL=3
XT=1..200
ES X1*X2*X3/1000=X1+X2+X3
CRECIENTE

Es fácil entender su significado: combinaremos tres variables, todas entre 1 y 200, de forma que se cumpla la condición pedida y después nos quedamos con las crecientes. Al cabo de más de media hora se obtuvo esta tabla, completada en sus dos últimas columnas con las dos expresiones que deben coincidir.


Observamos, y lo confirmaremos un poco más abajo, que aparecen repetidas algunas soluciones menores que 444, como son 231 o 240. Con el planteo propuesto se encontraron 32 soluciones, de las que solo hemos reproducido las primeras. Aparecen en orden inverso al natural porque cuando unos factores tienen igual suma, su producto crece cuando sus diferencias son menores. Con este intento descubrimos ya que la técnica de la “fuerza bruta” es muy lenta en producir resultados.

Analizando la búsqueda descubrimos que Cartesius ha tenido que analizar 200*200*200 =8*10^6 números, y en cada uno calcular si una igualdad se verifica o no. Eso es mucho para un portátil normal. Ahí es donde falla la fuerza bruta, en la multiplicación de casos que produce la Combinatoria.

Algoritmos

La “fuerza bruta” se caracteriza casi siempre por el uso de bucles del tipo FOR_NEXT, WHILE o REPEAT, casi siempre anidados en tres o cuatro niveles.
Lo normal, en ejemplos similares al que nos ocupa, es disponer de tres bucles anidados, con la propiedad deseada en el interior de los tres. Comenzaremos exigiendo solo una condición de las propuestas por @d_r_o_n_e

En este caso podíamos comenzar por este código:

Sub fuerzabuta()
Dim i, j, k, a, b, fila

fila = 10   ‘La fila determina la construcción de una tabla en Excel
For i = 1 To 1000  ‘Bucle triple
For j = 1 To i
For k = 1 To j
a = i + j + k  ‘Cálculos previos
b = i * j * k / 1000
If a = b Then  ‘Condición pedida
fila = fila + 1: ‘Construcción de la tabla
ActiveWorkbook.ActiveSheet.Cells(fila, 2).Value = b
ActiveWorkbook.ActiveSheet.Cells(fila, 3).Value = i
ActiveWorkbook.ActiveSheet.Cells(fila, 4).Value = j
ActiveWorkbook.ActiveSheet.Cells(fila, 5).Value = k
End If
Next k
Next j
Next i
End Sub

Hemos ejecutado esta macro de Excel y nos han resultado muchas soluciones. Lo que nos interesa es que salgan repetidas. Por la forma de plantear el problema, aparecerán desordenadas. Las primeras han sido:



Coinciden con las obtenidas en Cartesius. Observamos su falta de orden y la existencia de un repetido, el 189. Según la tabla:

189=84+75+30=84*75*30/1000
189=100+54+35=100*54*35/1000

Es una solución también más pequeña que la propuesta de 444.

Para verlas todas ordenaremos la columna y así se verán mejor los repetidos. Con este método hemos descubierto los siguientes: 189, 207, 231, 240, 255, 273, 297, 420, 444, 480, 504, 741, 759, 768, 810, 891,… De ellos presentan soluciones triples 231, 504 y 891.


Más fuerza bruta (o menos)

Podíamos intentar descubrir tan solo los números en los que se da más de una solución. El problema es que para esto se necesitaría un bucle más, con el consiguiente aumento de tiempo de proceso. Es el coste de utilización de bucles múltiples sin apenas condicionamientos. Hay una forma de evitar un nuevo bucle, y es considerar que en el algoritmo anterior hemos hecho variar el valor de k cuando en realidad está condicionado por la igualdad que se pide a=i+j+k. Considerándolo así, lo único que ha de cumplir k es que su valor sea a-i-j y, por cuestión de unicidad, que no sea mayor que j. Esto es lo que hemos implementado en PARI:

for(n=1,500,m=0;b=0;for(i=1,n,for(j=1,i,c=i+j;if(c<=n&&n-c<=j,b=i*j*(n-c)/1000;if(b==n,m+=1))));if(m>1,print1(n,", ")))

Mantenemos los bucles con las variables i y j. Eliminamos el bucle de k sustituyéndolo por la expresión b=i*j*(n-c)/1000 y concretamos las condiciones que ha de cumplir. Con la variable m exigimos que haya repetición de casos. Hemos añadido un nuevo bucle, pero con los cambios apenas se resiente la velocidad del proceso. De todas formas, para rangos de números de 1000 más o menos, puede tardar muchos minutos o incluso más de una hora. Cosas de la fuerza bruta.

Los primeros resultados son:

189, 207, 231, 240, 255, 273, 297, 420, 444, 480, 504, 741, 759, 768, 810, 891, 1221, 1320, 2418,…

Con esto damos por terminada la búsqueda, porque la fuerza bruta cansa y no se aprende mucho con ella.

Rebajamos pretensiones

Podíamos exigir productos similares, pero con solo dos variables, es decir, N=i+j=i*j/100. Esto simplifica el problema, y solo lo incluimos como repaso de las técnicas empleadas anteriormente. Las explicaciones para el caso anterior valen también para este.

Con Cartesius

Plantearíamos, por ejemplo:

xtotal=2
xt=1..700
es x1+x2=x1*x2/100
creciente

Obtendríamos:



Las primeras columnas corresponden a los valores de i, j y las siguientes el valor repetido de N.

Así, 120+600=120*600/100=720
125+500=125*500/100=625

En principio, no parece que existan soluciones dobles.

Con una función de Excel:

Function esmultiple2(n)
Dim i, j, k, a, b, m

m = 0
For i = 1 To n
For j = 1 To i
a = i + j
b = i * j / 100
If a = b And a = n Then m = m + 1
Next j
Next i
esmultiple2 = m
End Function

Esta función cuenta las veces en las que se da la igualdad i+j=i*j/100. Organizando una búsqueda nos resulta:



Tampoco se aprecian repetidos

Con PARI

Traducimos la función anterior a PARI y la integramos en un bucle de búsqueda:

for(n=1,10000,m=0;b=0;for(i=1,n/2,b=i*(n-i)/100;if(b==n,m+=1));if(m>0,print1(n,", ")))

Volvemos a obtener los mismos resultados:

400, 405, 450, 490, 625, 720, 841, 1210, 1458, 2205, 2704, 5202,…

Tampoco aquí se detectan repetidos. Lo dejamos como complemento.