$| = 1; sub gcd { my ($u, $v) = @_; while ($v) { ($u, $v) = ($v, $u % $v); } return abs($u); } my %orbits = (); sub a { my $n = shift; if ($n==1) { return 1; } my ($len, $gcd, $val); if (exists $orbits{$n}) { ($len, $gcd, $val) = @{$orbits{$n}}; } else { ($len, $gcd, $val) = (1, $n, $n); } if ($len>1 && $gcd % $len==0) { return $val; } else { my $m = $n+1; while (1) { if (not exists $orbits{$m}) { my $ngcd = gcd($gcd, $m); if ($ngcd > 1) { $orbits{$m} = [ $len+1, $ngcd, $val ]; return $m; } } $m++; } } } foreach my $n (1..10_000) { my $a = a($n); print $n, " ", $a, "\n"; }