高校生のための数学入門書『オイラーの贈物』


吉田武『オイラーの贈物』は、オイラーの公式「exp(i x) = cos x + sin x」(別名:博士の愛した数式)を理解することを目標に掲げた数学の入門書です。対象年齢は10代後半くらいかと思います。1993年にハードカバー(456ページ)で出版され、2001年に文庫化(516ページ)、2010年にソフトカバーの新装版(516ページ)が出ました。

新装版あとがきによれば、これだけ版が変わっているのにはいろいろと大人の事情があるようなのですが、約1000ページの大著『虚数の情緒』で全方位独学法を提唱している著者にすれば、数学の不変性と出版業界の変化の激しさを同時に見せているこの状況は、まさに「してやったり」というところなのかもしれません。

高校生だった当時は、気になっていた数学教育上の(細かい)問題がなおざりだったのでスルーしましたが、高校合格祝いに弟に贈った思い出の本です。プレゼント用には、最初のハードカバー版が一番いいです。

一冊の本としては分厚いほうではありますが、高校生が本当にこれで「オイラーの公式」までの数学を楽しんで身につけられるかというと、よくわかりません。私自身、「数学をちゃんと勉強してから物理をやろう」というマジメな塾に通っていたので、「オイラーの公式」までの数学は高校時代に理解していたと思いますが、そこにいたるまでのトレーニングを全部あわせると、この本の分量を遙かに超えています。ですからこの本は、高校生が数学を勉強するためのものではなく、すでに一度学んだ人が一冊で気分良く復習する(懐かしむ)ためのものだと考えた方がいいでしょう。

そもそも、一つの目標だけを掲げて数学を勉強するのは、冷静に考えればけっこう空しいことのように思いますが、「売れる企画」であったことは間違いありません。この形式を思いついたのはすごいと思います。新装版あとがきで著者自身が言うほどの「名著」かどうかは議論のあるところかもしれませんが、この本を出発点にして、いろいろ楽しめることは確かです(例:『オイラーの贈物』のバグ)。

「オイラーの公式」を前面に押し出している本書ですが、この公式の証明自体は516ページある新装版の236ページで済んでいて、残りは発展的話題と数表、問題解答にあてられています。発展的話題とオイラーの公式との関連が薄いのが残念なところで、オイラーの公式を目指してせっかく頂上まで登ったのに、その眺望を楽しませてはもらえません。眺望を楽しむには、似たような企画である、ナーイン『オイラー博士の素敵な数式』(日本評論社)が向いてそうですが、こちらで扱われる数学は、『オイラーの贈物』よりずいぶん高度なものなっています(大学後半レベル)。

今高校生に数学の入門書を贈るなら、数学ガールシリーズもおすすめです。

カテゴリー: | タグ:

『オイラーの贈物』のバグ


吉田武『素数夜曲 女王陛下のLISP』(東海大学出版会)が発売されて一部で話題になっている今日この頃ですが、この900ページ近い大著についてはまだコメントできる段階ではないので、この機会に思い出した同じ著者の『オイラーの贈物』のバグを報告しようと思います。この本を貶めるのではなく、この本のほんの少しの断片でさえもいろいろ調べて楽しむ題材になるということを伝えるのが目的です。

高校生のための数学入門書『オイラーの贈物』

『新装版 オイラーの贈物』第1版第7刷の付録A p. 314 には、モンテカルロ法を用いて円周率の近似値を求める、次のようなUBASICのコードが掲載されています(参照:UBASICの動かし方

10   randomize
20   input "10^n=";n
30   for i=1 to n
40   k=0:j=0
50   for j=1 to 10^i-1
60   x=rnd:y=rnd:if x*x+y*y<=1 then k=k+1
70   next j
80   print 10^i;"点中";k;"個命中";"Pi=";4*k/j
90   next i

このコードには、1つのバグといくつかの問題があります。

バグ

50行目のfor文で、j1から(10^i-1)まで動くので、モンテカルロシミュレーションの試行回数は(10^i-1)回になります。しかし、80行目では試行回数を10^iあるいはj(ループが終了した時点でj==10^i)と、1回多く数えています。これにあわせるためには、50行目を次のように修正しなければなりません。

50   for j=0 to 10^i-1

問題

プロンプトがおかしい、とかいう細かい話はおくとして、

問題(無駄な計算)

50行目のfor文が終わると(80行目の直前)jの値は10^iになっているので、80行目で10^iを再度計算する必要はありません。80行目の末尾では、10^iの意味でjを使っているので、先頭でもそれを採用するといいでしょう。つまり、80行目は次のように書いた方がいいでしょう。

80   print j;"点中";k;"個命中";"Pi=";4*k/j

問題(無駄な代入)

40行目の「:j=0」は、その直後に「j=1」があるので無駄です。しかし、次の問題の解決に必要なので、そのままにしておいてもいいでしょう。

問題(for文の範囲)

UBASICの仕様はよくわかりませんが、手元のバージョン8.8fでは、for文の範囲(上限ではない)が2^32を超えると「数値が大き過ぎます」というエラーが出ます。ですから、せっかく大きな桁数をサポートするUBASICを使っても、このプログラムでは試行回数10^9回までしかシミュレートできません。本文のコラム(p. 226)で紹介されている実行結果もそうなっています。これではもったいないので、for文ではなくwhile文を使うようにするといいでしょう。

45   jMax=10^i
50   while j<jMax
60   x=rnd:y=rnd:if x*x+y*y<=1 then k=k+1
65   j=j+1
70   wend

問題というか要望(プログラミング言語の選択)

1993年に初版が出版されて以来、本書は売れ続け、つまり生き続けているわけですが、利用されている言語UBASICのほうは瀕死の状態、64bit版Windows 7では動きません(参考:UBASIC を Windows Vista/7 で動かす方法)。ですから、長生きしそうなプログラミング言語を採用し、改訂していただきたいものです。大きな桁の整数のサポートが必要です。C言語+GMPなら寿命は長そうですがハードルが高いので、サポートが組み込まれているJava, Ruby, Python, Lispなどがいいでしょう。Javaに翻訳すると、下のようになります(まず紹介すべきはBigIntegerではなくintを使うバージョンですが、ここでは省略します)。

import java.util.*;
import java.math.*;

public class MonteCarlo {

  public static void main(String[] args) {
    BigInteger one = new BigInteger("1");

    System.out.print("10^n=");
    int n = new Scanner(System.in).nextInt();

    for (int i = 1; i <= n; i++) {
      BigInteger jMax = new BigInteger("10").pow(i);
      BigInteger k = new BigInteger("0");
      for (BigInteger j = k; j.compareTo(jMax) < 0; j = j.add(one)) {
        double x = Math.random();
        double y = Math.random();
        if (x * x + y * y <= 1) {
          k = k.add(one);
        }
      }
      System.out.printf("%s 点中 %s 個命中 Pi= %f\n",
          jMax, k, 4. * k.doubleValue() / jMax.doubleValue());
    }
  }
}

Javaで書くとなんかごちゃごちゃしていやですね。言語仕様が安定していない印象が強いRubyとPythonは採用しにくいので、残るのはLispですか。それなら、『素数夜曲 女王陛下のLISP』がちょうどいいですね(モンテカルロ法も扱われているようですし)。

Mathematicaなら↓のとおり

Google PageRankの数理


Google PageRankの数理 ―最強検索エンジンのランキング手法を求めて― (単行本)Googleがウェブページの順位付けに用いている指標の一つであるPageRank。最近ではその重要度が下がっていて、“Googe Pagerank is Dead!”などと言われたりもするのだが、アイディアはとてもシンプルで、(対象ページが少なければ)実際に計算するのも簡単なため、「ウェブページの順位付けと言えばまずPageRank」という状況はまだ当分続くだろう。(「Google検索アルゴリズムで生態系崩壊を予測」などという応用もある。)

PageRankについての概説と言ってまず思い出すのは「Google の秘密 – PageRank 徹底解説」だが、さらに徹底的に解説した書籍『Google PageRankの数理』が翻訳された。

数学的な細部も詳しく説明されていて便利なのだが、コーヒーブレイク的なコラムも充実していておもしろい。

たとえばGoogle Bomb。

実際にウェブページの順位付けをしようとすると、PageRankのような数学的に整理されたきれいなものだけでなく、いろいろと細かい調整をしなければならなくなる。Google Bombはその一例だろう(参考:ブッシュ大統領もひと安心? グーグルが無力化したネット上の「爆弾」

『Google PageRankの数理』によれば、Googleは2004にはこの問題への対応を始めている(原書 p.55)。不思議なことに、それからずいぶん時間が経っているにも拘わらず、MicrosoftのBingやYahoo! Japanは、現時点で、Google Bombのもっとも有名な例「miserable failure」にさえ対応できていない(Yahoo.comは大丈夫)。

オイラーの名を受け継ぐ書体 AMS Euler


コンピュータの数学アメリカ数学会がHermann Zapf(OptimaやPalatinoの作者)に委託して作成した書体。グレアム, クヌース, パタシュニク『コンピュータの数学』原書は改訂されている)によれば、「字の上手な数学者が手書きした場合の数学の薫りをもたせる」というのが設計の基本方針だったとのこと。書体名はもちろん数学者オイラーからとった。

Digital Typography (Csli Lecture Notes, 78)この書体の制作過程は、Knuth『Digital Typography』収録の“AMS Euler—A New Typeface for Mathematics”で紹介されているが、これはKnuthとZapfという異分野の偉人の共同作業の貴重な記録だろう。

AMS Eulerを使いたいならLaTeXを使うのが一番だが(\usepackage{amsmath,amssymb,euler})、手元にLaTeX環境が無かったり、LaTeX以外で使いたい場合には、ここからbakoma.lzhをダウンロードして、eurm10.ttf (10pt) などを使ってみるといい。

こんな感じ(AMS Eulerの他にもComputer Modern等を使っている)。0の頂上がわずかに尖っているのが特徴。

上の数式群は以下の文献から引用した。

この書体、実は私の博士論文の私家版に使ったのだが、それを持っている人はほとんどいないだろう。奥村晴彦『LaTeX2ε美文書作成入門』にも、

Euler Romanは半ば実験的な性格のもので、これを本文に使った有名な教科書Concrete MathematicsをKnuthたちが出した以外にはあまり使われていないようです。(p.97)

とあるように、AMS Eulerはあまり普及してはいないだろうと思っていたら、この書体を使った書籍が相次いで(といっても著者は一人だが)出版された。結城浩さんの『数学ガール』『数学ガール フェルマーの最終定理』だ。

数学の本と言えば数学者か塾の先生、サイエンスライターが書いたものしか読んだことがなかったが、そのどれにもあてはまらない人が書いているという意味でも興味深い(「プロフェッショナルとは何か」という議論があるようだが、「数学のプロフェッショナル」に関しては合意ができているのではないだろうか。フェルマーを「アマチュア数学者」と呼んだからといって目くじらを立てる人はあまりいないと思う)。こういう試みはとてもいい。フェルマーの最終定理のほうは、「群が出てくる本で『原子・素粒子・クォーク』という用語を安易に使っていいのかなあ」と思ったりもするのだが。

続巻も、AMS Eulerですね。

角の三等分


4480090037矢野健太郎 著・一松信 解説
筑摩書房 (2006/07)

夏の読書感想文で読む本がまだ決まっていない人向け。

ギリシアのデロス島で流行した悪疫を沈める条件としてアポロンの神霊が出した三大作図問題の一つが「与えられた角を三等分すること」。

昭和初期に創刊されたシリーズ「科学の泉」のうちの一冊、矢野健太郎『角の三等分』は、角の三等分が、(直線を引くためだけに用いる)定規とコンパスの有限回の使用では不可能なことを、中学生でも納得できるような語り口で解説している。ただし、不可能性の証明は中学生には難しいためか省かれていて、その証明(代数学)を一松氏が解説として補ったものが、ちくま学芸文庫から復刊された。

角の三等分が、定規とコンパスではできないことは、たいていの人が知っているだろう。でも、ちゃんと証明を読んだ人は少ないのではないだろうか。それを文庫で読めるのだから悪くない。不可能なことが証明されているにも関わらず、その実現を目指す人たち(角の三等分屋)のエピソードなども添えられていて、なかなかおもしろい。

厳密には不可能といっても、現実の製図の精度の範囲内では問題ないと思われる方法(デューラー法、あの銅版画家のデューラー)は、読めば誰でも試してみたくなるのではないか。とはいえ、手元にコンパスがなかったから、AutoCADの機能を作図で許されることだけに限定してやってみる(とはいっても、中点をとるとか3点を通る円を描くとかはCADの機能を使う)。

デューラー法

描き方は意外に簡単。

  1. 三等分したい角をAOBとする
  2. ABを三等分し、Aに近い点をMとする
  3. Mを通るABの垂線と、弧ABの交点をCとする
  4. AB上に、AC=ADなる点Dをとる
  5. MDを三等分し、Dに近い点をEとする
  6. 直線OEが求めたい三等分線になる

40度になるべきところが39.97度なのだから、実用上は何も問題ないだろう(CADでの実用時には、40度と指定して線を引くだけだが)。手で描いて分度器で測ったら、「できるじゃん!」と思うかもしれない。AutoCADが出した角度(39.967897)が、この方法でできる角度を数値的に計算した結果と完全に一致しているのはさすが。それにひきかえ、本書で与えられている近似作図の誤差の数値(p.182、表2)は、けっこう間違ってる。計算誤差があると本文で断っているからまあいいんだけど。

参考

中学生の頃、ユークリッドの作図のルール(コンパスと定規を有限回使う)を不満に思った人は多いと思う。そういう人は、この本を読めば、このルールが四則演算とルートの計算だけで有利係数代数方程式を解くことに対応していることがわかって、不満が解消されるかもしれない(ユークリッドがどこまでわかっていたかは不明だが)。

それでも私は、作図できるものを道具として使ってもいい幾何学がほしいと思う。大工の源さんならできるのに

別の話:

コンパスと定規でローマ字はできない(小林 章:タイポグラフィーの境界を超えて

カテゴリー: | タグ: