PC関係の情報など。あとは雑記。

まとブロ

雑記・雑学

総当たりプログラムを実行してみる - シグマリオン2を手に入れた

更新日:




シグマリオン2でperlスクリプトが実行できる環境が整ったので何かプログラムを書いて実行してみる。perlで。何か実用的なプログラムがすぐにできるわけではないので適当に文字列を出力をするプログラムを考えてみる。

アルファベット文字列の全ての組み合わせを列挙・カウントするプログラムを書いて実行してみる。例えばaとbとcという文字列があったとしてその組み合わせはabc,aac,caa,cbbといった感じになり、仮に3桁の組み合わせの総数はというと3*3*3で27通りということになる。この程度であればプログラムで実行するまでもないが対象のアルファベットの文字数が増えたり、桁数が増えたりするとその総数は塁比的に増加するため暗算では到底追いつかない。

そういう総当たりを列挙するプログラムを書くとして、ロジックは簡単にするにはどういう風にしたらいいか考えた結果、N桁の総パターンを列挙する関数をまず作成して、それをメタでループすればいいんじゃないかと思う。で、そのperlスクリプトが下記のような感じ。とりあえず5文字5桁の総パターンを出力させてみた。

print "start program\n";

$chara = "abcde";

$max_length = 5;
$start_length = 1;
$pattern_count = 0;

for ($start_length = 1; $start_length <= $max_length; $start_length++){
        &recCount("",1,$start_length);
}

sub recCount{

        my($parent_pattern,$current_depth,$max_depth) = @_;
        my $i = 0;

        for($i = 0; $i < length($chara); $i++){
                if($current_depth != $max_depth){
                        my $current_pattern = $parent_pattern . substr($chara,$i,1);
                        &recCount($current_pattern,($current_depth + 1),$max_depth);
                }else{
                        my $result_pattern = $parent_pattern . substr($chara,$i,1) . "\n";
                        print "pattern is $result_pattern";
                        $pattern_count++;
                }
        }

}

print "total pattern count is $pattern_count\n";
print "end program.\n";

結果はこんな感じで合計3905パターンで出力が終わるまで145秒かかった。内訳は
5*1 = 5
5*5 = 25
5*5*5 = 125
5*5*5*5 = 625
5*5*5*5*5 = 3125
5+25+125+625+3125 = 3905
という感じでまあ計算は合ってる。

max_lengthの値と$charaの文字列を増やせばパターンは増やすことが出来る。シグマリオン2の性能だとこのプログラムでこれぐらいの時間がかかるということになり正直このぐらいが限界だと思う。仮にここから1桁1文字増やそうものなら実行時間は実用範囲を超えるぐらい伸びる。試しに別のサーバーPCで同じスクリプトを実行したところ1秒以内に処理は終わった。5文字5桁の総パターンである3905パターンを出力するでさえ145秒かかっているのだから全アルファベット26文字5桁だと・・・5日以上かかる。まあ紙に手書きで書き出すよりかは早いから良しとする。シグマリオン2は有能。

何かのパスワードを忘れたときのためにシグマリオン2でこういうプログラムを実行すればアンロックできるんじゃないかと思ったがとてもじゃないが使い物にならないことはわかった。とはいえそれは普通のCore i7とかのっているPCでやったとしても大変な作業には変わらないと思うが。シグマリオン2にいたっては0~9までの10文字4桁のパスワードでもなかなか辛い。今どきそんなゆるいパスワードをネット関係で設定している人もいないだろう。自転車のチェーンロック程度も一苦労という性能。

久しぶりにperlの文法で書いてみたが、関数への引数の渡し方に違和感がある。関数名の横に括弧でパラメータを書く感じだと分かりやすいのに。あとprint出力もダブルクォート内で

-雑記・雑学

Copyright© まとブロ , 2019 All Rights Reserved Powered by STINGER.