#!/usr/bin/perl # # this is part of my prime number research project # this is code that will generate a table (or ultimately several) # of numbers with information about those numbers use DBI; use Time::Local; use Data::Dumper; $debug = 1; $delete = 1; $SIG{INT} = \&shutdown; $SIG{TERM} = \&shutdown; $dbh = DBI->connect("dbi:mysql:db=primes",undef,undef) || die "Failed to connect to database"; if($delete) { $dbh->do("DELETE FROM numbers"); $dbh->do("DELETE FROM numbers_location"); } ($current,$prevPrime) = $dbh->selectrow_array("SELECT current_location,prevPrime FROM numbers_location"); $prevPrime = 1 if(!$current); $current = 1 if(!$current); $alive = 1; while ($alive) { process($current++); } $dbh->do("DELETE FROM numbers_location"); $dbh->do("INSERT INTO numbers_location VALUES (" . ($number-1) . ",$prevPrime,now())"); sub process { my $number = shift; my $factors = factor($number); my $factorSum = 0; my $factorCount = @{$factors}; my $i; for($i=0;$i<@{$factors};$i++) { $factorSum += @{$factors}[$i]; } my $factorTxt = "," . join(",", @{$factors}) . ","; my $factorTxtq = $dbh->quote($factorTxt); my $even = 0; $even = 1 if(!($number % 2)); my $prime = 0; $prime = 1 if($factorCount == 1); if($prime && ($number > 2)) { $sth = $dbh->prepare("SELECT n FROM numbers WHERE n >= " . $main::prevPrime . " AND nextPrime IS NULL"); $sth->execute(); while(($n) = $sth->fetchrow_array()) { $dist = $number - $n; $dPrimePrime = $number - $main::prevPrime; $query = "UPDATE numbers SET nextPrime = $number, dNextPrime = $dist, dPrimePrime = $dPrimePrime WHERE n = $n"; $dbh->do($query); } } $dPrev = $number - $main::prevPrime; $query = "INSERT INTO numbers (n,dNextPrime,dPrevPrime,dPrimePrime,nextPrime,prevPrime,factors,factorCount,factorSum,prime,even) VALUES ($number, NULL, $dPrev, NULL, NULL, " . $main::prevPrime . ",$factorTxtq,$factorCount,$factorSum,$prime,$even)"; print "Query: ($debug) [$query]\n" if($debug & 2); $dbh->do($query); $main::prevPrime = $number if($prime); } sub factor { my $number = shift; my @return = (); print "Factoring $number: " if($debug); my $test = 2; while($number >= $test) { # print "Testing: $test / $number\n"; if(!($number % $test)) { # print "Factor: $test \n"; push(@return, $test); $number /= $test; print "$test " if($debug); $test = 2; } else { $test++; } } print "\n" if($debug); return \@return; } sub shutdown { $alive = 0; }