Project Euler – 問題44

五角数はPn = n (3n – 1) / 2という式で生成できる。五角数の最初の10項は次 の通りである。1, 5, 12, 22, 35, 51, 70, 92, 117, 145, …

P4 + P7 = 22 + 70 = 92 = P8 であることがわかる。しかし、その差 70 – 22 = 48は五角数ではない。

二つの五角数PjとPkで、その和と差が五角数であるものうち、差が最小になる ときのその差を求めよ。

まず五角数を以下のように定義する。問題文では各項を求める式で定義してあ るが、五角数の無限リストを定義する場合には、以下のように差が3n+1になる ような数列として定義することもできる。

次に、リストの内包表記を用いて、二つの五角数で、その和も差も五角数であ るものの差のリストを求め、そのリストの最小値を求める。ここでは計算時間 の都合上、5000項目までを計算しているが、解が存在しなければ対象とする範 囲を大きくする必要がある。

pentagonals = 1 : zipWith (+) pentagonals diffs
    where diffs = [4,7..]

euler044 = minimum [k - j | j <- ps, k <- ps, j < k,
                    elem (j + k) ps, elem (k - j) ps]
    where ps = take 5000 pentagonals