素因数分解を行うスクリプトです。上限は5000兆くらいです。
# factorize.pl # 内容 : 素因数分解のプログラム # Copyright (c) 2002-2011 Mitsuo Minagawa, All rights reserved. # (minagawa@fb3.so-net.ne.jp) # 使用方法 : c:\>perl factorize.pl # open(IN1,"in1.txt"); open(OUT1,">out1.txt"); # #定数の設定 # @table = (1,2,2,4); while ($number = <IN1>) { $w_divisor = 0; # 割る数の保存した値 $w_power = 0; # 保存した割る数が何乗なのかを示す値 chomp($number); print OUT1 "$number = "; $divisor = 2; #割る数 $index = 0; #インデックス # #素因数分解 # while ($number > $divisor) { # #割られる数÷割る数の余り # $surplus = $number % $divisor; # #割り切れたとき # if ($surplus == 0) { $number /= $divisor; # 最初の割る数 if ($w_divisor == 0) { $w_divisor = $divisor; $w_power = 1; } # 同じ割る数が連続したとき elsif ($divisor == $w_divisor) { $w_power++; } # 割る数が変わったとき elsif ($divisor != $w_divisor) { # 保存した割る数が1乗だったとき if ($w_power == 1) { print OUT1 "$w_divisor × "; } # 保存した割る数が2乗以上だったとき else { print OUT1 "$w_divisor^$w_power × "; } $w_power = 1; $w_divisor = $divisor; } } # #割り切れないとき # else { $divisor += $table[$index]; if ($index == 3) { $index--; } else { $index++; } } } # 保存した割る数が何もない(素数)のとき if ($w_divisor == 0) { print OUT1 "$number\n"; } # 保存した割る数の乗数が1乗のとき elsif ($w_power == 1) { print OUT1 "$w_divisor × $number\n"; } # 最後の割る数と保存した割る数が同じ(同じ割る数がもう1乗増える)とき elsif ($w_divisor == $number) { $w_power++; print OUT1 "$w_divisor^$w_power\n"; } # 最後の割る数と保存した割る数が異なり、保存した割る数の乗数が2乗以上とき else { print OUT1 "$w_divisor^$w_power × $number\n"; } } close(IN1); close(OUT1);
111111111111 82944 580608 8616460799 37
111111111111 = 3 × 7 × 11 × 13 × 37 × 101 × 9901 82944 = 2^10 × 3^4 580608 = 2^10 × 3^4 × 7 8616460799 = 89681 × 96079 37 = 37