ユユユユユ

webエンジニアです

四則演算パズル

日曜日の午後、こんな遊びを見かけた。

遊びと思って取り組んでみて、最初の一題は数分で解けた。が、後が続かない。二題目ではいい感じの形の有理数は作れるのだけれど、分子と分母が逆転してしまっていて、あといっぽ及ばない。というところで悔しさが勝ってしまい、ソルバーを書いた。

ソルバーでも解なしとなったところで異変に気づいて、与えられた自然数を並べ替えることは自由であるとわかった。それを知っていれば、単に割り算の順序を変えて二題目も容易に解けたはず。悔しい気もするが、ゲームのルールを知らなかったのでは仕方がない。少なくとも今日それを覚えられてよかった。

「中学生の遊びと書いてあるものを解けないのか!?」と危機感を持ったが、ルールさえわかっていれば一題目と考え方は同じであった。妙なことに時間をかけてしまったような気もするが、まあいいだろう。お正月にでも身内の子供たちとこれで遊んであげたい。

gist.github.com

ネイピア数の微分がネイピア数になることの証明

放送大学の「入門微分積分 '16」第五課を読んでいる。ネイピア数導関数が次のようになることを知った。

 \displaystyle
(e^{x})' = e^{x}

証明を一読して(わけわからんやん...)となってしまっていたところ、じっくりと精読していたら論理をはっきりと見抜くことができた。きちんと読めばわかるというのが嬉しく、その気持ちのまま自分のためのまとめとして記録する。

前提

 \displaystyle
\lim_{x \to \infty}(1+\frac{1}{x})^{x}=e

証明

 \displaystyle \lim_{x \to -\infty}(1+\frac{1}{x})^{x} = e の導出

 \displaystyle
x=-t
とおくと

 \displaystyle
(1+\frac{1}{x})^{x} \\\displaystyle
= (1-\frac{1}{t})^{-t} = (\frac{t-1}{t})^{-t} \\\displaystyle
= (\frac{t}{t-1})^{t} = (\frac{t-1+1}{t-1})^{t} = (1+\frac{1}{t-1})^{t} \\\displaystyle
= (1+\frac{1}{t-1})^{t-1}(1+\frac{1}{t-1})

である。x \to -\infty のとき  t \to \infty, t - 1 \to \infty であるから

 \displaystyle
\lim_{x \to -\infty}(1+\frac{1}{x})^{x} \\\displaystyle
= \lim_{t-1 \to \infty}(1+\frac{1}{t-1})^{t-1}(1+\frac{1}{t-1}) \\\displaystyle
= \lim_{t-1 \to \infty}(1+\frac{1}{t-1})^{t-1} \cdot \lim_{t-1 \to \infty}(1+\frac{1}{t-1}) \\\displaystyle
= e \cdot 1 
= e

となる。

 \displaystyle \lim_{k \to 0}(1+k)^{\frac{1}{k}} = e の導出

 \displaystyle x = \frac{1}{k} とおけば、 x \to \infty, x \to -\infty の極限を用いて

 \displaystyle
\lim_{x \to \infty}(1+\frac{1}{x})^{x} = \lim_{\frac{1}{k} \to \infty}(1+k)^{\frac{1}{k}} = \lim_{k \to +0}(1+k)^{\frac{1}{k}} = e

 \displaystyle
\lim_{x \to -\infty}(1+\frac{1}{x})^{x} = \lim_{\frac{1}{k} \to -\infty}(1+k)^{\frac{1}{k}} = \lim_{k \to -0}(1+k)^{\frac{1}{k}} = e

より、右極限と左極限が導ける。よって次の極限

 \displaystyle
\lim_{k \to 0}(1+k)^{\frac{1}{k}} = e

が成り立つ。

 \displaystyle \lim_{k \to 0}\frac{k}{\log{}(1+k)} = 1 の導出

 \displaystyle \frac{k}{\log{}(1+k)} = \frac{1}{\frac{1}{k}\log{}(1+k)} = \frac{1}{\log_{}(1+k)^{\frac{1}{k}}}

のように式変形を施しておく。これの  k \to 0 の極限は

 \displaystyle
\lim_{k \to 0}\frac{k}{\log{}(1+k)} = \lim_{k \to 0}\frac{1}{\log_{}(1+k)^{\frac{1}{k}}} \\\displaystyle
= \frac{1}{\displaystyle \log_{}(\lim_{k \to 0}(1+k)^{\frac{1}{k}})} \\\displaystyle
= \frac{1}{\log_{}e} = 1

と導ける。

 \displaystyle (e^{x})' = e^{x} の導出

ここまでを準備として、  \displaystyle (e^{x})' を計算する。

導関数の定義より

 \displaystyle
(e^{x})' = \lim_{h \to 0}\frac{e^{x+h}-e^{x}}{h} = e^{x} \lim_{h \to 0}\frac{e^{h}-1}{h}

である。ここで  \displaystyle \lim_{h \to 0}\frac{e^{h}-1}{h} を求められれば、導関数は求められそうである。

 \displaystyle k = e^{h} - 1 とおくと  h \to 0 のとき  k \to 0 である。また対数の定義より  \displaystyle h = \log{}(e^{h}) であるので

 \displaystyle
\lim_{h \to 0}\frac{e^{h}-1}{h} \\\displaystyle
= \lim_{h \to 0}\frac{e^{h}-1}{\log{}(e^{h})} \\\displaystyle
= \lim_{k \to 0}\frac{k}{\log_{}(1+k)} \\\displaystyle
= 1

結論

以上より

 \displaystyle
(e^{x})' = e^{x} \lim_{h \to 0}\frac{e^{h}-1}{h} = e^{x} \cdot 1 = e^{x}

となる。

 \displaystyle
(e^{x})' = e^{x}

が求められた。

三角関数の加法定理を復習する

 放送大学「初歩からの数学 '18」は、第十章にて三角関数を扱っている。すっかり記憶が磨耗していることに恥をしのびつつ、加法定理をいちど書き出してまとめておこうとおもう。

 結局のところ、基本の形をもとにして、いくつもの展開形が生じるということになる。「すべてを覚える必要はないので、いつでも導出できるようにしなさい」という指導をそういえば受けたことがあったなあ、と学生時代に思いをはせつつ、その導出手法を確認しておく。


 基本の形はこれだ。これがなければなにも始まらない。


\sin ( \alpha + \beta ) = \sin \alpha \cos \beta + \cos \alpha \sin \beta \\
\cos ( \alpha + \beta ) = \cos \alpha \cos \beta - \sin \alpha \sin \beta

左辺で \alpha\beta に加法を適用しているので加法定理ということになる。減法定理というものはない。上式で \beta- \beta に置き換えると、次の式がえられるだけのことである。


\sin ( \alpha + ( - \beta ) ) = \sin \alpha \cos (- \beta ) + \cos \alpha \sin (-\beta ) \\
\cos ( \alpha + ( - \beta ) ) = \cos \alpha \cos (- \beta ) - \sin \alpha \sin (-\beta )

定義より


\cos (- \beta ) =   \cos \beta \\
\sin (- \beta ) = - \sin \beta

であるので、


\sin (\alpha - \beta ) = \sin \alpha \cos \beta  - \cos \alpha \sin \beta \\
\cos (\alpha - \beta ) = \cos \alpha \cos \beta  + \sin \alpha \sin \beta

こうして加法定理の4つの基本形がえられるわけである。あくまで、最初のふたつだけを強く記憶すればよい。


 三角関数の積を和ないし差に直す公式、というものもある。これは加法定理からこのように求められる。


\sin \alpha \cos \beta  = \frac{1}{2}( \sin ( \alpha + \beta ) + \sin ( \alpha - \beta )) \\
\cos \alpha \cos \beta  = \frac{1}{2}( \cos ( \alpha + \beta ) + \cos ( \alpha - \beta )) \\
\sin \alpha \sin \beta  = \frac{1}{2}( \cos ( \alpha - \beta ) - \cos ( \alpha + \beta ))

変形した方が扱いやすければそうしよう


2 \sin \alpha \cos \beta  = \sin ( \alpha + \beta ) + \sin ( \alpha - \beta ) \\
2 \cos \alpha \cos \beta  = \cos ( \alpha + \beta ) + \cos ( \alpha - \beta ) \\
2 \sin \alpha \sin \beta  = \cos ( \alpha - \beta ) - \cos ( \alpha + \beta )

 記号の組み合わせが忙しく記憶に負荷をかけてよこす。実際のところ、記憶するよりも加法定理から導出するのはたしかに安全そうである。


 積を和(差)変換できたのと同じ理屈で、和ないし差を積に変換する公式も導ける。ただしこれにはわずかな操作が必要で、そこが混乱を生じさせる。

 上で導出した、積を和(差)に変換する公式をみよう。これを逆に適用すれば、和(差)から積を導くこともできるはずなのだが、いくぶんややこしいことになっている。


\sin (\alpha +\beta ) + \sin (\alpha -\beta ) = 2 \sin \alpha \cos \beta \\
\cos (\alpha +\beta ) + \cos (\alpha -\beta ) = 2 \cos \alpha \cos \beta \\
\cos (\alpha -\beta ) - \cos (\alpha +\beta ) = 2 \sin \alpha \sin \beta

 ここで必要な操作は、 A=\alpha +\beta , B=\alpha -\beta と新しいパラメータを宣言して、これらの置換した文字について扱うようにすることである。すると \alpha =\frac{A+B}{2}, \beta =\frac{A-B}{2} となり、次のように和(差)を積で表せるようになる


\sin A + \sin B =  2 \sin \frac{A+B}{2} \cos \frac{A-B}{2} \\
\sin A - \sin B =  2 \sin \frac{A-B}{2} \cos \frac{A+B}{2} \\
\cos A + \cos B =  2 \cos \frac{A+B}{2} \cos \frac{A-B}{2} \\
\cos A - \cos B = -2 \sin \frac{A+B}{2} \sin \frac{A-B}{2}

1日1万歩を1年間続けた

1日1万歩を1年間続けた。実のところ平均値にすぎないから表題には誤謬も含むが、誇れる習慣と言えようか。ひとがいつになく運動不足を口にした1年間で、僕はいつになく身体を動かした。

ルーチンはこう。朝、起床してすぐにランニングに出る。雨の日はジムにゆく。体調と環境をみて、3-8kmばかりを走る。これだけではたいてい1万歩には満たない。昼食後、あるいは夕方あたりに40分ばかりの散歩を加えると到達する。勤労日には1時間の休憩時間を15分の食事と長い散歩に分割するのが日常となっている。

さて、そこで得たものはなんだったか?

肉体的な健康が身についた、とひとは言うだろう。実際、この1年での減量幅は10kgになる。BMIは軽肥満から標準に戻った。あるいは、苦しいルーチンに打ち負けずに継続することのできる強い意思だとか、成功体験だとか、自己肯定心だとかいうものが身についた、などか。

とはいうものの、それだけのことである。肉体が健康であっても、心が健康でない日々はあったし、そう万事が万事快調でもない。

僕自身の性質として、はっきりとわかったことはある。苦しい習慣を続けることは苦にならない。実のところ、機械的な日々を過ごすほど楽なことはない。自分の決めたルールにのっとって動くだけで、それ以上のことは何も考えずに済むというのは、実に楽なことである。これは禁欲にみせかけて、むしろ堕落に近い。

そういうことをおもうにつけ、この1万歩という意味のない数字で生活を規定することは1年で終わりにすることにした。ずるずると数字に囚われて次の一年を暮らすことになるのがおそろしい。

目標を立ててそれを遂行することは美徳、そしてそれができるひとは善とみなされる。善行によって死後に救われるのであればまだしも、実際のところいつ風邪をこじらせて死ぬともわからない時代に、そんなことをしてなんになるのか。どうせ死ぬのであれば、徹底的に身体を破壊して滅びていくほうがよほど人間らしく美しくはないか。なんらの社会貢献も考えずに、映画をみて本を読んでゲームをして食って寝て肥満するだけの生活をしていた若い日々がいつになく懐かしい。

そういう脱出願望を心に秘めていながら、人生の目的を考えはじめると気が触れそうになるので、何も考えなくていいように身体を動かすのだろう。身体を鍛えて、健康を守る。この悪習から足を洗うことは、それを継続するのと同じだけ難しい。

K&R を読み通した

 K&R を読みはじめた - ユユユユユ より1ヶ月で、ひとまず通読した。

f:id:jnsato:20210905153156j:plain

 ANSI C の大きくない仕様を一冊で網羅する、という能書きで始まる。実際、シンタックスの説明は用法を折々に交えながらでも、150ページばかりで終わっている。残りの40ページは標準ライブラリとシステムコールの解説であり、やや応用に踏み込む。それでも200ページに収まる。

 名著であるとおもう。それは、 C を発明し、仕様を策定した当事者たちが執筆しているという時点ですでに疑いようがないのだが、実に平易な文体で議論が勧められて、ゼロから C の知識を理解させる、という入門書としてこれ以上の成果はありえないだろう。このような書物が成立するのは、そもそも仕様が十分に小さく、かつ平易であるからにほかならないわけで、 C のようにシンプルな言語がほかにないことをおもうと、このようにシンプルに言語を解説しきる、という書物はもう二度と成立しえないだろう。40年近く前に書かれた本でありながら、いまだ読むに耐える技術書であるということのなんとすさまじいことか。しかもそれは、 C そのものがいまだ利用に耐える言語であるということに照応している。

 ごく短い文量のうちに、読者はごく初歩的なシンタックスの理解からはじめて、最後には malloc の再実装にいたる。読み始める前の僕にこう伝えたら、「いくらなんでもそれは無茶な...」と萎縮するだろう。しかし、ごく単純な言語機能を理解して、ごく単純なルーチンを実装する、ということを積み重ねる手続きにおいて、無茶な飛躍は存在せず、ただ自然な因果の帰結としてそれが成立するのである。恐るべきことである。

 裏を返すと、このように基本的な部品を用意し、それら部品の組み合わせにより、より大きなシステムを作る、というのは、まさしく理想的なプログラミングの営みである。その営みがもっとも純粋な形でこの本には表現されている。それをさておいて、 C は難しいとか、 OS は難しいとか、食わず嫌いを正当化する意見を一方的に持って、無学をひけらかしていた以前の自分の至らなさを省みるきっかけともなった。

 と、殊勝なことを言いつつも、やや手抜きをしながら読み上げたことも事実である。練習問題は序盤から手強いことも少なくなく、終盤に至ってはさらに多くのエネルギーを要求する。これらを逐一踏ん張るよりも、まずは最後まで通し読みすることを優先した。ただそれでもなお、 UNIX の内包するいくつかの重要なデータ構造に関する知識を再発見することができたし、読み物としてもすでに上等な著作であることは言うまでもない。

 それから、入門書であることに疑いはないのだが、読者を選ぶ本であることも明らかである。それなりにプログラミングの素養のある者でなければ、およそ読むことはできないだろう。僕の場合は、 C++ をいくらか利用していたことが少なからずアドバンテージとなって、読み通すことができた。しかしまったくの初心者はいうに及ばず、スクリプト言語の経験のみを資産として本書に挑むことも、果たして可能であるかどうかはわからない。

 まあ、読める人は読めるし、読めない人は読めない、という表現しかしようがなさそうだ。仮に読めないとしても、いずれ読む必然性がどのプログラマにも開かれていることは間違いない。その意味では、万人必携の書ということにもためらいはない。ほかならぬ僕自身も、やがて時がくれば再読しうるし、その折にはあらためて、新しい読みを獲得するだろうという予感がある。

『大学生物学の教科書 1: 細胞生物学』を読んだ

カラー図解 アメリカ版 新・大学生物学の教科書 第1巻 細胞生物学 (ブルーバックス)
https://www.amazon.co.jp/dp/4065137438

 簡単な化学から始まり、やがて難しい化学になる。それを元手にして、タンパク質、脂質、糖質というみっつの高分子の多様性をみていく。ここまでが前半である。

 後半は、細胞の観察をおこなう。原核細胞の相対的に単純な構造をみたうえで、真核細胞のいっそう複雑な構造をみる。細胞小器官、細胞外構造、細胞膜をみる。そのご、最後の仕上げとして、細胞間の情報伝達が化学物質(リガンド)の結合をトリガーにおこなわれることをみる。

 生物、あるいは生命維持のメカニズムが、実にシステムのアナロジーでうまく説明できること。ごく表面的に理解したのみではあれ、感動を呼び覚ますには十分であった。 DNA が情報を暗号化して保存し、それを折々に復号・複製する。あるいはそれを設計図にしてタンパク質を産生する。はたまた、ある信号に反応する受容体と反応しない受容体があって、細胞は選択的・特異的に応答をおこなう。ある信号からはじまる反応が、自身の出力を入力にして連鎖的に反応を引き起こすことで、信号が指数的に増幅される。などなど、生命活動の様相がまるで精巧に設計された工学的機械のように描かれる。機械のアナロジーで生命を描写できること。因果としては逆になろうが、そこに興味深さと恐ろしさをないまぜにしたような感慨をもった。

 エラーだらけのシステムと格闘する仕事から離れて、神のみわざと言いたくなるのもうなずける均整美をもった生命というシステムの美しさを学ぶのは法悦である。これだけ完全に近いシステムが僕の身体を駆動しているのに、その僕が生み出す出力の不完全さときたらないな、とシニカルな笑いをついかき立てるところもある。

 精密機器のようでありながら凄まじくダイナミックな、生物学というこの世界への導きとして素晴らしい教科書であるとおもう。この一冊を読めばすべてがわかるようなテキスト、という指向性で書かれている気がする。それも実にアメリカの教科書らしく、好もしい。

 ひとまず後続のテキストも購入する。そして10月からは、放送大学の「初歩からの化学」も履修する。「初歩からの生物学」という講義もあったけれど、生物を知るうえでの下部構造として化学があるようだから、いささか遠回りになっても悪くはない道だろうと思っている。

K&R を読みはじめた

 The C Programming Language を読み始めた。著者が Kernighan and Ritchie の二人組であることより K&R という愛称で呼ばれるようである。

f:id:jnsato:20210809190137j:plain

 学生の頃に無料で落ちていた PDF 版を手に入れて冒頭を眺めたことを覚えている。そのころは古典を所有するという以上の欲望はなにもなかったので、特に誠実に学ぼうともせずに放置していた。

 いま、世の中が Rust 熱に浮かされている様子なのを眺めて、僕も興味はあるクチであるが、それより先に C の足固めをしようとおもった。 CS:APP が C で記述されていたことに触発されたところもある。そもそも Linux カーネルを題材にシステムプログラミングを学ぼうとするときに、 C 以外のなにを使えるだろうか?

 付録を含めてもたかだか 200 ページばかりの、薄い本である。仕様の小さな言語であるから、この薄さのなかにすべてが書かれていると、前書きでも誇らしく書かれている。

 実際にその「小さな仕様」で練習問題を解くと、あらゆる小さなルーチンを書くことになる。そしてそのいちいちについて、「はたしてこれで正しくできているだろうか」と疑い深くなる。いかに普段、便利なライブラリに守られているかを痛感させられるし、それを再実装する自分の腕のおぼつかなさに愕然とする。しかし、やってできないわけではない。じっくり取り組めば、時間はかかるが書ききることはできる。

 どうにも自信がなければ、参考書として Answer Book も用意している。こちらももちろん C で書かれているし、悪魔的に難しいことはやっていないので、読めないことはない。加えて、標準ライブラリの実装をみたければ、みればいいだけのこと。 glibc をクローンして、適当なヘッダやら実装を眺めていると、よくわからないマクロに囲まれてはいても、これこそが battle-tested なソースそのものであるという安心感を与えられる。実に、僕の生まれたころに積まれたコミットをみると、崇高な思いがする。

 という調子で、しばらくは C の世界で遊んでみようとおもう。終盤には UNIX システムプログラミングの話にも接続するようなので、最後まで飽きずに取り組んでゆきたい。