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

RubyでProject Euler - Problem 46

Problem 46 (Project Euler) [原文]

Christian Goldbachは全ての奇合成数は平方数の2倍と素数の和で表せると予想した.

後に, この予想は誤りであることが分かった.

平方数の2倍と素数の和で表せない最小の奇合成数を答えよ.

先に「平方数の2倍」の方から確定させていきます。「エラストテネスの篩」を二重に活用します。

コードは「続き」の欄に載せました。


  def prime_sieve(upper) # エラストテネスの篩
    sieve = Array.new(upper + 1,true)
    sieve[0] = sieve[1] = false
    2.upto(Math.sqrt(upper)) do |i|
      next unless sieve[i]
      (i + i).step(upper,i){ |j| sieve[j] = false }
    end
    sieve
  end

  limit = 100_0000
  p_sieve = prime_sieve(limit)
  ans = 0
  35.step(limit, 2) do |i|
    next if p_sieve[i] # 素数は対象外
    flag = true        # flagを立てておく
    (1..Math::sqrt(i/2)).each do |d| # 平方数の2倍をiから除外した値が
      if p_sieve[i - 2 * d ** 2]     # 素数で表せるのなら
        flag = false                 # flagを下ろして
        break                        # 内側のループ外へ脱出
      end
    end
    ans = i
    break if flag # flagが立っていたら外側のループ外へ脱出
  end
  puts ans # ansが解答
"RubyでProject Euler - Problem 45" « Home » "RubyでProject Euler - Problem 47"

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
あわせて読みたい