Graphviz

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>…

引用符と二重引用符

gvprのワンライナについて。 コマンドラインシェルがbashの場合、二重引用符で囲んだgvprプログラムに$が含まれていると、 bashがシェル変数として扱おうとするため大抵の場合、gvprの文法エラーになる。 そこで、引用符で囲み、プログラム中の引用符はエス…

Collatz問題 #15

collatz9が出力するグラフにおいて開始ノードを除くノードの値は最大どのくらいになるのか見てみた。 $ ./collatz9 | tred | gvpr "BEG_G{int m=0;} N[m<name&&indegree>0]{m=name;} END_G{print(m);}"によると9232となる。 このgvprに与えたプログラムではノードの値のみを</name&&indegree>…

Collatz問題 #14

collatz8とcollatz9の出力の違いについて、 82, 88, 100のノード周辺だけをピックアップしてみる。 parts.g BEG_G { int i; graph_t g = graph($.name, "D"); } E { for (i = 0; i < ARGC; i++) { if (head.name == ARGV[i] || tail.name == ARGV[i]) { clon…

Collatz問題 #13

今までのグラフに合わせて、 操作によって初期値になるような100を超える値もノードになるように、 操作後に初期値になる操作前の値から初期値へのエッジも含めるように変更する。 collatz9.c ...snip void collatz_route(mpz_t x) { mpz_t n; mpz_init(n); …

Collatz問題 #12

操作後の値が100以下のノードを全て含み、かつ、 その全てがエッジ伝いに1のノードへ到達できるようなグラフを得たい場合、 単純にやるなら、100以下の全ての値について、 これをそれぞれ初期値として、 その1に至る経路を出力したものを一つのグラフとして…

Collatz問題 #11

操作後の値が100以下になる操作を全て挙げてDOT言語で表したグラフを出力してみる。 collatz7.c #include <stdio.h> int main(void) { unsigned long x; puts("digraph {\n edge [color=blue];"); for (x = 1; x <= 100; x++) { if (x % 6 == 4) printf(" %lu -> %lu </stdio.h>…

Collatz問題 #10

前出のグラフのノード数はGraphvizのコマンドgcを使って、 $ ./collatz6 | gc -n 62 %1 (<stdin>)であり100に満たない。つまり100以下の値を含むすべての経路が表現されていない。 一旦100を超える値を経由して戻ってくるような経路があるが、 芋づる式の方法でかつ</stdin>…

Collatz問題 #9

最終的なグラフを図示するのを忘れていた。 DOT言語で記述された結果をdotコマンドで画像にする。 $ ./collatz6 | dot -Tpng -ocollatz6.png

Collatz問題 #8

一回の操作である値になるような操作前の値を求め、 さらにその値になる操作前の値を求めるという手続きを繰り返す。 これを1から始めることで1へ至る経路を網羅することができる。 値によっては操作前の値が二つ存在する場合があるので、 この結果は単純な…