2011-10-01から1ヶ月間の記事一覧

正方形の周長 #1

最近Javaの話題が無かったのでしばらくJava関係を。 Update 1が出ていたのでJDK7をインストールした。 大きな言語仕様の変化は8に先送りされたのでとりあえずUpdateが一つ出るまで入れてなかった。というわけでJava SE 7の話とは全然無関係に正方形の一辺の…

Windowsにおけるノードの日本語ラベルの使用

以降の話でのDOTファイルの文字エンコードはUTF-8になっていることが前提。linux*1でやっている分には日本語でも全然問題ないのだが、 success1.gv (UTF-8) digraph 魚 { rankdir = LR; イナダ -> ハマチ -> 鰤; } のようなDOTをWindows上のdotコマンドで画…

スーパーpre記法でのdotタイプ

これはGraphvizというよりもはてなダイアリーの話題になる。 スーパーpre記法でシンタックスハイライトを行える構文タイプのリストの中にdotがあるのを見つけた。 このdotはGraphvizのDOT形式のことなのだろうか? digraph mv { "meta variable" -> { foo; h…

有向グラフと無向グラフの変換 #4

サブグラフを一個ずつクローンするくらいならグラフそのものをクローンしてしまえばいいのではと思った。 $ gvpr "BEG_G { graph_t g = graph(name, 'U'); clone(g, $); write(g); }" shiritori.gv graph kobutanukituneko { subgraph kobutanukituneko { pi…

有向グラフと無向グラフの変換 #3

まだ問題が残っていた。 mv.gv digraph mv { "meta variable" -> { foo; hoge; piyo; }; ham; style = filled; color = gray; subgraph cluster1 { foo -> bar -> zot; baz; } subgraph cluster2 { hoge -> hogehoge; } }のようにサブグラフが存在する場合、…

有向グラフと無向グラフの変換 #2

前掲のgvprプログラムではうまく変換できないDOTデータがあった。 $ gvpr -c "BEG_G { node($, 'tubeworm'); }" shiritori.gv | tee fellows.gv digraph kobutanukituneko { piglet -> "raccoon dog"; "raccoon dog" -> fox; fox -> cat; cat -> piglet; tub…

有向グラフと無向グラフの変換 #1

有向グラフ shiritori.gv digraph kobutanukituneko { piglet -> "raccoon dog" -> fox -> cat -> piglet; }を無向グラフに変換する。 $ gvpr "BEG_G { graph_t g = graph(name, 'U'); } E { clone(g, $); } END_G { \$O = g; }" shiritori.gv graph kobutan…

Pascalの三角形 #10

Pasacalの三角形を介することなくSierpinskiの三角形を直接生成するなら、 二項係数そのものの値は不要であり、前段が偶数か奇数かさえ記録しておけば済む。 sierpinski_g.g BEGIN { if (ARGC != 1) { print("usage: gvpr -fsierpinski_g.g -a <step>"); exit(0); </step>…

Pascalの三角形 #9

60段目までPascalの三角形の値を計算すると、 そこに現れる最大値は60段目の中央の値=118264581564861424である。 実際にpascal3.gが生成したグラフ中でname属性が"60_30"のノードのlabel属性は、 $ gvpr -fpascal3.g -a60 | gvpr "N [name == '60_30'] { pr…

Pascalの三角形 #8

全てのノードのlabel属性を統一することで歪みが無くなったのだが、 label = "_";を label = "";のように空文字にしてしまってはいけない。 これは対象ノードのlabel属性自身の抹消を意味しており、 name属性がノードの表示値として使用されるようになる。 …

Pascalの三角形 #7

歪みの原因が分かった。 ノードはsierpinski.gによって不可視になったり塗り潰されたりするだけで、 label属性自体は生きているため下の方ほどlabelが長くなっているのだった。 つまりノードの大きさが場所によって異なることが原因なので単にlabel属性を同…

Pascalの三角形 #6

Pascalの三角形のグラフをSierpinskiの三角形*1っぽいものに変換してみる。 sierpinski.g BEG_G { size = "5"; ratio = "auto"; } N { if (label % 2 == 0) { style = "invis"; } else { style = "filled"; fillcolor = "black"; } } E { style = "invis"; }…

Pascalの三角形 #5

示したgvprプログラムが出力しているグラフは無向グラフだが、dotコマンドを使って画像化していた。 マニュアルによればdotは主に有向グラフの描画用ということになっている。 もちろん無向グラフでもpascal.pngのようにまさに欲しいものを得ることもできる…

Pascalの三角形 #4

create()を定義する前のpascal2.gの形に引きずられてうっかりしていたが、 ノードを作成する部分はもっと簡単にできるのだった。 q[0], q[i]の作成部分はforループ本体と全く同じ形なので、 ...snip for (i = 0; i <= step; i++) { # create nodes in i-th s…

Pascalの三角形 #3

man 1 gvprやPDF化された文書などに書かれていないように思うが、 gvprではユーザ定義関数を定義することができる。 pascal2.gでノードを作成する部分がまとめられそうなので関数化してみる。 pascal3.g BEGIN { if (ARGC != 1) { print("usage: gvpr -fpasc…

Pascalの三角形 #2

さて、pascal1.gを元にして、DOT言語で表したグラフとして出力するコードに変更する。 pascal2.g BEGIN { if (ARGC != 1) { print("usage: gvpr -fpascal2.g -a <step>"); exit(0); } int step = ARGV[0]; graph_t g = graph("pascal_triangle", "U"); node_t p[],</step>…

Pascalの三角形 #1

二項係数の列、いわゆるPascalの三角形をgvprで計算する。 pascal1.g BEGIN { if (ARGC != 1) { print("usage: gvpr -fpascal1.g -a <step>"); exit(0); } int step = ARGV[0]; int p[], q[]; int i, j; for (i = 0; i <= step; i++) { # calc i-th step for (j = </step>…

Collatz問題 #26

C

#7の散布図と52527からの経路を重ね合わせてみる。 散布図の方のプロットが無い部分の表示はカットする。 散布図のためのデータを作成する処理 $ ./collatz5 > i65536.datは#7と同じである。 m = 339 plot [1:100000] 'i65536.dat' every 2 pt 7 ps 0.5, '' …

Collatz問題 #25

C

#7で作成した65536までの初期値と操作回数の散布図のためのデータを出力するプログラムcollatzから、 1に至るまでの操作回数が最大となる初期値を求める。 $ ./collatz | sort -n -k2 | tail 47329 313 60169 316 61999 316 63105 316 53483 321 56095 321 3…

Collatz問題 #24

C

plotのusing修飾子がごてごてし過ぎているので整理する。 次のような二つのユーザ定義関数 gnuplot> up(iter, flag, max) = flag == 1 ? (max - iter + 1) : (1/0) gnuplot> down(iter, flag, max) = flag != 1 ? (max - iter + 1) : (1/0)を定義しておく。 …

Collatz問題 #23

C

以前に、ある範囲内のそれぞれの値が何回の操作で1に至るかについて、値と操作回数の散布図を作成した。 今回は初期値からどのような経路を通って1に到達するのかをグラフではなく値と操作回数の平面上でプロットしてみる。 collatz13.c #include <stdio.h> #include <gmp.h></gmp.h></stdio.h>…

Collatz問題 #22

2のべき乗の値を持つノードについて無駄にややこしく証明しているけれど、 2の6を法とする剰余は2であることは自明なので、これは非合流ノードであり、 操作を遡れば剰余は4であり、これは合流ノードになり、 さらに半分にする操作の方を遡れば剰余は2であり…

Collatz問題 #21

ある値から操作前の値へと遡ることを考える。 その値の6を法とする剰余が4になるとき、 その値を2倍した値と1を引いて3で割った値の二つは共に操作前の値である。 つまり6を法とする剰余が4になる値のノードは二つの値のノードからの合流ノードとなる。 また…

gvprで不要な入力ファイルの指定そのものを不要にする

collatz11.gやcollatz12.gでは入力のグラフデータが不要にも関わらず、 gvprの入力ファイルにナルデバイスを指定しなければならなかった。 実はEND節に書いてあるコードをBEGIN節に書けば済む話だった。 END節に書いてしまうのはどうも出力だからEND節やEND_…

寒いです。

Collatz問題 #20

collatz11.gの結果からこのグラフが自己相似的であるような感じがする。 ノード8まで操作回数10回以内で到達しうるノードで構成されたこのレベルでは、 ノード16で合流する左右二つの経路群は合同であるように思える。 しかし、これを例えば操作回数15回以内…

Collatz問題 #19

これまでのところ、新規にグラフを作成するためにC言語でDOT言語表現を出力していた。 しかし実のところC言語でプログラムを書かなくてもgvprのみを使って新規のグラフを吐くプログラムが書ける。 collatz11.g END { # new directed graph with default edge…

Collatz問題 #18

dijkstraコマンドでノード1からの距離属性付きのグラフが得られたので最大値ノード9232の位置を見てみる。 $ gvpr 'N[name==9232]{print(dist);}' dist.gv 34.00034回の操作で1に到達することが分かる。 このdist.gvはもちろんループを消去した後のグラフで…

Collatz問題 #17

値が100以下のノードにおける最長経路の開始ノードが97であることは、 初期値と操作回数の対応を詳細に見るためのCプログラムによって、 97から始めて118回の操作で1に至る結果から得られている。 これを別の方法で見てみる。 Graphvizにはdijkstraコマンド…

Collatz問題 #16

値9232のノードがどの開始ノードからの経路上にあるのかを見る。 collatz10.g BEGIN { if (ARGC != 1) { print("usage: gvpr -f collatz10.g -a <node_name>"); exit(1); } } N [name == ARGV[0]] { graph_t g = graph("", "D"), h = graph("", "N"); aset(clone(g, $),</node_name>…