Rubyを使っていろんな数列を書き出してみる

はじめに

こんにちは、野村です。

今回はRubyを使っていくつかの数列を書き出してみます。

以前から気になっていたものの、手を出さずに横目でみていた言語。
Ruby on Railsなどもあって、楽しそうだけど使う機会はなかったな。

素数

・1より大きい自然数で、正の約数が1と自分自身のみである数。

def sosu(a)
  return a[0] > Math.sqrt(a.last) ? a :
    [a[0]] + sosu(a.drop(1).select{|x| x%a[0] != 0})
end

print(sosu((2..100).to_a)) # 100までの素数を表示
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

双子素数

・双子素数:差が2である2つの素数の組
・いとこ素数:差が4である2つの素数の組
・セクシー素数:差が6である2つの素数の組

def sieve(a,i,f)
  b = a.select{|x| x<=Math.sqrt(i)}.map{|x| i%x != 0}.all?
  if (b) then
    a = a + [i]
    if a.select{|x| x==(i-f)}.length>0 then
      return a
    end
  end
  return sieve(a,i+1,f)
end

def twin(f,c)
  return (0..(c-1)).to_a.inject([[2],[]]){|a,_|
    b = sieve(a[0],a[0].last+1,f)
    [b,a[1]+[b.last]]
  }[1].map{|x| [x-f,x]}
end

print(twin(2,10)) # 双子素数を10組表示
print(twin(4,10)) # いとこ素数を10組表示
print(twin(6,10)) # セクシー素数を10組表示
[[3, 5], [5, 7], [11, 13], [17, 19], [29, 31], [41, 43], [59, 61], [71, 73], [101, 103], [107, 109]][[3, 7], [7, 11], [13, 17], [19, 23], [37, 41], [43, 47], [67, 71], [79, 83], [97, 101], [103, 107]][[5, 11], [7, 13], [11, 17], [13, 19], [17, 23], [23, 29], [31, 37], [37, 43], [41, 47], [47, 53]]

rubyのprintは改行しないのか。

幸運数

・ポーランドの数学者スタニスワフ・ウラムによって提案された数列。
・素数の性質を研究するために、素数に似たルールで導き出せる数列を考案したとのこと。

def flt(a, i)
  b = [0]+a
  s = b[i]
  l = b.length
  if s <= l then
    c = (0..(l-1)).to_a.select{|v| v%s != 0}.map{|v| b[v]}
    return flt(c, i+1)
  else
    return a
  end
end

def luc(n)
  return flt((0..n).to_a.select{|x| x%2 != 0}, 2)
end

print(luc(100)) # 100までの幸運数を表示
[1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, 87, 93, 99]

階乗

・1 から n までのすべての整数の積。

def fact(n)
  return n<1 ? 1 : n * fact(n-1)
end

print((0..9).to_a.map{|v| fact(v)}) # 階乗を10個表示
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

フィボナッチ数

・フィボナッチ数:イタリアの数学者レオナルド・フィボナッチにちなんで名付けられた数
・リュカ数:フランスの数学者エドゥアール・リュカにちなんで名付けられた数

def fib(a,b,n)
  if n==0 then
    return a
  elsif n==1 then
    return b
  else
    return fib(a,b,n-2) + fib(a,b,n-1)
  end
end

print((0..9).to_a.map{|v| fib(0,1,v)}) # フィボナッチ数を10個表示
print((0..9).to_a.map{|v| fib(2,1,v)}) # リュカ数を10個表示
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34][2, 1, 3, 4, 7, 11, 18, 29, 47, 76]

パスカルの三角形

・二項展開における係数を三角形状に並べたもの。

def pas(n)
  if n<1 then
    return [1]
  else
    a = pas(n-1)
    return ([0]+a).zip(a+[0]).map{|v| v.inject(:+)}
  end
end

print((0..9).to_a.map{|v| pas(v)}) # パスカルの三角形を10段表示
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1], [1, 6, 15, 20, 15, 6, 1], [1, 7, 21, 35, 35, 21, 7, 1], [1, 8, 28, 56, 70, 56, 28, 8, 1], [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]]

終わりに

以上、Rubyを使っていくつかの数列を書き出してみました。

今回の記事は、『たのしいRuby』(SBクリエイティブ)を図書館で借りて読みながら書いたものです。

カッコを使わずにendで閉じるのは、VisualBasicを思い出す。
VBにはあまりいい思い出がないなあ。

というわけで、今回はこれにて。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

野村 野村のプロフィール
枕は高いほうがいい。高いほうが本を読みやすいのですよ。なので広めのタオルケットを何重にも折りたたんでその上に枕を載せてその上に頭を載せてたりする。twitterやってます