テスト勉強

テスト勉強中だったんですが、テキストにフェルマーの最終定理をCでプログラムとして表現してるものがあって、気分転換にRubyで書き直してみた。

def exp (x, n)
  ans = 1
  n.times { |i|
    ans *= x
  }
  return ans
end

n = 3
total = 3
while true
  (total-2).times { |x|
    x += 1
    (total-x-1).times { |y|
      y += 1
      z = total - x - y
      if exp(x,n) + exp(y,n) == exp(z,n) then
        print "hello, world\n"
      end
    }
  }
  total += 1
end

解を見つけたら"hello,world\n"と出力する。
nが3なので何も表示する事なくひたすらループが回り続けます。
ところでrubyってインクリメントはないんですね。
total++
って書いたらおこられました。
あと、timesメソッドは便利ですけど、ループ変数の初期値が設定できないので、x += 1とか野暮ったいことを書かないと行けないはめに。。
ならforで書けばいいじゃないって話だけど、折角Rubyなんだからtimesメソッド使いたいよね。

追記

たのしいRubyの後半を読んでたら、べき乗の計算をやってくれる演算子があるらしい!
ってことで書き直してみた。すっきり。

n = 3
total = 3
while true
  (total-2).times { |x|
    x += 1
    (total-x-1).times { |y|
      y += 1
      z = total - x - y
      if x**n + y**n == z**n then
        print "hello, world\n"
      end
    }
  }
  total += 1
end