2015年12月13日日曜日

151213(3)

Ruby


原始ピタゴラス数の和(1)

1≦x<y<z≦100なる原始ピタゴラス数について、
その和を求めてみる。

①Ruby学びはじめだった140315(2)分のコードに手を加えて求めてみた。
(本当に酷いコードです…。)

class Array
  def gcd
    self.inject{|a, b| a.gcd(b)}
  end
end

s = 0
for x in 1..98
  for y in x..99
    z = Math.sqrt(x**2+y**2)
    if z == z.to_i && z < 101 then
      z = z.to_i
      if [x, y, z].gcd == 1 then
        s += x + y + z
        puts "#{x} + #{y} + #{z} = #{x + y + z}"
      end
    end
  end
end
p s

出力結果
3 + 4 + 5 = 12
5 + 12 + 13 = 30
7 + 24 + 25 = 56
8 + 15 + 17 = 40
9 + 40 + 41 = 90
11 + 60 + 61 = 132
12 + 35 + 37 = 84
13 + 84 + 85 = 182
16 + 63 + 65 = 144
20 + 21 + 29 = 70
28 + 45 + 53 = 126
33 + 56 + 65 = 154
36 + 77 + 85 = 198
39 + 80 + 89 = 208
48 + 55 + 73 = 176
65 + 72 + 97 = 234
1936

②「ツイン・トライアングル」問題で紹介されていた
「Tree of primitive Pythagorean triples」を用いて求めてみた。

def f(a, b, c, n)
  return 0 if c > n
  s = a + b + c
  s += f( a - 2 * b + 2 * c,  2 * a - b + 2 * c,  2 * a - 2 * b + 3 * c, n)
  s += f( a + 2 * b + 2 * c,  2 * a + b + 2 * c,  2 * a + 2 * b + 3 * c, n)
  s += f(-a + 2 * b + 2 * c, -2 * a + b + 2 * c, -2 * a + 2 * b + 3 * c, n)
  return s
end

p f(3, 4, 5, 10 ** 2)

出力結果
1936

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。