こともなし

曇。
早起き。よく寝た。

音楽を聴く。■モーツァルト:ピアノ・ソナタ第十五番 K.533 + K.494 (クリストフ・エッシェンバッハ参照)。エッシェンバッハモーツァルトはすべて計算どおりに弾かれているのだが、終楽章(K.494)はスローテンポで、さみしい音楽になっていた。この曲の本来の姿ではないとは思うけれど、悪くない。■バッハ:カンタータ第147番「心と口と行いと生活とで」第二部 (カール・リヒター参照)。■スカルラッティソナタ K.186、K.187、K.188、K.189、K.190、K.191、K.192、K.193 (スコット・ロス参照)。これを聴いていると、スカルラッティが何をやらかしているか先が知りたくて、中毒みたいにやめられなくなる。しかしスコット・ロスはすばらしい。これは現代に稀な必聴ものなのだけれど、現実には皆んな聴いているどころか、聴く人は非常に少ないであろうことが残念でたまらない。何かまちがっているとすら思えてくる。スコット・ロスはこの世があまりにも下らなさすぎてさっさとあの世にいった、まあそういうわけではないが、こういう人から先に亡くなっていくのは理不尽に思える。

疲れたので昼食まで少し眠る。ものすごく印象的な夢を見た。きっと何かの意味がある筈。どうも、いまの自分はいくらでも眠れるし、眠ることがとても大事になっている。しかし、あんまり眠ると帰ってこられなくなるような気もする。

昼から雨。台風接近。

どうでもいいのですけれど、Ruby ではクイックソートをこんな風に実装できます。

class Array
  def qsort
    return [] if empty?
    x, xs = first, last(size - 1)
    xs.select{|i| i <= x}.qsort + [x] + xs.select{|i| i > x}.qsort
  end
end

p [9, 5, 3, 4, 1, 2, 7, 4].qsort    #=>[1, 2, 3, 4, 4, 5, 7, 9]

まさしくアルゴリズムが目に見えるような実装だし、関数型プログラミングっぽくて気に入っています。ちなみに、ここでの「ソート」というのは並べ替えのことです。

素数を求めるのに「エラトステネスの篩」という方法があるのだけれど、それを C言語で実装した別ブログのエントリが、アクセス数が比較的多いわりにひどい実装で気になっていた。それを何とか訂正してひとまず安堵。でも、まだ完全なる C 初心者なのだが。

ちなみに Ruby で「エラトステネスの篩」を実装するとこんな感じ。

def eratosthenes(n)
  ar = (0..n).to_a
  2.upto(Math.sqrt(n).to_i) do |i|
    next if ar[i].zero?
    2.upto(n / i) {|j| ar[i * j] = 0}
  end
  ar[2..-1].reject {|x| x.zero?}
end

p eratosthenes(1000)

1000 以下のすべての素数を表示します。

ここで有名プログラマ(だけでは最近はないが)の小飼弾氏が色いろな言語で実装しているので、こちらと比べてみた。1,000,000 までの素数を求めている。結果は以下。
Linux Mint 18.1 @ Core i5 4210U 1.70GHz

real	0m0.841s
user	0m0.740s
sys	0m0.008s

10年間のハードウェアの進歩のせいであろう、Ruby 2.3.3 で小飼弾氏の C に遜色ない速度が出ている。小飼氏の Ruby 1.8.4 の数値にくらべれば、user 比較で 18倍の速さになっているという結果が得られた(なお、自分のマシンで小飼氏のコードを走らすと [real 0m1.785s, user 0m1.688s, sys 0m0.016s] という結果。へー、自分のコードの方が速いのか)。自分の C での実装だと

real	0m0.115s
user	0m0.064s
sys	0m0.004s

なんてもので、100万以下の素数であろうが瞬殺。

Linux Mint 18.1 を 18.2 Sonya にアップグレード。