素人様万々歳!@コクェモモ

素人様による学問の侵略の最前線を見た。
現時点での関連する元記事4つの内容および問題点。


・『アルゴリズム百選 - フィボナッチ数列にO()を学ぶ』
http://blog.livedoor.jp/dankogai/archives/50958771.html
フィボナッチ数列を計算するアルゴリズム3種の紹介。
1.ナイーブな実装
2.一般式を使った実装
問題点:『どんなにnが大きくてもこの式は一回しか計算しないので、この式がO(1)である限りO(1)』が不明。トートロジー。この点に関しては3つ目の記事で一応フォローが為される。ちなみに俺ならroundを使うくらいだったら行列を使って計算する。
3.メモ化を使った実装
問題点:問題の内容が変わっている。一つ与えられたnに対してフィボナッチ数を計算していたはずが1〜nに対して計算している。あらかじめテーブルに結果が入っているのなら(そしてテーブルを読みに行くのがO(1)と仮定すれば)当然O(1)であろう。で、最初にテーブルを作るときにO(n)とのことだが、これは2から悪化している
全体的な問題点:そもそもO記法の定義が不明。n乗がO(1)とは初耳である。かろうじて「再帰関数の呼び出し回数」が近いか?さっぱり分からないので定義を示してください、と色んな人が突っ込んでいるのだが返事がない。


・『私ごときがアルゴリズム本を書くことにした訳』
http://blog.livedoor.jp/dankogai/archives/50960720.html
186氏による突っ込み(http://d.hatena.ne.jp/smoking186/20071130/1196386299)への返答。
問題点:後述。


・『アルゴリズム百選 - ベキ乗はO(1)でOK?』
http://blog.livedoor.jp/dankogai/archives/50962361.html
2のアルゴリズムでn乗を計算しなければならないが、それがなぜO(1)と言えるのか、という疑問への返答。
問題点:精度および入力が限定されているので計算量の議論になっていない。グラフ書いたからなんだよ。また、指数関数を計算するアルゴリズムについて、ループ回数が22回で決まっているのでO(1)という議論も首を捻らざるを得ない。


・『アルゴリズム百選 - 用語の定義、またはその欠如』
http://blog.livedoor.jp/dankogai/archives/50962504.html
問題点:いま自分が使っているO記法は厳密なものではない、以上の主張は読み取れない。つまり、実際にどのような定義を用いて『n桁の足し算はO(1)としてよい』という結論を導いたかが書かれていない。


詳しいことは、無数の突っ込みが入っているのでそちらを参照してください。
で、真に問題なのはこの人の学問に対する姿勢なわけだけど。

しかしここで主張したいのは、「私の方が正しい」ということではない。実は私もid:smoking186さんと同じ勘違いをしそうになったのだ。しかし私はコードを実際に書いて動かして見た。そして書いて動かしてみれば、この場合は自分の考えが正しいかどうかは手が教えてくれるのだ。「間違い」を指摘してくださるのは結構なのだが、これらのうち実際に自分で動かした上での指摘はどれくらいあるのだろう?
http://blog.livedoor.jp/dankogai/archives/50960720.html

「実際に自分で動か」さずに、紙の上だけで厳密かつ普遍的な予言を行うために理論が存在するんですが。あらゆる状況について実験が出来るのなら科学なんていらないんですよ。このレベルの議論で、「実際に動かしていないから聞く価値がない」とでも言いたげな態度をとる人間を信用することなどおよそ出来ません。典型的な似非科学の言辞でもあります。これは。


つまり、

何より私自身が賛成だ。にも関わらず、私ごときがアルゴリズム本を書く気になったのは、アルゴリズムというのはプログラム以上に間違えやすい、というより間違いに気がつきにくいものだからだ。「裸のアルゴリズム」が正しいか否かを証明するのは、数学の証明のように結構難しい。

私が書きたいのは、実際に動く、目と手で触れることができるアルゴリズム本だ。用語の的確さ、内容の正確さは後で直していくこともできる。しかしそこにモノがなければ、それが正しいか間違っているかを判断することすら出来ない。実際、二分検索のオーバーフローバグがわかったのだって、実際にバグが利用によって顕在化してからではないか。


というわけで、私は恥もコードも晒すことにしたのである。

http://blog.livedoor.jp/dankogai/archives/50960720.html
とかいうのは、単に謙遜したフリ、恥を晒したフリ、初心者に寄り添うフリであって、実際のところは素人の間に「なんとなく正しそうな空気」を作って『素人様』を増殖させようとする態度に他なりません。ちなみに『ように』じゃなくて数学の証明です。

本書はなるべく正確な知識を提供することを目指しますが、その正確さのためにページ数が倍になるのであればそれを恐れずに割愛するつもりでもあります。

http://blog.livedoor.jp/dankogai/archives/50962504.html
おおざっぱな議論と不正確な議論は違います。

一つ参考にしているのが、Mastering Algorithms with Perl。同書では私がやっている以上にカジュアルなO記法が見られる一方、O記法の説明のところでOだけではなくΘやΩも紹介し、それらが実地においてどうインパクトを与えるのか図とグラフで説明した上で、「もっと厳密に知りたい人はこちら」と参考文献へのポインターを示しています。
http://blog.livedoor.jp/dankogai/archives/50962504.html

だから、今 あなたが どんな定義でO記法を使っているのか明示してくださいよ。カジュアルな、ってのは曖昧でいいってことじゃないでしょう。


思わず全文引用しそうになるのでこの辺で止めときますが。


アルゴリズムの本はいいのがいっぱい出てるので、こういう人の本を買うくらいなら別のを買いましょう。それこそ記事内で紹介されてる本とか。

こういう過度にpedanticな姿勢が、どれだけ多くの潜在読者を遠ざけているか、つっこみを入れるみなさんは考えたことはあるのでしょうか。アルゴリズムを語る人は少なくないのに、本にまでなることは滅多にない事情はこのあたりに由来するのではないかと思います。
http://blog.livedoor.jp/dankogai/archives/50962504.html


これは妄想ですので。