Números Lychrel e reminiscências do ensino fundamental

Era um sábado de calor no Rio de Janeiro no ano de 1987. Estávamos na sexta série do Colégio São Bento e a prof. Sandra Carelli percebendo que naquele dia não iríamos conseguir desvendar os mistérios da matemática de Papy, era o que se ensinava lá, mostrou-nos uma curiosidade matemática que nunca esqueci.

Suponha que você tem um número, por exemplo 124. Se você inverter os dígitos do número e somar com o número original é grande a possibilidade de obter um número palíndromo.

124 + 421 = 565

No entanto para alguns números a operação precisa ser repetida algumas vezes para obter um palíndromo: 279 por exemplo:

279 + 972 = 1251; 1251 + 1521 = 2772

Tendo captado nossa atenção ela prometeu um chocolate para quem achasse um número para o qual isto não funcionasse. Depois de muito tentar ela nos falou que um número para o qual isto não teria, a princípio, como se formar um palíndromo seria 196.

Quase 25 anos depois eu fui procurar sobre o assunto na Internet e descobri os chamados números de Lychrel. Os números de Lychrel seriam os que tem a mesma propriedade que 196. Embora nem mesmo 196 seja comprovadamente um número de Lychrel há outros candidatos como por exemplo: 295, 394, 493, 592, 689, 691, 788, 790, 879, 887, 978, 986

Abaixo, como homenagem a minha professora Sandra, vai um programa em Python para encontrar números de Lychrel.

#!/usr/bin/env python
def reverseNum(n):
        st = str(n)
        return int("".join([st[i] for i in xrange(len(st)-1,-1,-1)]))
 
def isPalindrome (n):
        st = str(n)
        rev = str(reverseNum(st))
        return st==rev
 
def isLychrel (n, num_interations):
        p = n
        for i in xrange(num_interations):
                if isPalindrome(p):
                        return i
                p = p + reverseNum(p)
        return -1
 
for i in xrange(1000):
        p = isLychrel(i,100)
        if (p < 0):
                print i,p

Para saber mais sobre os números de Lychrel e a busca por um palíndromo para 196 veja: http://www.p196.org

Comments on this entry are closed.

  • Carlo Pires

    Algum motivo especial para não usar reversed in reverseNum() ?

    def reverseNum(n):
    return int(”.join(reversed(str(n))))

  • JB

    @Carlo Se é pra mudar, que pelo menos seja direito…
    Reverter números pode ser feito só usando um passo negativo:
    int(str(n)[::-1])

    Assim, checar palíndromos vira
    st == st[::-1]

  • Pedro Paulo

    Boas dicas. Gostei da st[::-1] não sabia desta

  • Carlo Pires

    @JB Muito bom… é esse tipo de coisa que faz a produtividade em Python dar um salto quando estamos manipulando dados.

  • Pedro Paulo
    def isLychrel (n, num_interations):
            p = n
            for i in xrange(num_interations):
                    if str(p)==str(p)[::-1]:
                            return i
                    p = p + int(str(p)[::-1])
            return -1
     
    for i in xrange(1000):
            p = isLychrel(i,10000)
            if (p < 0):
                    print i,p
    

    Versão JB