利克瑞尔数

作者:Shlomi Fish

https://projecteuler.net/problem=55

如果我们取 47,反转并相加,47 + 74 = 121,这是一个回文数。

并非所有数字都能如此快速地生成回文数。例如,

349 + 943 = 1292, 1292 + 2921 = 4213 4213 + 3124 = 7337

也就是说,349 经过三次迭代才得到一个回文数。

虽然还没有人证明,但人们认为有些数字,比如 196,永远不会产生回文数。一个永远不会通过反转和相加过程形成回文数的数字称为利克瑞尔数。由于这些数字的理论性质,并且为了解决这个问题,我们将假设一个数字是利克瑞尔数,直到被证明是错的。此外,我们还知道,对于小于一万的每个数字,它要么 (i) 在不到五十次迭代中变成回文数,要么 (ii) 没有人,用现有的所有计算能力,设法将其映射到回文数。事实上,10677 是第一个被证明需要超过五十次迭代才能产生回文数的数字:4668731596684224866951378664(53 次迭代,28 位数)。

令人惊讶的是,有些回文数本身就是利克瑞尔数;第一个例子是 4994。

在一万以下有多少个利克瑞尔数?

注意:措辞在 2007 年 4 月 24 日略有修改,以强调利克瑞尔数的理论性质。

源代码:prob055-shlomif.p6

#!/usr/bin/raku

use v6;

sub rsum($x)
{
    return $x + Int($x.flip());
}

sub is_palindrome($int)
{
    my $s = Str($int);
    return $s.flip eq $s;
}

sub is_lycherel($start)
{
    my $n = rsum($start);
    for 1 .. 50 -> $i
    {
        return False if is_palindrome($n);
        $n = rsum($n);
    }
    return True;
}

if (False)
{
    say is_palindrome(11);
    say rsum(13);
}
say +((1..10000).grep( { is_lycherel($_) }));