#!/usr/bin/env python # coding: utf-8 # # Hiroshi TAKEMOTO # (take.pwave@gmail.com) #

表記方法

#

# Sageを使用する際に知っていると便利な約束事(表記方法)があります。 # 代表的なものについて、以下に示します。 #

# # # #

python文法

#

# Sageは、pythonのインタプリタを使っているため、pythonの構文がそのまま使えます。 #

#

# pythonでのコメント(実行に影響しない注釈)は、#記号から行末がコメントとして扱われます。 # コメントには日本語も使用できますので、式の説明やメモを入れておくと後で役立ちます。 #

# # # In[1]: # print(1 + 3) この行はコメントです。 print(1 + 3 + 5) # #

複数の式を1行にまとめる

#

# 複数の式を1行にまとめるには、式を;(セミコロン)で区切ります。 #

#

# セルを評価するとprint文やshowコマンドの結果、それと一番最後の結果が表示されます。 # しかし、最後の代入文の結果は表示されないため、例のように;(セミコロン)の後に変数名 # を入力します。 #

# # # In[2]: b = 1 + 3; print b # 複数の式を1行にまとめるには、式を;(セミコロン)で区切ります。 a = 1; a # 代入の結果は、値を返さないので;で区切って変数名を書いて代入結果を表示します。 # #

python変数への代入

#

# 計算結果をpython変数に代入するときには、= (イコール)を使います。 # python変数と断っているのは、sageの数式で使われる変数と区別するためです。 #

#

変数aに$\frac{1}{2} + \frac{1}{3}$の結果を代入します。結果は、$\frac{5}{6}$と分数で表示されます。 # aの値を数値として出力するには、N関数またはnメソッドを使います。 #

# # # In[3]: a = 1/2 + 1/3; print a N(a) # #

タプル

#

# タプルは、カンマで区切られた値からなるシーケンスデータ型です。 # タプルの出力は()カッコで括られたカンマ区切りの形式で表示されます。 #

#

# タプルの変数への代入をタプル・パッキングと呼び、逆にタプルから変数への代入をシーケンス・アンパッキングと呼びます。 # シーケンス・アンパッキングは変数への一括代入に使用すると便利です。 #

#

# リストや辞書と合わせるために、あえてカッコ()をつけてタプルを使用しることにします。 #

# # In[4]: t = (1, 2, 3); print t # 変数tへのタプル(1, 2, 3)の代入(タプル・パッキング) (x, y, z) = t; print x, y, z # タプルtから変数x, y, zへの代入(シーケンス・アンパッキング) # #

リスト

#

# sageでは、リストがもっとも重要なデータ構造になります。 # タプルとは異なり、リストでは要素の参照の他に、要素の追加、削除、結合などの操作ができます。 #

# # # In[5]: L1 = [1, 2, 3]; print L1 # リストの生成 L2 = [9, 8, 7] L1.append(4); print L1 # 要素の追加 print(L1[2]) # 要素の取得 print(L1[1:3]) # 部分リストの取得 print(L1[-1]) # 最後の要素は、-1で参照 print(L1 + L2) # リストの結合 # #

辞書

#

# 辞書、別名「連想配列」と言われ、リストのインデックスの代わりにキーで値を取得することが # できます。 #

#

# # # In[7]: ages = {'John':24, 'Sarah':28, 'Mike':31}; # 辞書の生成 print(ages) # 辞書の出力 print(ages['Sarah']) # 要素の取得 # #

変数の宣言

#

# sageの式で変数として認識させるには変数をvar関数で宣言しなくてなりません。変数の宣言は、 #

# var('変数名')
# 		
# 複数の変数を宣言する場合には、スペースを空けて指定します。 宣言される変数を参照したりする場合には、 #
# x, y = var('x y')
# 		
# のようにpython変数x, yに宣言したsage変数を代入します。 #

# # # #

関数の定義

#

# sageの関数には、以下の3種類の指定方法があります。必要に応じて使い分けて下さい。 #

# 例では、$sqrt(x)=x^{\frac{1}{2}}$を返す関数をシンボリック関数、python関数、lambda関数を # それぞれ symRoot, pyRoot, lamRoot として定義し、その使い方を説明します。 # 当然すべて、同じ結果になります。 #

# # In[9]: # シンボリック関数 symRoot(x) = x^(1/2) # python関数 def pyRoot(x): return x^(1/2) # lambda関数 lamRoot = lambda x: x^(1/2) # 関数の呼び出し print(symRoot(2), pyRoot(2), lamRoot(2)) # 数式が引数の場合 x, y = var('x y') print(symRoot(x+y), pyRoot(x+y), lamRoot(x+y) ) # #

値の代入

#

# 変数の値を指定して関数の値を取得するには、以下の3つの方法があります。 #

#

#

# 以下の例では$f(x) = a x + b$の関数をf(x)、g(x, a, b)で定義した場合のa, bの値の代入方法 # を示しています。subsの場合には、a=2, b=1のようにカンマで区切って値をセットする方法と辞書形式 # で与える方法が使用できます。var関数で変数を定義すればa=c, b=dのように別の変数への置換も可能です。 #

# # In[11]: # 関数f, g、変数x, a, bを定義 var('x a b') f(x) = a*x + b g(x, a, b) = f print( g(x, 2, 1) ) print( f(a=2, b=1) ) print( f.subs(a=2, b=1) ) print( f.subs({a:2, b:1}) ) # 変数c, dへの置換 var('c d') print( f.subs(a=2*c, b=d+1) ) # #

規則の代入

#

# 規則の代入には、substitute関数を使います。例として、関数hの$x^2$をwに置き換えてみます。 #

#

# 変数の置換では行えない変換もsubstituteを使うことによって可能になります。 #

# # In[15]: var('w') h = x^2 + 3; print( h ) # 関数hの定義 print( h.substitute(x^2 == w) ) # x^2をwに置き換える # #

前の出力結果の参照

#

# 直前の実行結果を _ で参照することができます。 #

# # In[16]: [1, 2, 3] # In[17]: sum(_) # 直前の実行結果を_で参照し、リストの和を求めます。 # In[ ]: