はてな使ったら負けだと思っている このページをアンテナに追加 RSSフィード Twitter

2009/04/05(日)

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

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

f:id:mr_konn:20090405163500j:image

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

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

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/mr_konn/20090405/1238916994
Connection: close