Ruby 1.9で require 'prime' すると使える Prime.prime? や Integer#prime? 、見ての通り素数判定メソッドなんだけど、負数を含む 1 以下の値を渡すと true が返ってくる。
何でやねん!と突っ込みながら最新のソースを見てみると、修正した跡を発見、が、何かおかしい。
負数の場合正数にしてから計算するようになってる。私の記憶が確かならば素数は自然数のみだったはず。
おかしいと思ってもうちょっと調べたら、BTSのエントリを発見。まあないわけないよね。
http://redmine.ruby-lang.org/issues/show/1243
やはり既に指摘されていた模様。何やら色々意見があるようだけれど、私の情けない英語力ではよく理解できなかった。無念。
数学に関しては完全に素人なので論理的な意見は言えないんだけど、Wikipediaによると素数は1より大きな自然数となっているので、負数は非素数の方がわかりやすいんじゃないかなー。複素数についても言及されてる(? よくわかってません!)っぽいけど、複素数と素数って何か関係あるのかしら。素数って自然数のみだと思ってたけど、もしかして他の数系への拡張もあるのかな? だとしたら Complex#prime? みたいな感じで動作を変えるとかじゃーダメなのかな。うん。繰り返すけど分かってないです。スルーしてください。
そもそも何でこんなこと言い始めたかと言うと、今回この Integer#prime? がそのように動作すると思って使ってハマったので。ええ、もちろんそれだけの理由です。
まあただ一つ確実に言えることは、英語と数学をもっと勉強しろってことですね。特にDober Robertさんの主張を理解できていない…。