このサイトは学部では早稲田で物理を, 修士では東大で数学を専攻し, 今も非アカデミックの立場で数学や物理と向き合っている一市民の奮闘の記録です. 運営者情報および運営理念についてはこちらをご覧ください.

中高の数学の復習から専門的な数学・物理までいろいろな情報を発信しています.

中高数学に関しては自然を再現しようや役に立つ中高数学 中高数学お散歩コース

大学数学に関しては現代数学観光ツアーなどの無料の通信講座があります.

その他にも無料の通信講座はこちらのページにまとまっています.

ご興味のある方はぜひお気軽にご登録ください!

数学・物理学習とプログラミングと絡められないかと試行錯誤している.

数学からの取っつきやすさ,

物理からの取っつきやすさ,

プログラミングからの取っつきやすさをそれぞれ考えないといけない.

ある程度の体系性もほしい.

数学や物理としても面白い内容にしたいし,

プログラミングから見ても意味がある内容にしたい.

どうしたものかとずっと思っていたのだが,

素数という数学のキラーコンテンツとプログラミングを絡めた素数夜曲があった.

微妙なところも多いとは思いつつ,

メインエディタとして Emacs を使っているし,

LISP 系の言語はきちんとやりたいとも思っている.

そんなところでいい感じの落とし所という気がしたので,

少しずつ読み進めつつコードの記録をしていこうと決めた.

数学・物理の数値計算との相性の良さ,

私の勉強してみたさとも合わせて Python や Haskell のコードも書いていけたらいいな,

と思っている.

あと何となく JavaScript もやってみよう.

JavaScript は動きが速すぎて何かやってもすぐに動かなくなりそうで嫌なのだが,

ここでやるくらいのことならそう簡単に陳腐化しないだろうと勝手に信じてやっていこう.

基本的には付録のプログラミングパート,

特に付録 B から記録をつけていく予定だ.

Emacs の org-babel で書いているので,

素数夜曲本編とは見た目ちょっと違うコードを書いていくかもしれない.

Scheme, org-babel ともにあまりよくわかっていないがとりあえず進める.

org-babel の Scheme が標準で Guile を使っていて,

その変更の仕方がわからなかったのでとりあえず Guile を使う.

これまで入れていた Gauche を使いたかったが org-babel が対応していないようだ.

そうでないなら MIT/GNU Scheme が良かった気もするがこれも設定がわからない.

でははじめよう.

RESULT

とりあえず Hello, World! で.

RESULT

加減乗除は次の通り.

前置記法なのがポイント.

割り算で分数にしてくれるのは割とポイント高い気がする.

RESULT

RESULT

まだ (?) org-babel との相性がよくないっぽい.

ここ を参考にちょっと改造.

Haskell でのあまりの計算には mod を使う.

RESULT

RESULT

例えば次の式.

\begin{align}

2 \div 3 + 5 \times 7 – 11

\end{align}

Scheme (LISP 系言語) だと括弧で細かく区切っていくから,

演算の優先度みたいな面倒なことをあまり考えなくても済む.

RESULT

Python だと普通に書く.

RESULT

Python っぽくも Scheme っぽくも書ける.

演算子を括弧でくくると Scheme のように演算子を前に置けるから.

RESULT

RESULT

素数夜曲 P.389 によると Scheme で sqrt は単項演算子らしい.

RESULT

入れ子にすれば複数回適用できる.

Scheme は関数合成あるのだろうか.

ここを見ると Gauche ならあるようだが.

RESULT

Python 版は次の通り.

Python は math をインポートしないといけないのがめんどい.

Python 3.5.1 を使っているが関数合成はないのだろうか.

ちょっと調べたところでは標準ではなさそうだった.

RESULT

Haskell は関数合成 (.) がある.

RESULT

RESULT

Scheme では exp を使えば出せる.

$e$ 自体は定義されていない?

RESULT

Python の場合はやはり math モジュールにある.

RESULT

NumPy にもある.

RESULT

$e$ 自体は定義されていないので Scheme と同じく指数関数から近似値を出す.

RESULT

Math.exp() が自然対数の底による指数関数で,

Math.pow() は一般の底と指数の関数.

RESULT

まずは等号 = を.

RESULT

ここで #t は true, #f は false を意味している.

== ではないのかとちょっと驚いた.

ちなみに引数がたくさんある場合にも適用できる.

RESULT

不等号 > >= などもある.

不等号はそれぞれ隣の項に対して適用させていった結果を出力するようだ.

RESULT

等しくないことの判定は != だ.

RESULT

こちらは = だと代入になってしまうので == と重ねる.

Scheme の (= 1 2 3 4) みたいなのはどう書けばいいのだろう.

foldr で書けると思ったので foldr (==) 1 [1, 2, 3, 4] と書いてみたら怒られた.

相談したら「それ型エラー起こしてるから. ちゃんとして」と言われた.

Haskell, ちょっとしたところですぐこけるのでとてもつらい.

結論からいうと適当に 2 つリストを作り,

その要素を比較していく形で対処するのが普通らしい.

他のところでもそういう処理をするのがいいというコメントを頂いたことがあるので,

道具箱におさめておこう.