blob: b21ba4224fc43f0e1c2601f8db73e4a51b5cd178 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#!/usr/bin/env perl
use strict;
use warnings;
use experimental qw{ say postderef signatures state };
use List::Util qw{ product uniq };
$| = 1;
map { primorial($_) } 0 .. 9;
sub primorial ( $n ) {
my @primes = primes($n);
my $primes = join 'x', @primes;
my $p = product @primes;
say <<"END";
P($n) = $p ($primes)
END
}
sub primes ( $i ) {
state $primes;
$primes->[0] = 1;
if ( !defined $primes->[$i] ) {
my $iter = make_iterator( $primes->[-1] );
while ( my $p = $iter->() ) {
next unless is_prime($p);
push $primes->@*, $p;
$primes->@* = uniq $primes->@*;
last if defined $primes->[$i];
}
}
return $primes->@[ 0 .. $i ];
}
sub is_prime ($n) {
die "Bad number $n" unless length $n;
return 0 if $n == 0;
return 0 if $n == 1;
for ( 2 .. sqrt $n ) { return 0 unless $n % $_ }
return 1;
}
sub make_iterator($n) {
return sub {
state $v = $n;
return $v++;
}
}
|