Problem 9 (Project Euler) [和訳])
A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,
a2 + b2 = c2
For example, 32 + 42 = 9 + 16 = 25 = 52.
There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc.
プログラムミングの課題でお馴染み「ピタゴラス数」が関連するので、例の置換を行うわけですね。
置換を行わないのが「遅い版」。行ったのが「速い版」。実行時間の差をご賞味ください。
begin_time = Time.now
limit = 1000
1.upto(limit) do |a|
1.upto(limit) do |b|
next if a >= b
c = 1000 - (a + b)
if c ** 2 == a ** 2 + b ** 2
printf("* [%8d] : %4d - %4d - %4d\n", a*b*c, a, b, c)
puts " -- #{Time.now - begin_time}sec"
end
end
end
begin_time = Time.now
limit = 1 + Math::sqrt(1000).floor
1.upto(limit) do |u|
1.upto(limit) do |v|
next if u >= v
c = u ** 2 + v ** 2
next if c > 1000
a = v ** 2 - u ** 2
b = 2 * u * v
a, b = b, a if a > b
if a + b + c == 1000
printf("* [%8d] : %4d - %4d - %4d\n", a*b*c, a, b, c)
puts " -- #{Time.now - begin_time}sec"
end
end
end