#!/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); }
全站熱搜
留言列表