PamGau
Web周り、サッカーの話、ときどきヌコ

RubyでProject Euler - Problem 39

Problem 39 (Project Euler) [原文]

辺の長さが{a,b,c}と整数の3つ組である直角三角形を考え, その周囲の長さをpとする. p = 120のときには3つの解が存在する:

p < 1000 で解の数が最大になる p を求めよ

ピタゴラス数を求める場合、得られる3数が互いに素となるようにしますが、この問題ではその整数倍の数の組み合わせも許容されます。

といって、重複カウントもいやなので、互いに素なピタゴラス数の組み合わせを求めてから各数の整数倍も吟味することにしました。

Problem 9のときにはぼやかしてコードを載せなかったので、今回は記載します。

vを2ずつカウントダウンしているところがミソですね。これを1ずつにすると、互いに素の判断をa,b についてしなければいけなくなり、実行速度が低下します。過去に得た知識の受け売りですが…。

  def gcm(m, n) # m.nの最大公約数を返す
    gcm(n, m) if n > m
    u = m % n
    return n if u == 0
    gcm(n, u)
  end

  limit = 1000
  ulimit = Math::sqrt(1000) + 1
  ans = Array.new(1000, 0)
  (2..ulimit).each do |u|
    (u-1).step(1, -2) do |v|      # vはuより小
      c = u ** 2 + v ** 2         # 置換
      next if c > limit || gcm(u, v) != 1
      a = u ** 2 - v ** 2         # 置換
      b = 2 * u * v               # 置換
      s = a + b + c
      while s < limit
        ans[s] += 1
        s += a + b + c
      end
    end
  end

  puts ans.max

"RubyでProject Euler - Problem 38" « Home » "RubyでProject Euler - Problem 40"

TrackBack

ご注意
当分の間、トラックバックの受信を行わないことといたしました。過去に戴いたトラックバックのリストについてはそのまま保持いたします。
トラックバックはありません

Comments

コメントはありません。
ご注意
当分の間、JavaScript が有効でないとコメント投稿できないようにします。スパム対策であって、投稿される方の個人情報を取得する目的ではありません。悪しからずご了承ください。
Recent Entries
京都御苑の「自転車道」
Googleの左サイドバーを消すユーザスタイルシート for Firefox , Opera
"Ruby Way"章頭の言葉
"The worst feelings in life"より
裸の英会話
RubyでProject Euler - Problem 59
RubyでProject Euler - Problem 58
RubyでProject Euler - Problem 57
RubyでProject Euler - Problem 55, 56
RubyでProject Euler - Problem 54
Links
PamGau 系
PamGau::Memo
PamGau::Dust
PamgauSigh Wiki
はてなブックマーク
パンパでガウチョ
kyorecobaのdel.icio.us
BLOGNAVI
XREA.COM
VALUE-DOMAIN
PHP ver 4.4.2
Powered by Nucleus CMS Creative Commons
feedberner banner この日記のはてなブックマーク数
BlogPeople
あわせて読みたい