2014年3月15日土曜日

140315(2)

Ruby


原始ピタゴラス数の思い出

小学生の頃
算数や図工の時間になんとなく使用していたが、証明には至らず。

中学生の頃
ぶっ飛んだ授業(数学)で一般的に
{x,y}={2ab,a^2-b^2},z=a^2+b^2
と表されることを習う。

思い出はこれくらいにして、
1≦x<y<z≦100なる原始ピタゴラス数を求めてみる。

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.gcd(y) == 1 && y.gcd(z) == 1 && z.gcd(x) == 1 then
        puts "#{x},#{y},#{z}"
      end
    end
  end
end

互いに素の部分がカッコ悪いので、injectメソッドを使うと、

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

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
        puts "#{x},#{y},#{z}"
      end
    end
  end
end

となりスッキリする。

出力結果
3,4,5
5,12,13
7,24,25
8,15,17
9,40,41
11,60,61
12,35,37
13,84,85
16,63,65
20,21,29
28,45,53
33,56,65
36,77,85
39,80,89
48,55,73
65,72,97

0 件のコメント:

コメントを投稿

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