my %delta = (); # already occured in first difference ? my %seen = (); # already occured in sequence ? sub other { my $prev = shift; $seen{$prev} = 1; my $d = -int(sqrt($prev)); while (1) { if (not exists $delta{$d**2}) { my $i = $prev + $d * abs($d); if ($i>0 && not exists $seen{$i}) { $delta{$d**2}++; return $i; } } $d++; } } my $a = 1; foreach my $n (1..100_000) { print "$n $a\n"; $a = other($a); }