SQL database of primes

So, I’m generating a SQL database of the first million primes as part of one of those random side tangents that I go off on occasionally. So far I’m up to half a million, and I’ve made several optimizations. I don’t know that my primefinder is actually valid, so I’m including it for you all to critique:

#!/usr/bin/perl

# version: 0.06
$debug = 1;

use DBI;
use Time::Local;

$dbh = DBI->connect(“dbi:mysql:db=primes”,undef,undef) || die “Failed to connect to database”;

$SIG{INT} = \&shutdown;

# first, locate our current position

($current) = $dbh->selectrow_array(“SELECT loc FROM current_location”);

$counter = $current;

#$lastprime = 1;

($lastprime) = $dbh->selectrow_array(“SELECT MAX(prime_number) FROM primes”);

$counter = ($lastprime + 1) if($lastprime > $counter);

while(1) {

if(is_prime($counter)) {
$span = $counter – $lastprime;
$lastprime = $counter;
log_prime($counter, $span);
print “$counter ($span)\n” if($debug);
}

if(! ($counter % 1000)) {
$dbh->do(“UPDATE current_location SET loc = $counter, ts = now()”);
}

$counter++;

}

sub is_prime {

my $number = shift;

# could use much improvement

return 0 if ($number == 1);
return 0 if (($number != 2) && (($number % 2) == 0));

# $maxprime = (int($number / 2) + 1);
$maxprime = (int(sqrt($number)) + 1);

# test against all known primes thus far

$sth = $dbh->prepare(“SELECT prime_number FROM primes WHERE prime_number < $maxprime"); $sth->execute();

while(($pp) = $sth->fetchrow_array()) {
# return 0 if(($number != $pp) && (int($number / $pp)) == ($number / $pp));
return 0 if(($number != $pp) && (($number % $pp) == 0));
}

$sth->finish();

return 1;
}

sub log_prime {
my $number = shift;
my $span = shift;

$dbh->do(“INSERT INTO primes VALUES (NULL,$number,$span,now())”);
}

sub shutdown {

$dbh->do(“UPDATE current_location SET loc = $counter, ts = now()”);
exit(0);
}

Leave a Reply