■ No.2 (2001.10.24) … Mathematica の簡単な使い方 II and 循環小数

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

    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
    

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

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

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

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

● パターンマッチング … _, __, ___
→ _ : 一つの式,__ :一つ以上並んだ式,___ :ゼロ個以上並んだ式 にそれぞれマッチする
→ パターンには「ラベル」をつけられる.簡単な関数の定義で用いた 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
    

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

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

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

    Out[5]= - Graphics -
    

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

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

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

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

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

● 素数 … Prime[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 の(小)定理 a と p が互いに素で p が素数ならば a(p-1) - 1 は p で割り切れる



□ レポート課題 1 上の仮説(いくつかあるが)を Mathematica で確認してみよ

□ レポート課題 2 RealDigits コマンドを用いないで,同様の計算をおこなってみよ
→ ただし,次週に学習する「簡単なプログラミング」能力が必要かも

>> 目次