プロジェクトオイラー
http://projecteuler.net/index.php
Q94.
それぞれの辺の長さが整数で、辺の差が1以内のものを「ほぼ正三角形」と呼ぶ。面積も整数になるもので、周囲の長さが10億以内の「ほぼ正三角形」の周囲の長さの総和
辺の長さをそれぞれ、a, b, cとすると、面積Sはヘロンの公式より、
S = √s(s-a)(s-b)(s-c)
s = (a + b + c) / 2
2辺が同じ長さで、1辺が1差だから、どちらかが奇数でどちらかが偶数だが、簡単に2辺のほうが奇数であることがわかる。
2n-1と2nのとき、s=3n-1, S=n√(3n-1)(n-1)となるから、
3n2-4n+1=k2
(3n-2)2 - 3k2 = 1
2n+1と2nのとき、s=3n+1, S=n√(3n+1)(n+1)となるから、
3n2+4n+1=k2
(3n+2)2 - 3k2 = 1
よって、どちらの場合もペル方程式、
x2 - 3y2 = 1
を解けばよい。この解は、
am + bm√3 = (2 + √3)m
x = am, y = bm
と表される。最初の解のxは3で割って2余るから、3n+2でn=0だから、辺の長さが0になる。その次からは面積は正になる。
sn = an + 1 (an ≡ 1(mod 3))
sn = an - 1 (an ≡ 2(mod 3))
N = 10 ** 9def gen_solution():
a = 2
b = 1
while True:
a, b = a * 2 + b * 3, a + b * 2
if a % 3 == 1:
s = a + 1
else:
s = a - 1
if s * 2 > N:
break
yield s * 2print sum(gen_solution())