第 12 回 (2002.07.09) -- Mathematica 入門 1

最終更新日 … $Date: 2002-07-07 09:39:06+09 $

さて,今回からは Mathematica について学ぶ.
Mathematica とは数式処理ソフトとよばれるソフトウェアの代表的なものである. その機能は基本的に「入力した数式を,利用者の要求に応じて変形する」というものである. ただそれだけかと思うかも知れないが, われわれ人間が数学で何か処理を行う時の作業時間の多くが数式の変形にかかることを考えると, コンピュータの正確さと高速性を利用できるこの種のソフトウェアのインパクトが理解できよう.
この種のソフトウェアは, 上手に使えば, これまで紙と鉛筆だけでは得られなかった数学的知見を得ることを可能にするものである. 数学科の学生としては Mathematica などのソフトウェアを使いこなすことは長い目でみてやはり必須の能力となるだろう.

Mathematica 参考文献

Mathematica は非常に巨大で複雑なシステムをなすソフトウェアであり, 使いこなすにはなにか適切な参考文献の助けが必要であるだろう. 幸い,Mathematica に関する書籍は数多く出版されているので, 書店で自らに合うものを選択するのも良いだろう. また,以前学習した「web を用いた図書の検索」を利用して大学の図書を上手に活用するのもよい.

しかし,Mathematica に関する web や書籍はあまりに数多く,どれを選んだら良いのか初学者としては迷うだろう. そこで,Mathematica に関する web と参考文献を絞りこんで紹介する.

Mathematica の簡単な使い方 I

Mathematica の起動方法

メニューから
「左下の足跡マーク」→「センターメニュー」→「アプリケーション」→ 「Mathematica」

kterm から
mathematica & と入力.

Mathematica (ノートブック)の見た目 … StyleSheet

書式(R) >> スタイルシート(Y) を選んで,Default 以外に変更するとだいぶ見た目が変わってくる. 好みのものを選ぶと良い.
いつもそのスタイルを使いたいのであれば,オプションで
グローバル設定 >> ファイルの保管場所 >> DefaultStyleDefinition
で変えれば良い.

入力

Mathematica では入力はコマンド列をキーボードで入力後,

Shiftキー と Returnキーを同時押し

というシステムになっている. これを忘れると Mathematica が全く使えないので注意.

Help … Help, ?, ??, Options

Help は Mathmatica 画面右上の「Help」をクリックするか,Mathematica 上で
"?調べたいもの"
と入力する. また,オプションや関数の属性まで調べたいという時は
"??調べたいもの"
と ? を重ねればよい.

Options[調べたいもの] でもオプションは調べられるが,?? の方が楽だろう.

調べたいものの文字中に不明な部分があれば * (アスタリスク)で代用できる. この時は該当しそうなものを Mathematica がリストアップしてくれる.
Mathematica をどれくらい使えるかは,Help を使いこなせるかどうかが鍵になる. とにかく Help をばりばり使ってみるのが良い.
(注)教育計算機システムでは,Help は英語だが,頑張って読むべし.

以下に簡単な例を示しておく.

    In[1]:= ?Si*

    System`
    Sign         Sin                  Sinh
    Signature    SingleLetterItalics  SinhIntegral
    SignPadding  SingularityDepth     SinIntegral
    Simplify     SingularValues       SixJSymbol

    In[2]:= ?N

            N[expr] gives the numerical value of expr. N[expr, n] attempts 
            to give a result with n-digit precision.  More…
    

括弧 の使い方

Mathematica でつかえる括弧は 3種類(厳密には 4種類)あり,それぞれ役目が違う. 普通にわれわれが手書きするときと違うので,注意が必要.

出力の参照 … %, %%, %%%%...., %n, Out[n]

Mathematica では入力時にこれまでの出力を参照,再利用できる. % で一番新しい出力結果が,%% で一つ前の結果が,%%%%...(k回) で k個前の出力結果が参照される. また,%n もしくは Out[n] で(最初から数えて) n 番目の出力結果を参照できる.

    In[1]:= 2^3
    Out[1]= 8

    In[2]:= 4*3
    Out[2]= 12

    In[3]:= % + %%
    Out[3]= 20

    In[4]:= Out[1] * %
    Out[4]= 160
    

数値表現 … N[式, 桁数]

数式処理を基本とする Mathematica であるが, 値を「数値で」扱うこともできる. それには,N[式, 桁数] とすればよい.

    In[1]:= N[1/7, 100]
    Out[1]= 0.1428571428571428571428571428571428571428571428571428571428571428571428571428
              571428571428571428571429
  

リスト(List) の作成 … Table[式, {コピーの数}]

Mathematica では何かを列挙したものはリストと呼ばれる形式で扱うのが便利である. 数列やベクトルのようなもの,と思えば良いだろう(数学的には全然そうした性質はないが).
リストを作成するには,Table[式, {コピーの数}] とするのがよい. 詳しくはマニュアルを参照すべきであるが,次の例で大体分かるだろう.

    In[2]:= Table[1/n, {n,1,10}]
    Out[2]= {1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10}
  

リスト の長方形状での出力 … TableForm[リスト] or リスト // TableForm

こうするとリストを「人間に見やすく表示」することができる.
→ 実際に使うには, リスト // TableForm という入力方法が間違えにくくて良いだろう.

    In[3]:= TableForm[Table[{n,N[1/n]},{n,10}] ]
    Out[3]//TableForm=
        1, 1.
        2, 0.5
        3, 0.3333333333333333
        4, 0.25
        5, 0.2
        6, 0.16666666666666666
        7, 0.14285714285714285
        8, 0.125
        9, 0.1111111111111111
        10, 0.1

    In[4]:= Table[{n,N[1/n]},{n,10}] // TableForm
    Out[4]//TableForm=
        1, 1.
        2, 0.5
        3, 0.3333333333333333
        4, 0.25
        5, 0.2
        6, 0.16666666666666666
        7, 0.14285714285714285
        8, 0.125
        9, 0.1111111111111111
        10, 0.1
  

循環小数

1, 1/2, 1/3, ... を十分大きな数まで数値出力してみて,

■ 仮説 1/n が割り切れる ⇔ n = 2a5b

を「目で」みてみよ.

Mathematica の簡単な使い方 II

式の比較 … <, <=, >, >=, ==, !=, ===, =!=

これらの記号で式を比較することができる.

=(イコール) 一つで等価性判定にならない(代入になる)ことに注意
===, =!= は各々 ==, != の「厳密バージョン」. 左右の式そのものを厳密に比較することになる. 普段は使わなくてよいだろう.

    In[1]:= 3 <= 5        
    Out[1]= True

    In[2]:= 3 >= 5
    Out[2]= False

    In[3]:= 3 == 5        ← 3 と 5 は等しいか? という式
    Out[3]= False

    In[4]:= 3 != 5        ← 3 と 5 は違うか? という式
    Out[4]= True          ← 確かに違うので True と答えが返ってくる.

    In[5]:= 3 === 3.0     ← 3 と 3.0 は等しい「式」か? 
    Out[5]= False         ← 式としては等しくないので False になる.

    In[6]:= 3 =!= 3.0     ← 3 と 3.0 は違う「式」か? 
    Out[6]= True          ← 確かに違うので True と答えが返ってくる.
    

仮定の下に単純な形式を得る … Simplify[式,仮定]

数式処理を行うと,数式はどんどん複雑な表現になっていくのが普通である. そこで,式を簡潔にしてわかりやすくしたいというときにこのコマンドを用いる.

仮定は省略できる.
(不)等式の最も単純な形式は「正しいか否か」であるので,(不)等式の正否の判定にも使える.

    In[1]:= Simplify[Sqrt[x^2], x<0]
    Out[1]= -x

    In[2]:= Simplify[1/a < 1/b, 0 < b < a]
    Out[2]= True

    In[3]:= Simplify[1/a < 1/b, b < a]
    Out[3]= 1/a < 1/b

    In[4]:= Simplify[3 == 5]
    Out[4]= False
    

(注) 仮定の条件が足りないと判定できない ⇔ 条件不足がわかる ことに注意.

簡単な関数の定義 … 関数名[変数名_] := 定義

Mathematica で関数を定義する方法はいくつかあるが,もっとも簡単な方法がこの方法である. まずはこの方法に習熟すべし.

左辺の変数名のあとについている _ (アンダースコア) を忘れがちなので注意.
関数や変数の定義を消去するには,Remove[関数名(or 変数名)] とする.
Clear も Remove に似た働きをするが, 完全に消去しないのでわかりにくい挙動が発生しうる.

    In[1]:= f[x_] := Sin[x]

    In[2]:= f[Pi/2]
    Out[2]= 1
  

パターンマッチング … _ __ ___

Mathematica には「パターンマッチング」という概念がある. これは,「該当するものにマッチして,それを参照できる」というもので, 関数の定義などに必須のものである. 詳しくはともかく,簡単な使用例だけでもマスターしておくべし.

_ : 一つの式,__ :一つ以上並んだ式,___ :ゼロ個以上並んだ式 にそれぞれマッチする.
パターンには「ラベル」をつけられる.簡単な関数の定義で用いた x_ はその例で, これがもっとも良く使われる使い方だろう.

    In[1]:= repeat[{x__,y__,y__,z__}] := {y}

    In[2]:= repeat[{0,1,1,1,3,5,1}]
    Out[2]= {1}

    In[3]:= repeat[{1,2,3,4,5,3,4,5,6}]
    Out[3]= {3,4,5}
  

実数の リスト化 … RealDigits[数]

実数の各桁の数字をリストの要素とし, どこに小数点があったかわかるように,小数点以上の桁数とともに返す.
数が有理数の場合, 循環してない部分を a1, a2, … 無限循環反復部分を b1, b2, … とすると,{a1, a2, …,{b1, b2, …}} を返す.

FromDigits は逆の働きをする.

    In[1]:= RealDigits[13.582]
    Out[1]= {{1, 3, 5, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 2}
    
    In[2]:= RealDigits[15/7]
    Out[2]= {{2, {1, 4, 2, 8, 5, 7}}, 1}
  

リスト の要素を取り出す … [[番号]]

[[-1]] とすると最後の要素が出てくる

    In[1]:= circular[x_] := RealDigits[x][[1]][[-1]]

    In[2]:= circular[1/6]
    Out[2]= {6}
    In[3]:= circular[1/7]
    Out[3]= {1, 4, 2, 8, 5, 7}
    In[4]:= circular[1/8]
    Out[4]= 5
  

(注) 割り切れている( ⇔ 循環している部分が無い)場合とそうでない場合の違いに注意

リスト の要素数 … Length[リスト]

    In[1]:= circularNumber[x_] := Length[circular[x]]

    In[2]:= circularNumber[1/7]
    Out[2]= 6

    In[3]:= Table[{n, circularNumber[1/n]}, {n, 20}] // TableForm
    Out[3]//TableForm=
        1   0
        2   0
        3   1
        4   0
        5   0
        6   1
        7   6
        8   0
        9   1
        10   0
        11   2
        12   1
        13   6
        14   6
        15   1
        16   0
        17   16
        18   1
        19   18
        20   0
    

変数への代入 … 変数名 = 代入したいもの

変数をつくってそこへ数式を代入することができる. この機能を使うことで Mathematica を便利に使えるようになるので, なるべく代入を頻繁に使うように心掛けよう.

リスト をグラフで見る … ListPlot[{{x1,y1},{x2,y2},...}]

    In[4]:= a = Table[{n, circularNumber[1/n]}, {n, 200}]
    Out[4]= …略…
    In[5]:= ListPlot[a]
    

sample of listplot

1/n の周期

上のグラフをじっと見ると,

  1. 周期は傾き 1 の線より下にある
  2. 傾き 1 や傾き 1/2,傾き1/3 というきれいな線に並んでいる点が多い

という事実に気づく. 上の表も一緒に見ながらこれを数学的に仮説にすると,次のように言い換えられる.

■ 仮説 1/n の周期は (n-1) 以下である.

■ 仮説 n が素数ならば (n-1) の約数が 1/n の周期である
(素数でない場合は素因数分解すると… →考えてみよ)

素数 … Prime[n]

このコマンドで n番目の素数を出力することができる. もちろん,あまり大きな n を入力するのは無理がある(^-^).

    In[6]:= Table[{Prime[n], circularNumber[1/Prime[n]]}, {n, 20}] // TableForm
    Out[6]//TableForm=
        2   0
        3   1
        5   0
        7   6
        11   2
        13   6
        17   16
        19   18
        23   22
        29   28
        31   15
        37   3
        41   5
        43   21
        47   46
        53   13
        59   58
        61   60
        67   33
        71   35
    

余り … Mod[a,b]

a ÷ b の余りが出力される.

    In[1]:= Table[{Prime[n], circularNumber[1/Prime[n]], 
      Mod[Prime[n] - 1, circularNumber[1/Prime[n]]]}, {n, 20}] // TableForm
    Out[1]//TableForm=
        2   0   Mod[1, 0]
        3   1   0
        5   0   Mod[4, 0]
        7   6   0
        11   2   0
        13   6   0
        17   16   0
        19   18   0
        23   22   0
        29   28   0
        31   15   0
        37   3   0
        41   5   0
        43   21   0
        47   46   0
        53   13   0
        59   58   0
        61   60   0
        67   33   0
        71   35   0
  

Fermat の(小)定理

上の「余り」のところで示した例は実は, 次の定理を反映している.

■ Fermat の(小)定理 a と p が互いに素で p が素数ならば a(p-1) - 1 は p で割り切れる.

上の例がこの定理をどう反映しているのか解釈してみよ.

実習

  1. ログイン, Mozilla の起動, このページの閲覧,Mathematica の起動.

  2. この web を見ながら,出てきている Mathematica コマンドのたぐいを一通り試してみよ.

  3. (課題) 循環小数に関する仮説を Mathematica で確認してみよ. また,この仮説を数学で理論的に示せ(証明せよ). できあがったら,その旨をメールで報告せよ. -- kadai12 という題名でメールすること --

  4. (課題) 1/n に関する仮説を Mathematica で確認してみよ. できあがったら,その旨をメールで報告せよ. -- kadai12 という題名でメールすること --