Project Euler 44

プロジェクトオイラー
http://projecteuler.net/index.php

Q44.
五角数のペアで和と差も五角数のときの最小の差

ペアでなく、差を見ていく。D = Pn+k - PnとしてDを固定すると、kは1からDで決められる数まで見ればよい。



from math import sqrt
from itertools import count

def is_pentagonal(m):
det = 1 + 24 * m
sqrt_det = int(sqrt(det + 0.5))
if sqrt_det * sqrt_det != det:
return False
return (1 + sqrt_det) % 6 == 0

def gen_pentagonal():
for n in count(1):
yield (3 * n - 1) * n / 2

def P(n):
return (3 * n - 1) * n / 2

def calc_min_diff():
for d in gen_pentagonal():
k_limit = int((-4.9 + int(sqrt(12 * d + 25.5)))) / 6
for k in range(1, k_limit + 1):
num = 2 * d - (3 * k - 1) * k
den = 6 * k
if num % den == 0:
n = num / den
s = P(n + k) + P(n)
if is_pentagonal(s):
return d

print calc_min_diff()