Наивный (сплошной) перебор делителей
#!/usr/bin/perl
use warnings;
my $n=shift or die "$0: Укажите число в командной строке\n";
print "2\n" if $n>=2;
for(my $i=3; $i<=$n; $i+=2)
{
my $flag=1;
for(my $j=3; $j<$i; $j+=2)
{
if($i % $j==0)
{
$flag=0;
last;
}
}
print "$i\n" if $flag;
}
Оптимизированный перебор делителей
#!/usr/bin/perl
use warnings;
my $n=shift or die "$0: Укажите число в командной строке\n";
print "2\n" if $n>=2;
for(my $i=3; $i<=$n; $i+=2)
{
my $flag=1;
for(my $j=3; $j**2<=$i; $j+=2)
{
if($i % $j==0)
{
$flag=0;
last;
}
}
print "$i\n" if $flag;
}
Перебор делителей среди запомненных простых
#!/usr/bin/perl
use warnings;
my $n=shift or die "$0: Укажите число в командной строке\n";
my @primes=(2);
print "2\n" if $n>=2;
for(my $i=3; $i<=$n; $i+=2)
{
my $flag=1;
for my $j(@primes)
{
last if $j**2>$i;
if($i % $j==0)
{
$flag=0;
last;
}
}
if($flag)
{
push @primes, $i;
print "$i\n";
}
}
#!/usr/bin/perl
use warnings;
my $n=shift or die "$0: Укажите число в командной строке\n";
my @sieve=2..$n;
while(@sieve)
{
while(@sieve and $sieve[0]==0)
{
shift @sieve;
}
last unless @sieve;
print my $p=shift @sieve, "\n";
for(my $i=$p-1; $i<@sieve; $i+=$p)
{
$sieve[$i]=0;
}
}
#!/usr/bin/perl
use warnings;
my $n=shift or die "$0: Укажите число в командной строке\n";
my @primes=(2, 3, 5, 7);
my $wheelSize=1;
$wheelSize*=$_ for @primes;
my @wheel;
outer: for my $n(2..$wheelSize+1)
{
for my $p(@primes)
{
next outer unless $n % $p;
}
push @wheel, $n;
}
sub isPrime
{
my $k=shift;
for(@primes)
{
return 1 if $k==$_;
return 0 unless $k % $_;
}
my @w=@wheel;
while()
{
my $s=shift @w;
return 1 if $s**2>$k;
return 0 unless $k % $s;
push @w, $s+$wheelSize;
}
}
for(2..$n)
{
print "$_\n" if isPrime($_);
}