整数のゲーデル数化
どう書く?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