$| = 1; my %seen = (); my @prev = (); sub w { my $n = shift; my $w = 0; while ($n) { my $d = $n % 2; $w += $d; $n -= $d; $n /= 2; } return $w; } sub a { my $n = shift; my $w = w($n); do { $prev[$w] += $w; } while ($seen{$prev[$w]}); $seen{$prev[$w]}++; return $prev[$w]; } foreach my $n (1..10_000) { my $a = a($n); print "$n $a\n"; }