#!/usr/bin/perl -w $t = join "", <>; $t = lc $t; $t =~ y/a-z//cd; $t =~ y/a-z/\0-\31/; $S = length($t) / 5; if( $S > 64 ) { $S = 64; } $m = .1; %f = ("" => 1); for($s = 1; $s < $S; $s++) { @d = (); $#d = $s - 1; $i = 0; map { $d[$i++] .= chr($_); $i %= $s; } unpack "C*", $t; $k = ""; $n = 676; for($i = 0; $i < $s; $i++) { @g = map {0} 0..25; map {$g[$_]++} unpack "C*", $d[$i]; @g = map {$_ / length($d[$i])} @g; @o = (); foreach $j (0..25) { $p = 0; map { $q = ( .07969, .01419, .02439, .04446, .12517, .01936, .02392, .06414, .07019, .00191, .01048, .04236, .02005, .06546, .07705, .01600, .00178, .05374, .05909, .09919, .03234, .00782, .02400, .00143, .02101, .00065, )[$_] - $g[($_ + $j) % 26]; $p += $q * $q; } 0..25; push @o, [$p, $j]; } @o = sort {$$a[0] <=> $$b[0]} @o; $p = $j = 0; map {$p += $$_[0]} @o; $p /= 26; map { $q = $$_[0] - $p; $j += $q * $q; } @o; $j = sqrt($j / 26); $q = 0; if( $j > 1e-6 ) { $q = ($o[1][0] - $o[0][0]) / $j; $q = $q < .25 ? 0 : $q < .5 ? 1 : $q < 1 ? 2 : 3; $k .= chr($o[0][1]); } if( $n > $q && ($n = $q) < $m ) { $k = ""; last; } } if( !exists $f{$k} ) { $f{$k} = $n; $j = $k; for($i = $s; $i < $S; $i += $s) { $f{$k .= $j} = 0; } $m = $n; } } @g = sort {$f{$b} <=> $f{$a} || length($b) <=> length($a)} keys %f; if( $f{$k = $g[0]} ) { print ( (map {chr(65 + $_)} unpack "C*", $k), "\n", (map {chr(97 + (26 - $_) % 26)} unpack "C*", $k), "\n" ); }