Stories
Slash Boxes
Comments
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

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • by pjm (639) on 2003.10.03 5:51 (#24644)
    Colour me naive, (close relative of mauve I guess), but a warped kind of opposite to this happened to me this afternoon. Not in the sense of finding a numberical routine that ran x-million times faster in perl, but in being shocked at how fast perl could rip through some arithmetic.

    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