jueves, 24 de junio de 2021

Expresiones palindrómicas triples

El día 26 de marzo de 2021 publiqué en Twitter (@connumeros) 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. Para fijar ideas, nos limitaremos por ahora a dejar un número de una cifra como centro de los productos, como ocurre en 125=1*2*1+121+1*2*1 (caso impar de cifras) o bien tomar las dos mitades de cifras en el caso par de ellas, como ocurre en 261=9*9+99+9*9.

Para buscar los números que presentan estas expresiones consideraremos capicúas de más de una cifra, para evitar obviedades. Para cada número buscaremos capicúas menores que él y analizaremos si sus diferencias presentan el tipo de producto deseado. También excluiremos los números capicúas con un cero central, que dan lugar a cálculos triviales.

Para poder efectuar las búsquedas necesitaremos algunas funciones sobre cifras ya publicadas en este blog:

Localización de funciones en el blog

ESCAPICUA

Analiza si un número es capicúa o no. Su respuesta es VERDADERO o FALSO.

https://hojaynumeros.blogspot.com/2020/02/suma-y-producto-de-cubo-y-otro-tipo-1.html

 

NUMCIFRAS

Cuenta las cifras de un entero positivo

CIFRA

Extrae de un número una cifra determinada

TROZOCIFRAS

Extrae varias cifras contiguas de un número

Las tres figuran en

https://hojaynumeros.blogspot.com/2018/04/cancelaciones-anomalas-12.html

Con estas funciones se puede construir la que nos interesa. Para cada número buscará capicúas para el sumando central y, si cumplen lo exigido, ellos serán los valores de la función. Si no hay solución se devolverá un cero.

 public function doblecapi(n)

dim a, b, c, d, m,f

a=0  ‘Variable para la solución

m=n ‘Buscamos un capicúa desde m hasta 10

while a=0 and m>10 ‘No consideramos capicúas de una cifra

if escapicua(m) then ‘Hemos encontrado un capicúa

f=numcifras(m) ‘Contamos las cifras

b=trozocifras(m,1,int(f/2)) ‘Tomamos la mitad de las cifras por defecto

if f mod 2=1 then c=cifra(m,int(f/2)+1) else c=1 ‘Distinguimos entre par e impar

if m+b*c*cifrainver(b)*2=n and c<>0 then a=m ‘Es la línea más importante. Descubre la expresión palindrómica

end if

m=m-1 ‘Sigue la búsqueda del capicúa central

wend

doblecapi=a ‘Devolverá el capicúa central o un cero si no hay solución

end function

Con esta función logramos las primeras soluciones, acompañada cada una del capicúa central correspondiente:

13          11

30          22

51          33

76          44

105        55

113        111

125        121

137        131

138        66

149        141

161        151

173        161

175        77

185        171

197        181

209        191

216        88

220        212

238        222

256        232

261        99

274        242

292        252

Puedes comprobar algunas soluciones. Por ejemplo:

292=2*5*2+252+2*5*2=20+252+20=292

216=8*8+88+8*8=64+88+64=216

Podemos traducir este procedimiento al lenguaje PARI, aunque queda un código un poco largo. Las primeras líneas reproducen las funciones auxiliares:

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

cutdigit(a, p, q)=(a%10^q)\10^(p-1)

cifra(a,p)=cutdigit(a,p,p)

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

numcif(n)=#Vec(Str(n))

doblecapi(n)={my(a=0,b,c,m,f);m=n;while(a==0&&m>10,if(palind(m),c=1;print(m);f=numcif(m);b=cutdigit(m,1,truncate(f/2));if(f%2==1,c=cifra(m,truncate(f/2)+1));

if(m+b*c*reverse(b)*2==n&&c<>0,a=m));m-=1);a}

Hasta aquí la función doblecapi, y podemos añadir esta línea de búsqueda:

for(i=10,500,if(doblecapi(i),print1(i,", ")))

Obtendremos el listado

13, 30, 51, 76, 105, 113, 125, 137, 138, 149, 161, 173, 175, 185, 197, 209, 216, 220, 238, 256, 261, 274, 292, 310, 328, 331, 346, 359, 364, 387, 415, 443, 446, 471, 488, 499,

Coincide con el obtenido en VBasic de Excel.

Rutina para comprobar

Podemos cambiar el punto de vista, y comenzar con un listado de capicúas, para añadirle después el producto doble para encontrar una solución. No es una función, pero podemos programarla como subrutina. Las soluciones aparecerán en columna, y al finalizar debemos ordenar las soluciones (lo hará Excel en el menú Datos).

sub doblecap()

dim i,f,b,c, m,n,fila

n=500 ‘Marcamos un tope a la búsqueda

fila=2

for i=10 to n

if escapicua(i) then ‘Encontramos un capicúa

f=numcifras(i)

b=trozocifras(i,1,int(f/2))

if f mod 2=1 then c=cifra(i,int(f/2)+1) else c=1

if c<>0 then

m=i+b*c*cifrainver(b)*2 ‘Aplicamos la suma al capicúa

fila=fila+1

ActiveWorkbook.Sheets(1).Cells(fila, 1).Value = m ‘Se escribe la solución

end if

end if

next i

end sub

Así queda la solución en la hoja de cálculo, una vez ordenados los resultados:

Es muy buena costumbre verificar los resultados mediante varios métodos y herramientas.

Podríamos cambiar las condiciones del problema, pero ha resultado todo un poco fatigoso, como para volverlo a plantear. Lo dejamos abierto.

No hay comentarios: