-
Notifications
You must be signed in to change notification settings - Fork 0
/
p44.py
38 lines (28 loc) · 1.45 KB
/
p44.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
"""
Pentagonal numbers are generated by the formula, Pn=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 P4 + P7 = 22 + 70 = 92 = P8. However, their difference, 70 − 22 = 48, is not pentagonal.
Find the pair of pentagonal numbers, Pj and Pk, for which their sum and difference are pentagonal and D = |Pk − Pj| is minimised; what is the value of D?
"""
import math
def main():
findMinimalDifference()
def findMinimalDifference():
#pentagonal_nums initialized with i = 1 and P(1) = 1.
pentagonal_nums = [1]
n=1
minimal_pentagonal_difference = 1
while True:
n+=1
pentagonal_nums.append(int(n/2*(3*n - 1)))
for i in range(len(pentagonal_nums)-1, 0, -1):
if (checkForPentagonalNumber(abs(pentagonal_nums[i]+pentagonal_nums[-1]))) and (checkForPentagonalNumber(abs(pentagonal_nums[i]-pentagonal_nums[-1]))):
minimal_pentagonal_difference = abs(pentagonal_nums[i]-pentagonal_nums[-1])
print("Pj = ", n, "\nPk = ", i, "\nD = |Pk-Pj| = ", minimal_pentagonal_difference)
return minimal_pentagonal_difference
def checkForPentagonalNumber(input):
# using the equation to calculate an index from a possible Pentagonal number, see: https://en.wikipedia.org/wiki/Pentagonal_number#Tests_for_pentagonal_numbers
index = 1/6*(math.sqrt(24*input+1)+1)
return (index % 1 == 0 and index>=1) # check if index is a whole number AND is >=1 (i.e. is a natural number)
if __name__ == "__main__":
main()