#!/usr/bin/perl
# 輸入 : 正整數 n
# 輸出 : 小於 n 的質數
sub prime {
my $n = shift;
my ($c, $i);
$c = 1;
for $i (2..$n) {
if (is_prime($i)) {
printf "%d %d\n", $c, $i;
$c++;
}
}
}
# 輸入 : 正整數 n
# 輸出 : 小於 n 的反質數
sub emirp {
my $n = shift;
my ($c, $i, $j);
$c = 1;
for $i (2..$n) {
$j = reverse $i;
if (is_prime($i) && is_prime($j) && !($i==$j)) {
printf "%d %d\n", $c, $i;
$c++;
}
}
}
# 輸入 : 正整數 n
# 輸出 : 小於 n 的迴文質數
sub palprime {
my $n = shift;
my ($c, $i, $j);
$c = 1;
for $i (2..$n) {
$j = reverse $i;
if ($i==$j && is_prime($i)) {
printf "%d %d\n", $c, $i;
$c++;
}
}
}
# 輸入 : 正整數 n
# 輸出 : 小於 n+2 的孿生質數
sub twin_prime {
my $n = shift;
my ($c, $i, $j);
$c = 1;
for $i (2..$n) {
if (is_prime($i) && is_prime($i+2)) {
printf "%d %d %d\n", $c, $i, $i+2;
$c++;
}
}
}
# 輸入 : 正整數 n
# 輸出 : 小於 n 的半質數
sub semiprime {
my $n = shift;
my ($c, $i);
$c = 1;
for $i (2..$n) {
if (is_semiprime($i)) {
printf "%d %d\n", $c, $i;
$c++;
}
}
}
# 判斷質數
# 輸入 : 正整數 n
# 輸出 : 非質數傳回 0, 質數傳回 1
sub is_prime {
my $n = shift;
my $i;
return 0 if ($n<=1);
for ($i=2;$i*$i<=$n;$i++) {
return 0 if ($n%$i == 0);
}
return 1;
}
# 判斷半質數
# 輸入 : 正整數 n
# 輸出 : 非半質數傳回 0, 半質數傳回 1
sub is_semiprime {
my $n = shift;
my ($i, $j);
return 0 if ($n<1);
for ($i=2;$i*$i<=$n;$i++) {
if ($n%$i == 0) {
$j = $n/$i;
return is_prime($i) && is_prime($j);
}
}
return 0;
}
# 輸入 : 正整數 n
# 輸出 : 小於 n 的所有質數陣列
sub prime_array {
my $n = shift;
my @primes;
my @buffer = (2..$n);
while ($buffer[0] ** 2 <= $n) {
push @primes, shift @buffer;
@buffer = grep { $_ % $primes[$#primes] } @buffer;
}
return (@primes, @buffer);
}
文章標籤
全站熱搜
