#!/usr/bin/env perl use strict; use warnings; sub sieve_sundaram { my $n = shift; my %a; my @s = (2); my $m = $n / 2 - 1; foreach my $i (1..$n) { foreach my $j (1..$n) { my $p = $i + $j + 2 * $i * $j; if ($p < $m) { $a{$p} = 1; } } } foreach my $k (1..$m) { if (! $a{$k}) { my $q = 2 * $k + 1; push(@s, $q); } } return \@s; } sieve_sundaram(1e3);