Esempio n. 1
0
function q46()
{
    $number = 1;
    while (true) {
        $number += 2;
        if (IntegerFactorization::isPrime($number)) {
            continue;
        }
        // Try squares in ascending order and test whether the difference between the current number
        // and this double square is a prime
        // If we find a working combination (prime + double square), then this number is not the one we're looking for
        // If we find no combination of a square + prime up to the number, then it is the number we are looking for
        $found = false;
        $square = 1;
        $doubleSquare = 2 * $square * $square;
        while ($doubleSquare <= $number) {
            $complement = $number - $doubleSquare;
            if (IntegerFactorization::isPrime($complement)) {
                $found = true;
                break;
            }
            ++$square;
            $doubleSquare = 2 * $square * $square;
        }
        if (!$found) {
            break;
        }
    }
    return $number;
}
Esempio n. 2
0
function q21($from, $to)
{
    $integerToSum = [];
    for ($i = $from; $i < $to; ++$i) {
        $primeDecomposition = IntegerFactorization::solve($i);
        $sumOfDivisors = Math::divisorsSum($primeDecomposition);
        $sumOfProperDivisors = $sumOfDivisors - $i;
        $integerToSum[$i] = $sumOfProperDivisors;
    }
    $sumOfAmicableNumbers = 0;
    foreach ($integerToSum as $integer => $sum) {
        if ($integer !== $sum && isset($integerToSum[$sum]) && $integerToSum[$sum] === $integer) {
            $sumOfAmicableNumbers += $integerToSum[$integer] + $integerToSum[$sum];
            unset($integerToSum[$integer]);
            unset($integerToSum[$sum]);
        }
    }
    return $sumOfAmicableNumbers;
}
Esempio n. 3
0
 public static function greatestCommonDivisor(array $numbers)
 {
     if (empty($numbers)) {
         throw new LogicException('Cannot obtain greatest common divisor on an empty array.');
     }
     $factors = [];
     foreach ($numbers as $number) {
         $decomposition = IntegerFactorization::solve($number);
         foreach ($decomposition as $prime => $count) {
             $factors[$prime][] = $count;
         }
     }
     $total = 1;
     foreach ($factors as $prime => $counts) {
         if (count($counts) === 1) {
             continue;
         }
         sort($counts);
         $total *= $prime ** $counts[0];
     }
     return $total;
 }
Esempio n. 4
0
 /**
  * @param int $n
  * @return bool
  */
 public static function isTruncatablePrime($n)
 {
     if (!IntegerFactorization::isPrime($n)) {
         return false;
     }
     $stringRepresentation = (string) $n;
     $stringRepresentationLength = strlen($stringRepresentation);
     // Left to right
     for ($i = 1; $i < $stringRepresentationLength; ++$i) {
         $number = substr($stringRepresentation, $i);
         if (!IntegerFactorization::isPrime($number)) {
             return false;
         }
     }
     // Right to left
     for ($i = 1; $i < $stringRepresentationLength; ++$i) {
         $number = substr($stringRepresentation, 0, $i);
         if (!IntegerFactorization::isPrime($number)) {
             return false;
         }
     }
     return true;
 }