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.
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:
Publicar un comentario