jueves, 19 de octubre de 2017

Suma de cuadrado y capicúa


Hoy comenzamos con una cuestión sencilla que nos va a permitir algún desarrollo:

¿De cuantas formas se le puede restar a N un cuadrado y que la diferencia sea capicúa?

Operaremos con capicúas de al menos dos cifras, pues el conjunto de 0 a 9, aunque se consideran capicúas, produce resultados sin interés. Con nuestra herramienta Cartesius (http://www.hojamat.es/sindecimales/combinatoria/herramientas/herrcomb.htm#cartesius) el estudio es muy simple. Basta usar las condiciones siguientes, que hemos particularizado para el número 892:

xtotal=2
xt=1..1000
X1=filtro(cuadrado)
x2=filtro(capicua)
suma=892

En ellas se suman dos números del 1 al 1000 filtrando el primero como cuadrado y el segundo como capicúa. El resultado es

Como vemos, se obtienen cinco soluciones.

Número de descomposiciones

Con Cartesius se presenta el proceso de forma clara, pero para contar soluciones es preferible otra herramienta. Comenzaremos con el BASIC de las hojas de cálculo. Se puede definir fácilmente una función que cuente las sumas que se producen. Necesitaremos la función ESCAPICUA y con ella organizar un bucle de búsqueda. Dispones de su código al final de la entrada. La función requerida para encontrar esas sumas puede ser la siguiente:

Public Function numcuadcapi(n)
Dim x, p

p = 0 ‘ Contador de soluciones
For x = 1 To Sqr(n) ‘Llegamos hasta la raíz cuadrada de N
If escapicua(n - x ^ 2) Then p = p + 1 ‘Si es capicúa la diferencia, se incrementa el contador
Next x
numcuadcapi = p
End Function

Hay que tener en cuenta que ESCAPICUA no considera números de una cifra.

La probamos con el 892 y resultan cinco soluciones.

Si deseáramos leer esas soluciones, convertiríamos la función en una variable tipo texto para que las recogiera. Usaríamos esta variante:

Public Function numcuadcapi2$(n)
Dim x, a, b
Dim nc$

nc$ = ""
For x = 1 To Sqr(n)
a = x ^ 2
b = n - a
If escapicua(b) Then nc$ = nc$ + " CUAD " + Str$(a) + " CAP " + Str$(b)
Next x
numcuadcapi2 = nc$
End Function

Vemos en la imagen los dos tipos de resultados:

El segundo coincide con el obtenido en Cartesius.

La primera función nos permite obtener un listado de los números que admiten al menos una descomposición de este tipo:

12, 15, 20, 23, 26, 27, 31, 34, 36, 37, 38, 42, 45, 47, 48, 49, 53, 56, 58, 59, 60, 64, 67, 69, 70, 71, 75, 78, 80, 81, 82, 86, 89, 91, 92, 93, 97, 100, 102, 103, 104, 105, 108, 110, 111, 112, 113, 114, 115, 117, 119, 120,…

Con el lenguaje PARI se consigue la misma lista:

ispal(n)={n==eval(concat(Vecrev(Str(n))))&&n>=10}
numsumsqpal(n)={p=0;for(i=1,sqrt(n),if(ispal(n-i^2),p+=1));p}
for(x=1,100,q=numsumsqpal(x);if(q>=1,print1(x,", ")))

12, 15, 20, 23, 26, 27, 31, 34, 36, 37, 38, 42, 45, 47, 48, 49, 53, 56, 58, 59, 60, 64, 67, 69, 70, 71, 75, 78, 80, 81, 82, 86, 89, 91, 92, 93, 97, 100, 102, 103, 104, 105, 108, 110, 111, 112, 113, 114, 115, 117, 119, 120, 122, 124, 125, 126, 127, 130, 132, 133, 135, …

Entre los menores de 1000 el record lo tiene 817, con siete descomposiciones




Cuadrados con base capicúa

Podemos repetir el estudio pero exigiendo que la base del cuadrado sea también capicúa. Modificaremos los códigos para exigirlo. Con Cartesius habrá que modificar las condiciones:

xtotal=2
x1=1..32
x2=10..1000
xt=filtro(capicua)
es x1*x1+x2=892

Recorremos con X1 hasta la raíz de 892, con X2 hasta 1000, y exigimos que x1*x1+x2=892

Como era de esperar, no se obtiene ninguna solución, pero sí la tienen números cercanos a 892: 898 presenta dos soluciones, 11^2+777 y 22^2+414. Igual ocurre con 908, que es igual 11^2+787 y a 22^2+424. El resto de número próximos no presenta esta propiedad.

Con BASIC y PARI, añadiendo la condición de que la base sea capicúa mayor que 10, obtenemos un listado de los números que equivalen a este tipo de suma al menos de una forma:

132, 143, 154, 165, 176, 187, 198, 209, 220, 222, 232, 242, 252, 262, 272, 282, 292, 302, 312, 323, 333, 343, 353, 363, 373, 383, 393, 403, 413, 424, 434, 444, 454, 464, 474,…

El código PARI adecuado sería:

ispal(n)={n==eval(concat(Vecrev(Str(n))))&&n>=10}
numsumsqpal(n)={p=0;for(i=1,sqrt(n),if(ispal(i),if(ispal(n-i^2),p+=1)));p}
for(x=10,1000,q=numsumsqpal(x);if(q>=1,print1(x,", ")))

Devuelve el listado

132, 143, 154, 165, 176, 187, 198, 209, 220, 222, 232, 242, 252, 262, 272, 282, 292, 302, 312, 323, 333, 343, 353, 363, 373, 383, 393, 403, 413, 424, 434, 444, 454, 464, 474, 484, 494, 495, 504, 506, 514, 517, 525, 528, 535, 539, 545, 550, 555, 561, 565, 572, 575, 583, …

Se distinguen en la lista muchos números que son capicúas. Los extraemos:

ispal(n)={n==eval(concat(Vecrev(Str(n))))&&n>=10}
numsumsqpal(n)={p=0;if(ispal(n),for(i=1,sqrt(n),if(ispal(i),if(ispal(n-i^2),p+=1))));p}
for(x=10,1000,q=numsumsqpal(x);if(q>=1,write1("final.txt",x,", ")))

222, 232, 242, 252, 262, 272, 282, 292, 323, 333, 343, 353, 363, 373, 383, 393, 424, 434, 444, 454, 464, 474, 484, 494, 525, 535, 545, 555, 565, 575, 585, 595, 626, 636, 646, 656, 666, 676, 686, 696, 727, 737, 747, 757, 767, 777, 787, 797, 828, 838, 848, 858, 868, 878, 888, 898, 929, 939, 949, 959, 969, 979, 989, 999,…

Están todos los capicúas de tres cifras salvo los que tienen las decenas con valor 0 o 1. Es porque los capicúas al cuadrado solo pueden ser 11^2=121 y 22^2=484. Todo capicúa con la segunda cifra mayor que 1 y las otras no nulas produce al restarle 121 otro capicúa, pero en caso contrario, si las decenas son 0 o 1, la cifra de arrastre impide un resultado capicúa. Igual ocurre con el 484, que exige un 8 o 8n 9 en las decenas.

Hemos experimentado con sumas de triangular y capicúa, o con primos, pero aparecen muchos resultados que trivializan la cuestión. La dejamos abierta.

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)
If l < 2 Then
escapicua = False
Else
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

No hay comentarios: