NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.
All the Perl that's Practical to Extract and Report
Stories, comments, journals, and other submissions on use Perl; are Copyright 1998-2006, their respective owners.
On the other hand... (Score:1)
I'm teaching a course that touches on crypto, and the intro lecture mentions Hill's cipher in 2x2 form. (2x2 matrices with elemnents in Z_26, say 0..25.) I wondered just what proportion of matrices would be invertible mod 26, and threw an ugly script at it...
#!/local/bin/perl58 -w
use strict;
my $ok;
my $total;
foreach my $i (0..25){
print "Motoring through \$i=$i now\n";
foreach my $j (0..25){
foreach my $k (0..25){
foreach my $l (0..25){
$total++;
my $det=$i*$l-$j*$k;
if ($det%2 && $det%13){$ok++;}
}
}
}
}
print "$ok okay out of a total of $total\n";
The "motoring through..." print statement shows my lack of confidence in this finishing in real time, but much to my amazement in about a second we had...
Motoring through $i=0 now
[...]
Motoring through $i=25 now
157248 okay out of a total of 456976
Admittedly this is on a pretty zappy Sun box: it was about 10 times slower on my humble 400MHz imac. But still not too shabby. I 'spose anyone reading this is thinking: "and how did the C version go?". Mumble, mumble... me no do C... how hard can it be given the C-ish nature of the above? OK, at the very real risk of severe embarrassment.
int main(){
int $ok=0;
int $total=0;
int $det=0;
int $i,$j,$k,$l;
for ($i=0;$i26;$i++){
printf("Motoring through $i=%d now\n",$i);
for ($j=0;$j26;$j++){
for ($k=0;$k26;$k++){
for ($l=0;$l26;$l++){
$total++;
$det=$i*$l-$j*$k;
if (($det%2) && ($det%13))
$ok++;
}
}
}
}
printf("%d okay out of a total of %d\n", $ok,$total);
}
157248 okay out of a total of 456976
Yay: it works. And yep, it's *fast*. Pretty much makes the imac look like the Sun running perl and the Sun running C look like greased lightning.
Cheers,
Paul
Reply to This