整数のゲーデル数化

どう書く?orgにあった問題

素数判定のアルゴリズムを忘れた(知らない)ので,しらみつぶしに調べる方法を取った.今思えば,3以上の数については奇数でいいので,3以上の数については奇数だけ調べればよいのか.こういうときにPythonの条件付きループがいいのかもね.

けれどPerlの書きやすさは異常(約30min).コードはデバッグ出力つき.

そーすこーど(見ると寿命が縮みます.いろんな意味で)

#!/usr/bin/perl
use strict;
use warnings;

die "Input number\n" if (@ARGV < 1);
my $input_number = $ARGV[0];

my $digit_number = 1;

# count digit length
while ($input_number % (10 ** $digit_number) != $input_number){
  $digit_number++;
}

my $result = 1;
my $current_number = $input_number;
my $current_prime = 1;

for(my $i = $digit_number - 1; $i >= 0; $i--){
  # obtain next prime number
  $current_prime = next_prime($current_prime);

  # obtain curernt digit
  my $current_digit =  int($current_number / (10 ** $i));

  # multiply current digit and current prime number
  $result *= $current_prime ** $current_digit;

  # debug
  print "current number:$current_number\n";
  print "current digit:$current_digit\n";
  print "current prime:$current_prime\n";
  print "current result:$result\n";
  print "---\n";

  # refresh current number
  $current_number = $current_number % (10 ** $i);
}

print $result . "\n";


sub next_prime{
  my ($last_prime) = @_;

  my $next_prime;
  my $count_number = $last_prime + 1;

  if($count_number <= 1){
    $count_number = 1;
  }

  LOOP:
  while(!(defined $next_prime)){

    # check if the number has division or not
    for(my $i = 2; $i <= $last_prime; $i++){
      if ($count_number % $i == 0){
        $count_number++;
        next LOOP;
      }
    }

    $next_prime = $count_number;
  }

  return $next_prime;
}
実行結果:
% perl goedelnum.pl 9
512
% perl goedelnum.pl 81
768
% perl goedelnum.pl 230
108