/** * Note: This function has a big weakness, that is, if you provide it with a huge prime to decompose, it'll basically * have to generate all primes up to that number to discover it is prime itself... * @param int $number * @return int[] an array of prime => count */ public static function solve($number) { $factors = []; foreach (Prime::generator() as $prime) { // We should always end at 1 if ($number <= 1) { break; } if (self::isPrime($number)) { $factors[$number] = 1; break; } if ($number % $prime !== 0) { continue; } if (!isset($factors[$prime])) { $factors[$prime] = 0; } // Divide the number by this factor by as many time as possible while ($number % $prime === 0) { ++$factors[$prime]; $number /= $prime; } } return $factors; }
function q49() { $primes = Prime::between(1000, 9999); $groups = []; foreach ($primes as $prime) { $primeDigits = str_split($prime); sort($primeDigits); $primeIdentifier = implode('', $primeDigits); $groups[$primeIdentifier][] = $prime; } $groupsToTest = []; foreach ($groups as $group) { if (count($group) >= 3) { $groupsToTest[] = $group; } } foreach ($groupsToTest as $group) { $groupSize = count($group); for ($i = 0; $i < $groupSize; ++$i) { for ($j = $i + 1; $j < $groupSize; ++$j) { for ($k = $j + 1; $k < $groupSize; ++$k) { if ($group[$i] === 1487 && $group[$j] === 4817 && $group[$k] === 8147) { continue; } $distance1 = $group[$j] - $group[$i]; $distance2 = $group[$k] - $group[$j]; if ($distance1 === $distance2) { return $group[$i] . $group[$j] . $group[$k]; } } } } } }
function q7($number) { $count = 0; foreach (Prime::generator() as $prime) { ++$count; if ($count === $number) { return $prime; } } }
function q10($number) { $result = 0; foreach (Prime::generator() as $prime) { if ($prime >= $number) { break; } $result += $prime; } return $result; }
function q35($max) { $primes = Prime::upTo($max); $primes = array_flip($primes); $circularPrimesCount = 0; foreach ($primes as $prime => $dontCare) { $length = strlen($prime); $isCircular = true; for ($i = 0; $i < $length; ++$i) { $rotatedPrime = Str::rotate($prime, $i); if (!isset($primes[$rotatedPrime])) { $isCircular = false; break; } } if ($isCircular) { ++$circularPrimesCount; } } return $circularPrimesCount; }