Pentagon numbers (Euler Problem 44)

Back to overview.

https://projecteuler.net/problem=44

Pentagonal numbers are generated by the formula, $P_n=n(3n−1)/2$. The first ten pentagonal numbers are:

1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...

It can be seen that $P_4 + P_7 = 22 + 70 = 92 = P_8$. However, their difference, 70 − 22 = 48, is not pentagonal.

Find the pair of pentagonal numbers, $P_j$ and $P_k$, for which their sum and difference are pentagonal and $D = |P_k − P_j|$ is minimised; what is the value of D?

In [3]:
def pentagonal(n):
    return n * (3 * n - 1) // 2

assert(pentagonal(1) == 1)
assert(pentagonal(4) == 22)
In [31]:
n = 10000
p = [pentagonal(n) for n in range(1, n)]
p_set = set(p)

Okay, I was honestly just going for plain brute force here and the first solution that came up was the solution to the problem... Not really happy with that.

In [33]:
for i in range(1, n):
    for j in range(i + 1, n):
        if p[i - 1] + p[j - 1] in p_set and p[j - 1] - p[i - 1] in p_set:
            d = pentagonal(j) - pentagonal(i)
            s = d
            print("i = {}, j = {}, d = {}.".format(i, j, d))
i = 1020, j = 2167, d = 5482660.
In [35]:
print(s)
assert(s == 5482660)
5482660
In [ ]: