# prime_01.pl
# 奇数列の発生による素数判定
  
  while (1)
{
# 素数の初期値
  $px = 1 ;
  
# 判定する数の入力
  print "\n 判定する数:" ;
  $ax = <STDIN> ;
  chomp $ax ;
  
# 2の倍数を除く
  if ($ax % 2 == 0)
    {print "\n $ax は偶数です。\n" ; $px = 3}
  
# 9未満の素数を除く
  unless ($ax < 9)
{
  
# 割り算する上限値
  $mx = int sqrt $ax ;
  
# 上限値まで奇数列で割る
  for ($odd = 3 ; $odd < $mx+1 ; $odd += 2)
     {
    # 割り切れた場合
      if ($ax % $odd == 0)
        {
         $ax2 = $ax / $odd ;
         print "\n $ax = $odd x $ax2 \n" ;
         $px = 0 ; last
        }
      }
}
  
# 結果の表示
  if ($px == 1)
    {print "\n $ax は素数です。\n"}
  
# 継続判断
  print "\n 続けますか?(1.はい 他.いいえ):" ;
  $nx = <STDIN> ;
  chomp $nx ;
  unless ($nx == 1) {exit}
}
  


# prime_generate_01.pl
# 1000 までの素数表作成
  
# 作成する素数の上限値
  $upper = 1000 ;
  
# 自明な素数は最初に入れておく
  @px = (2,3,5,7) ;
  
# 11からの奇数列の中から素数を検出
  for ($odd = 11 ; $odd < $upper ; $odd += 2)
     {
      $mx = int sqrt $odd ;
  
      for ($k = 3 ; $k < $mx+1 ; $k += 2)
         {if ($odd % $k == 0) {last}}
  
      if ($k > $mx) {push @px, $odd}
     }
  
# 素数の書き込み
  open W, ">prime-table-K.txt" ;
  for (@px) {print W "$_  "}
  
# 作成された素数の個数
  $ct = @px ;
  print  "\n $ct 個の素数が作成されました。\n"



# prime_generate_02.pl
# 10万までの素数表作成
  
# 素数表の読み込み
  open R, "prime-table-K.txt" ;
  @px = split " ", <R> ;
  
# 素数の追加
  for ($odd = 1001 ; $odd < 100000 ; $odd += 2)
     {
      $mx = int sqrt $odd ;
      for $pn (@px)
        {
         if($odd % $pn == 0){last}
  
         if($pn > $mx) {push @py, $odd; last}
        }
      }
  
# 素数の書き込み
  push @px, @py ;
  open W,">prime-table-M.txt" ;
  for (@px) {print W "$_  "}
  
# 作成された素数の個数
  $ct = @px ;
  print  "\n $ct 個の素数が作成されました。\n"



# prime_02.pl
# 素数表を用いた100億までの素数判定
  
# 素数表の読み込み
  open R, "prime-table-M.txt" ;
  @px = split " ", <R> ;
  
# 素数の判定
  while (1)
    {
     print "\n 判定する数:" ;
     $ax = <STDIN> ;
     chomp $ax ;
     $mx = int sqrt $ax  ;
  
     for $pn (@px)
       {
        if ($ax/$pn == int $ax/$pn)
          {
           $ax2 = $ax/$pn ;
           print "\n $ax = $pn x $ax2 \n"; last
          }
    
        if ($pn > $mx)
          {print "\n $ax は素数です。\n"; last}
       }
  
   # 継続判断
     print "\n 続けますか?(1.はい 他.いいえ):" ;
     $nx = <STDIN> ;
     chomp $nx ;
     unless ($nx == 1) {last}
    }
  
# 判定の終了
  print "\n ** 判定終了 ** \n"



# eval.pl
  
print "\n 数式:" ;
$ax = eval <STDIN> ;
print "\n $ax \n" ;



# math.pl
  
use Math::BigInt ;
print "\n 数式:2**(2**6)+1 \n" ;
$a = new Math::BigInt "2" ;
$b = $a**(2**6)+1 ;
print "\n 値:$b \n" ;



# prime_eval.pl
# メルセンヌ数やフェルマー数の素数判定
  
# 素数表の読み込み
  open R, "prime-table-M.txt" ;
  @px = split " ", <R> ;
  
# 素数の判定
  while (1)
    {
     print "\n 数式:" ;
     $af = <STDIN> ;
     chomp $af ;
     $ax = eval $af ;
     $mx = int sqrt $ax ;
     print "\n $ax を判定します。\n" ;
  
     foreach $pn (@px)
       {
        if ($ax/$pn == int $ax/$pn)
          {
           $ax2 = $ax/$pn ;
           print "\n $ax = $pn x $ax2 \n"; last
          }
    
        if ($pn > $mx)
          {print "\n $ax は素数です。\n"; last}
       }
  
   # 継続判断
     print "\n 続けますか?(1.はい 他.いいえ):" ;
     $nx = <STDIN> ;
     chomp $nx ;
     unless ($nx == 1) {last}
    }
  
# 判定の終了
  print "\n ** 判定終了 ** \n"