これは圏です(はてな使ったら負けだとおもっていた)

きっと何者にもなれないつぎの読者につづく。

Collatz算法の木

なんとなくGraphvizをつかってみたくなって、簡単そうな Collatz 算法 で試してみた。
1 から指定ステップ数まで逆算したグラフを描きます。

require "rubygems"
require "graphviz"

level = ARGV.shift.to_i
g = GraphViz.new("Collatz")

def collatz(i)
  r = [2*i]
  if i % 6 == 4
    r << (i-1)/ 3
  end
  return r
end

seed = [1]
proced = []
g.add_node(seed[0].to_s)
level.times{
  seed.map!{|a| collatz(a).reject{|i|proced.include?(i)}.each{|i|proced<<i; g.add_node(i.to_s);g.add_edge(a.to_s, i.to_s)}}.flatten!
}

g.output(:output => "jpg")

こんなかんじ。graphvizお手軽すぎてすばらしい。
使用法。

$ ruby collatz.rb 10 > collatz10.jpg

みたいなかんじ。出来上がったのがこんな画像。

これは綺麗。手書くとどうしても均整がとれないのだけど、そこは流石専用ツール。

今度は Haskell で、 Stern-Brocot 木 でも描画させてみようかな。