はじめに
こんにちは、野村です。
今回は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にはあまりいい思い出がないなあ。
というわけで、今回はこれにて。