martes, 28 de septiembre de 2010

Reproducir resultados (2)

Para averiguar si un número es estrictamente no palindrómico necesitaremos una función que nos diga si es palindrómico o no en una base dada, y después recorrer todas las bases entre 2 y N-2 para descubrir si hay o no resultados negativos.

Diseñaremos la función ESCAPICUA(n, b), donde n será el número a probar y b la base del sistema de numeración. Esta función nos devolverá un 1 si el número es palindrómico y 0 si no lo es. Usamos 1 y 0 porque son más cómodos que True y False.

Necesitaremos organizar dos fases de cálculo

a) Extracción de las cifras de n en base b y almacenamiento de las mismas en una matriz c
b) Emparejamiento de las cifras de forma simétrica para averiguar si son todas iguales por parejas (caso palindrómico) o bien existe una que no es igual a su simétrica.

Primera fase: extracción de las cifras

Usaremos un algoritmo voraz, en el que n va disminuyendo de valor, con lo que la velocidad se acelera. Dividimos en cada paso n entre b, quedando el cociente como nuevo valor de n y el resto como cifra nueva. Cuando el cociente sea cero, paramos.

Puedes estudiarlo en Basic.En el listado hemos copiado n en m para preservar su valor

' extraer cifras
nopara=true    Esta variable determina si se para o no el proceso
nc=0                    Contador de cifras
while nopara
q=int(m/b):r=m-q*b  Se halla el cociente y el resto de m entre la base
if q=0 then nopara=false  Si el cociente es cero, se para
nc=nc+1:c(nc)=r:m=q   Se incrementa el contador de cifras y se almacena la nueva
wend


Segunda fase: Comparación entre cifras

Una vez almacenadas las cifras, si sólo hay una, se declara el número como palindrómico. En caso contrario, si se detecta una desigualdad entre cifras simétricas, se declara como no palindrómico.

En Basic

esca=1  Admitimos que es capicúa
if nc>1 then  Si hay más de una cifra, analizamos
for q=1 to int(nc/2)
if c(q)<>c(nc-q+1) then esca=0  En caso de desigualdad, no es capicúa
next q
escapicua=esca
end if


Si deseas implementar esta función en tu hoja de cálculo, copia el código completo:

















Public function escapicua(n,b)
dim c(50)
dim m,q,r,nc,esca
dim nopara as boolean

m=n
' extraer cifras
nopara=true
nc=0
while nopara
q=int(m/b):r=m-q*b
if q=0 then nopara=false
nc=nc+1:c(nc)=r:m=q
wend
esca=1
if nc>1 then
for q=1 to int(nc/2)
if c(q)<>c(nc-q+1) then esca=0
next q
escapicua=esca
end if
end function


Con esta función se puede rellenar una columna que actúe sobre las bases comprendidas entre 2 y N-2. Por ejemplo, en la imagen puedes comprobar que el número 19 es estrictamente no palindrómico:


Los primeros números estrictamente no palindrómicos son:

1, 2, 3, 4, 6, 11, 19, 47, 53, 79, 103… (Visto en la Wikipedia)

Hemos aplicado la prueba a 2011 y, efectivamente, no es palindrómico para ninguna base comprendida entre 2 y 2010.

Con ello hemos reproducido un resultado, con la consiguiente diversión e incremento de nuestra confianza en la comunidad matemática.Si te atreves, codifica una función ESTRICTCAP, que decida si un número es estrictamente no palindrómico. Bastará programar en Basic lo que en la imagen hemos efectuado con columnas.

2 comentarios:

Claudio dijo...

Antonio: aquí se pueden ver los primeros 10000 términos de la serie :

http://www.research.att.com/~njas/sequences/b016038.txt en el que curiosamente el 2011 es el término : 66 (capicúa) :)

Antonio Roldán Martínez dijo...

Gracias Claudio

Encantado de recibir un nuevo comentario tuyo.

Menos mal que es 66 y no 666 :-)

Habrás visto que mi interés radicaba en reproducir esa lista. La usaré para verificar mi procedimiento.

Saludos cordiales