/* The Computer Language Shootout http://shootout.alioth.debian.org/ contributed by Peter Baltruschat */ function primes($size) { $flags = array_fill(0, ($size >> 5) + 1, ~0); $count = 0; for ($i = 2; $i < $size; ++$i) { $offset = $i >> 5; $mask = 1 << $i - ($offset << 5); if ($flags[$offset] & $mask) { ++$count; for ($j = $i << 1; $j <= $size; $j += $i) { $offset = $j >> 5; $mask = 1 << $j - ($offset << 5); if ($flags[$offset] & $mask) { $flags[$offset] ^= $mask; } } } } unset($flags); printf("Primes up to %8d %8d\n", $size, $count); } $n = $argv[1] != '' ? $argv[1] : $_GET['n']; $size = 10000 * (1 << $n); primes($size); primes($size >> 1); primes($size >> 2);
/** * @depends testPrimeLoader * @expectedException \InvalidArgumentException */ public function testPrimesException() { primes('str'); }
/** * Returns $nth prime number. * * @author Jitendra Adhikari <*****@*****.**> * * @uses self.primes() * @param int The position in prime number series * * @return int The generated prime number * * @throws InvalidArgumentException If input is not positive integer */ function prime($n) { $primes = primes($n); return end($primes); }
*/ define(BPC, 32); define(FLAG_MAX, 0xffffffff); function primes($n) { $size = 10000 * pow(2, $n); $flags = array(); $count = 0; for ($i = 0; $i < $size / BPC + 1; $i++) { $flags[$i] = FLAG_MAX; } for ($prime = 2; $prime < $size; $prime++) { $offset = $prime / BPC; $mask = pow(2, $prime % BPC); if (($flags[$offset] & $mask) != 0) { $count++; for ($i = $prime * 2; $i <= $size; $i += $prime) { $offset = $i / BPC; $mask = pow(2, $i % BPC); if (($flags[$offset] & $mask) != 0) { $flags[$offset] ^= $mask; } } } } printf("Primes up to %8d %8d\n", $size, $count); } $n = $argv[1] != '' ? $argv[1] : 1; for ($i = 0; $i < 3; $i++) { primes($n - $i); }