● 式の比較 … <, <=, >, >=, ==, !=, ===, =!=
→ =(イコール) 一つで等価性判定にならない(代入になる)ことに注意
→ ===, =!= は各々 ==, != の「厳密バージョン」.
左右の式そのものを厳密に比較することになる.
普段は使わなくてよいだろう.
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/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 コマンドを用いないで,同様の計算をおこなってみよ
→ ただし,次週に学習する「簡単なプログラミング」能力が必要かも