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にはあまりいい思い出がないなあ。

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

シェアする

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

フォローする

野村 野村のプロフィール
メインPCはWindows10のVirtualBox上のFreeBSD。Linux/Unixの小ネタを求めて日々右往左往してたりする。