Project Euler Problem 87 Solution

Question

The smallest number expressible as the sum of a prime square, prime cube, and prime fourth power is 28. In fact, there are exactly four numbers below fifty that can be expressed in such a way:

28 = 22 + 23 + 24
33 = 32 + 23 + 24
49 = 52 + 23 + 24
47 = 22 + 33 + 24

How many numbers below fifty million can be expressed as the sum of a prime square, prime cube, and prime fourth power?

Python

#!/usr/bin/env python
from itertools import product, takewhile

def euler(n):
    # Create a candidate list within which non-primes will
    # marked as None, noting that only candidates below
    # sqrt(n) need be checked. 
    candidates = list(range(n+1))
    fin = int(n**0.5)
 
    # Loop over the candidates, marking out each multiple.
    # If the current candidate is already checked off then
    # continue to the next iteration.
    for i in range(2, fin+1):
        if not candidates[i]:
            continue
 
        candidates[2*i::i] = [None] * (n//i - 1)
 
    # Filter out non-primes and return the list.
    return [i for i in candidates[2:] if i]

def main():
    limit = 50000000
    primes = euler(int(limit**0.5))
    squares = takewhile(lambda x: x < limit, (prime**2 for prime in primes))
    cubes = takewhile(lambda x: x < limit, (prime**3 for prime in primes))
    tesseracts = takewhile(lambda x: x < limit, (prime**4 for prime in primes))
    print((len(set(s + c + t for (s, c, t) in product(squares, cubes, tesseracts) if s + c + t < limit))))

if __name__ == "__main__": main()
$ time python3 triples.py
real   0m0.489s
user   0m0.457s
sys    0m0.032s