2016年3月19日土曜日

160319(3)

Ruby


素数さいころ(3)

160319(1) 分について、らすかる氏の指摘により
もう少し調べる範囲を少なくできることがわかった。

同じ型6つ、もしくは同じ型5つと3、の2パターンのうち
後者については
12N+7型5つと3、12N+11型5つと3
しかないということが簡単にわかる。

この考え方をもとに以下のように改良した。

require 'prime'

def test(ary)
  ary.combination(2){|c|
    return false if !((c[0] + c[1]) / 2).prime?
  }
  true
end

def search(k, n)
  ary = Prime.each(n).to_a - [2, 3]
  ary1 = ary.select{|i| i % 12 == 1}
  ary5 = ary.select{|i| i % 12 == 5}
  ary7 = ary.select{|i| i % 12 == 7}
  ary11 = ary.select{|i| i % 12 == 11}
  ans = []
  [ary1, ary5, [3] + ary7, [3] + ary11].each{|a|
    a.combination(k){|c| ans << c if test(c)}
  }
  ans
end

p search(4, 100)
p search(5, 200)
p search(6, 400)

出力結果
[[5, 17, 29, 89], [5, 29, 53, 89], [3, 11, 23, 71], [3, 11, 23, 83], [3, 23, 59, 83]]
[[5, 29, 53, 89, 113], [5, 29, 53, 89, 173], [3, 11, 23, 71, 191], [3, 11, 23, 83, 191]]
[[3, 11, 83, 131, 251, 383]]

0 件のコメント:

コメントを投稿

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