viernes, 11 de abril de 2025

Palíndromos triples

 El día 26 de marzo de 2021 publiqué esta igualdad de tipo palindrómico:

26321=16*5*61+16561+16*5*61

La triple repetición simétrica de las cifras 16561 es muy atractiva, e invita a descubrir casos similares. En principio se pueden considerar dos variantes de la cuestión. La primera seguiría el modelo del ejemplo, con un número impar de cifras y un capicúa central. Como ocurre en 125=1*2*1+121+1*2*1. La segunda consistiría en un esquema que prescinda de ese elemento central en cada sumando, como es el caso de 261=9*9+99+9*9.

La construcción de una lista con los primeros números que se siguen un esquema de este tipo no es difícil. La lista de los primeros del tipo AB*C*BA+ABCBA+AB*C*BA es la siguiente:

 


Con paciencia y una calculadora se puede ir construyendo. Lo interesante es descubrir soluciones para otro rango distinto, en el que el orden natural no ayude mucho. La siguiente tabla, a partir del número 50000, demuestra que los resultados no son ya tan previsibles:

Observamos que el algoritmo no mantiene el cero a la izquierda en 52405, porque Excel lo suprime por defecto. Es preferible corregirlo manualmente a tenerlo previsto en la programación. Es el precio por usar hojas de cálculo.

 

Función “PALINTRI”

Para construir un algoritmo adaptado a nuestra búsqueda, parece conveniente fijar como datos de entrada un número N, que es el que se quiere representar así, y dos parámetros, ka y kb, que representarían el número de cifras de cada elemento del esquema. Si uno de ellos es nulo, produciría variantes, como las dos que se han presentado en el párrafo anterior. Si kb=0 se entenderá que no hay elemento central.

La fijación del número de cifras parece aconsejable, porque aparecen más ejemplos de los previstos. Por ejemplo, con cinco cifras, dos cifras para los elementos laterales y una para el central, aparecen 416 ejemplos, desde 13229=12*2*21+12221+12*2*21 hasta 99974=64*6*46+64646+64*6*46. Incluso existen dos números que presentan dos soluciones:

46006=41*4*14+41414+41*4*14=26*6*62+26662+26*6*62
97925=58*4*85+58485+58*4*85=39*8*93+39893+39*8*93        

La organización de la búsqueda se basará en la variable a1, que representará a la parte lateral, con su simétrico a2, y su número de cifras ka. Así, en el ejemplo anterior a1=58, a2=85 y ka=2. Exigiremos que a1 sea distinto de a2 si tienen al menos dos cifras, para evitar trivialidades.

Procederemos de la misma forma con la parte central, llamando b a su valor, con la condición de que sea capicúa, y kb a su número de cifras. En el ejemplo b=4 y kb=1.

Con estas variables, y en sistema de numeración decimal, el valor de N quedaría:

N=2*a1*a2*b+a2+b*10^ka+a1*10^(ka+kb)

En el ejemplo:

97925=2*58*85*4+85+4*100+58*1000

En esta expresión nos basaremos para construir el algoritmo.

Para evitar búsquedas inútiles deberemos contar con que 2ka+kb  es una buena cota inferior para las cifras de N.

Si b=1 y kb=0 porque no se usa término central, la expresión se simplifica mucho:

N=(2*a1+1)*a2+a1*10^ka

Como ejemplo, 3804=23*32+2332+23*32 y se cumple:

3804=(2*23+1)*32+23*100=1504+2300=3804

Si integramos las dos expresiones en una misma función, su código será algo más largo de lo habitual, pero merece la pena.

 Versión en Excel

Las ideas anteriores están plasmadas en la siguiente función. Se han integrado las dos versiones del problema. La división se basa en si kb es mayor que cero o no:

Function palintri$(n, ka, kb)’Parámetros N y número de cifras
Dim kn, a1, a2, b, m, c, b1, aa1
Dim s$, t$ 

s = ""’Contenedor de resultados
c = 0 ’Contador de resultados


If kb > 0 Then ‘Caso con elemento central
If kb = 1 Then b1 = 1 Else b1 = 10 ^ (kb - 1) + 1 ‘Origen de búsquedas
For b = b1 To 10 ^ kb – 1 ‘Cifras centrales
If escapicua(b) Or kb = 1 Then ‘La variable b ha de ser capicúa
If ka = 1 Then aa1 = 1 Else aa1 = 10 ^ (kb - 1) + 1’ Origen de a
For a1 = aa1 To 10 ^ ka – 1 ‘Búsqueda de a
a2 = cifrainver(a1) ‘Simétrico de a
If a1 <> a2 Or ka = 1 Then ‘Condición algebraica
m = 2 * a1 * a2 * b + a2 + b * 10 ^ ka + a1 * 10 ^ (ka + kb)
If m = n Then ‘Hay solución
c = c + 1 ‘Se comunica solución
t = ajusta(a1) + "*" + ajusta(b) + "*" + ajusta(a2)
s = s + " ## " + t + "+" + ajusta(a1) + ajusta(b) + ajusta(a2) + "+" + t
End If
End If
Next a1
End If
Next b

Else ‘ Segunda variante, sin elemento central

If ka = 1 Then aa1 = 1 Else aa1 = 10 ^ (ka - 1) + 1
For a1 = aa1 To 10 ^ ka – 1 ‘Proceso similar
a2 = cifrainver(a1)
If a1 <> a2 Or ka = 1 Then
m = (2 * a1 + 1) * a2 + a1* 10 ^ ka
If m = n Then
c = c + 1
t = ajusta(a1) + "*" + ajusta(a2)
s = s + " ## " + t + "+" + ajusta(a1) + ajusta(a2) + "+" + t
End If
End If
Next a1
End If
If s <> "" Then s = ajusta(c) + " : " + s Else s = "NO"
palintri = s

End Function

En un buscador jugaremos con los parámetros para conseguir los resultados adecuados. Por ejemplo, estos son los primeros números de 4 cifras del tipo A*A’+AA’+A*A’

Persiste el problema del 0 inicial que suprime Excel, pero se entiende bien.

De igual forma, se detectan los números del tipo A*BB*A’+ABBA’+A*BB*A’:

 


VERSION PARI (para la primera variante)

Si deseamos más rango de soluciones puede ser útil la versión en PARI. La hemos diseñado para que devuelva sólo a1 y b, porque el resto se completa fácilmente. Su código es

ori(k)=my(m=1);if(k>1,m=10^(k-1)+1);m

simetrico(n)=eval(concat(Vecrev(Str(n))))

palind(n)=n==simetrico(n)

palintri1(n,ka,kb)=my(a1,a2,v=[ka,kb],b,m,es=0);for(b=ori(kb),10^kb-1,if(palind(b)||kb==1,for(a1=ori(ka),10^ka-1,a2=simetrico(a1);if(a1<>a2||ka==1,m=2*a1*a2*b+a2+b*10^ka+a1*10^(ka+kb);if(m==n,v[1]=a1;v[2]=b;es=1;print(n," es ",v[1],", ",v[2]))))))

for(i=10000,20000,if(palintri1(i,2,1),print(i)))

 

Basta cambiar la última línea según nuestras preferencias. Tal como está, repetiría la búsqueda efectuada con Excel. Este es un fragmento:

 

 






Por ejemplo, 16537=14*2*41+14241+14*2*41

 

VERSION PARI (para la segunda variante)

ori(k)=my(m=1);if(k>1,m=10^(k-1)+1);m

simetrico(n)=eval(concat(Vecrev(Str(n))))

palind(n)=n==simetrico(n)

palintri2(n,ka)=my(a1,a2,v=[ka,ka],m,es=0);for(a1=ori(ka),10^ka-1,a2=simetrico(a1);if(a1<>a2||ka==1,m=(2*a1+1)*a2+a1*10^ka;if(m==n,v[1]=a1;v[2]=a2;es=1;print(n," es ",v[1],", ",v[2]))));es

for(i=1000,9999,if(palintri2(i,2),print1("")))

 

 



Coinciden los resultados con los de Excel. Por ejemplo, 3613=16*61+1661+16*61

 

Con más cifras

 

Finalizamos con ejemplos que presentan más cifras en su desarrollo. Todos ellos se podrían encontrar realizando bucles para sus componentes, pero aquí se prefieren funciones para poder elegir el rango de búsqueda de N, y no los de sus componentes.

 

Seis cifras del tipo AB*CC*BA+ABCCBA+AB*CC*BA:

 


 

Comprobamos uno: 173173=12*88*21+128821+12*88*21

Es curioso que el resultado sea una concatenación de 173 consigo mismo.

 

Con cinco cifras y tres centrales

 

Este es un rango de soluciones obtenidas con Excel:

 



Así podríamos seguir.

 

No hay comentarios: