This little script just searches for prime numbers. It outputs the found prime numbers to one file and the progress of it's searching to another. It was just fun to write, and i pushed the results through some numbercrunching modules on CPAN just so I could have the joy of finding no lasting pattern for myself. ;o)
use strict; use Math::BigInt; open(OUT, ">", "C:\\Devel\\Fun\\MathFun\\search.txt") or die "No output file"; open(ANS, ">", "C:\\Devel\\Fun\\MathFun\\primes.txt") or die "No primes file"; my @primes = (Math::BigInt->new(2), Math::BigInt->new(3), Math::BigInt->new(5), Math::BigInt->new(7)); print "Enter value to search to: "; my $max = <STDIN>; chop($max); my $x = Math::BigInt->new(10); for($x; $x < $max; $x++) { my $is = 1; foreach my $prime (@primes) { my $diff = $x->bmod($prime); $diff = chop($diff); print OUT "\t$prime\t$diff\n"; if ($diff == 0) { $is = 0; last; } } if ($is) { my $y = Math::BigInt->new($x); push(@primes, $y); print OUT "\t\t\t\tPrime:\t$y\n"; print "Prime:\t$y\n"; } print OUT "\n"; } foreach my $prime (@primes) { my $prime = substr($prime,1); print ANS "$prime\n"; }

Replies are listed 'Best First'.
Re: Finding Primes
by Abigail-II (Bishop) on Jul 30, 2002 at 16:12 UTC
    That's a slow algorithm. An algorithm based on a sieve is much faster. The only problem with implementing a sieve in Perl is the memory usage. Last year, I made a sieve based on a discussion in comp.lang.perl.misc. It's optimized both for memory (using 2 bits/6 numbers - hence we need less than 40Mb to find all primes below 1 billion) and speed - the inner loop does two vec assignments, two additions and two assignments. Nothing more.

    It still can take a while though. It takes 46 minutes to generate all primes up to 1 billion, and print them to /dev/null on my laptop. Note that if you run this, that in the beginning it appears to be slow, but it will find the next primes faster and faster.

Re: Finding Primes
by zentara (Cardinal) on Jul 30, 2002 at 21:16 UTC
    Hi, I ran your primes program up to 1000, and compared output
    to another prime generator.
    #!/usr/bin/perl print"@{[grep{(1x$_)!~/^(11+?)\1+$/}2..shift||1e3]}\n";
    Now I can't say that the above script generates correct numbers;
    but there is something funny. I think your script dosn't generate
    all possible primes.
    The output from your script, up to 1000, follows:
    2 3 5 7 11 13 17 19 31 37 53 59 71 97
    139 151 173 277 349 383 431 577 773 839

    The output from the 1-liner above is:
    2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67
    71 73 79 83 89 97 101 103 107 109 113 127 131 137
    139 149 151 157 163 167 173 179 181 191 193 197
    199 211 223 227 229 233 239 241 251 257 263 269
    271 277 281 283 293 307 311 313 317 331 337 347
    349 353 359 367 373 379 383 389 397 401 409 419
    421 431 433 439 443 449 457 461 463 467 479 487
    491 499 503 509 521 523 541 547 557 563 569 571
    577 587 593 599 601 607 613 617 619 631 641 643
    647 653 659 661 673 677 683 691 701 709 719 727
    733 739 743 751 757 761 769 773 787 797 809 811
    821 823 827 829 839 853 857 859 863 877 881 883
    887 907 911 919 929 937 941 947 953 967 971 977
    983 991 997

    Just the fact that your script misses 23 and 29, seems bad to
    me, I didn't bother to check higher. 23 and 29 are primes,
    right?
Re: Finding Primes
by RMGir (Prior) on Jul 30, 2002 at 16:27 UTC
    You can stop your inner foreach my $prime loop once $prime > sqrt($x), I believe... That should be a big win once $max gets large.

    Cache the sqrt result before the loop, of course.
    --
    Mike