v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

1

はじめての SAGE
by Ted Kosan
翻訳：横田博史

Copyright © 2007 by Ted Kosan
This work is licensed under the Creative Commons
Attribution-ShareAlike 3.0 License. To view a copy of thislicense, visit http://creativecommons.org/licenses/by-sa/3.0/

1/158

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

2/158

Table of Contents
1 はじめに.....................................................................................................9
1.1 献辞................................................................................................................9
1.1 ご了承.............................................................................................................9
1.2 支援団体.........................................................................................................9
2 はじめに...................................................................................................10
2.1 数学計算環境とはなに?...................................................................................10
2.2 SAGE はなに?...............................................................................................11
2.3 WEB サービスとして SAGE を利用................................................................132.3.1 WEB サービスとして SAGE を利用 手法その１........................................14
2.4 SAGE のセルにソースコードを入力.................................................................17
3 SAGE でプログラムをする上での基礎.............................................................21
3.1 対象、変数、そして式....................................................................................21
3.2 演算子...........................................................................................................22
3.3 演算子の優先度..............................................................................................23
3.4 式で演算の順番を変更する事...........................................................................24
3.5 変数..............................................................................................................25
3.6 文.................................................................................................................26
3.6.1 print 文.....................................................................................................26
3.7 文字列(string)...............................................................................................28
3.8 注釈(comment)............................................................................................28
3.9 条件演算子....................................................................................................29
3.10 if 文による判断............................................................................................32
3.11 論理演算子 and,or,not.................................................................................34
3.12 while 文による反復処理................................................................................35
3.13 長い反復処理, 無限反復処理, そして処理の中断...............................................38
3.14 ワークシートのセルの挿入と削除...................................................................39
3.15 より高度な対象の型について.........................................................................39
3.15.1 有理数..................................................................................................39
3.15.2 実数.....................................................................................................40
3.15.3 他の対象の列を包含する対象: リストとタプル..........................................41
3.15.3.1 多変数の取りまとめと取り崩し............................................................42
3.16 リストとタプルを使った while 反復処理の利用...............................................43
3.17 in 演算子.....................................................................................................44
3.18 for 文を使った反復処理................................................................................44
3.19 函数............................................................................................................45
3.20 def 文を用いた函数の定義.............................................................................45
3.21 SAGE 内部の函数の一部...............................................................................47
3.22 SAGE 函数の情報を得る...............................................................................55

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

3/158

3.23 利用者が入力した函数についても情報が使える................................................56
3.24 SAGE に含まれる函数を用いた例..................................................................56
3.25 for 文で srange()と zip()を利用....................................................................58
3.26 リスト内包(list comprehension).................................................................59
4 オブジェクト指向プログラミング....................................................................61
4.1 オブジェクト指向な心の書換...........................................................................61
4.2 属性と振舞....................................................................................................61
4.3 類 (対象を生成する為の設計図）......................................................................62
4.4 オブジェクト指向プログラムは必要に応じて対象の生成と破壊を行う..................62
4.5 オブジェクト指向プログラム例........................................................................63
4.5.1 Hellos オブジェクト指向プログラム例 (無注釈).........................................64
4.5.2 Hellos オブジェクト指向プログラム例 (注釈付き)..........................................65
4.6 SAGE 類(Class)と対象(Object)......................................................................68
4.7 SAGE の対象について情報を得ること..............................................................69
4.8 対象のメソッドのリスト.................................................................................71
4.9 継承による類の拡張........................................................................................72
4.10 対象類、dir() 函数、組込メソッド.................................................................73
4.11 Sage.rings.integer.Integer 類の継承階層....................................................75
4.12 "は一つの"関係............................................................................................76
4.13 こんがらがったかな?....................................................................................76
5 いろいろなこと..........................................................................................77
5.1 前回の処理結果の参照....................................................................................77
5.2 例外処理.......................................................................................................77
5.3 数値結果を得る..............................................................................................78
5.4 式の表記指南.................................................................................................79
5.5 組込定数.......................................................................................................80
5.6 根.................................................................................................................81
5.7 記号変数.......................................................................................................81
5.8 記号変数.......................................................................................................83
5.9 展開と因子分解..........................................................................................84
5.10 いろいろな記号式の例...............................................................................84
5.11 記号式への値の引き渡し............................................................................85
5.12 記号方程式と solve()函数.............................................................................85
5.13 記号数学函数...............................................................................................86
5.14 グラフを使った根の検出と find_root()メソッドを利用した数値的な根の検出.....88
5.15 伝統的な書式で数学対象を表示......................................................................89
5.15.1 伝統的な数式で対象を表示する為に LaTeX を利用....................................89
5.16 集合............................................................................................................90
6 2D 描画...................................................................................................91
6.1 plot()と show()函数.......................................................................................91
6.1.1 描画の結合と描画の色の変更....................................................................93

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

4/158

6.1.2 グラフィックス対象とグラフィックスの結合..............................................94
6.2 matplotlib による進んだ描画..........................................................................96
6.2.1 網目と軸のラベルを持ったリストデータの描画...........................................96
6.2.2 対数目盛の Y 軸を持った描画....................................................................97
6.2.3 描画の中にラベル付きの二つのグラフ........................................................98
7 SAGE の書式..........................................................................................100
7.1 スピード書式...............................................................................................100
7.2 オープンオフィスプレゼン書式......................................................................100
8 高校数学の問題 (大半がまだ著作中)..............................................................101
8.1 Pre-Algebra...............................................................................................101
8.1.1 方程式..................................................................................................101
8.1.2 式........................................................................................................101
8.1.3 幾何学..................................................................................................101
8.1.4 不等式..................................................................................................101
8.1.5 線形函数...............................................................................................101
8.1.6 Measurement.....................................................................................101
8.1.7 非線形方程式........................................................................................102
8.1.8 Number Sense And Operations..........................................................102
8.1.8.1 分数の約分.....................................................................................102
8.1.9 多項式函数...........................................................................................103
8.2 代数............................................................................................................103
8.2.1 絶対値函数...........................................................................................103
8.2.2 複素数..................................................................................................103
8.2.3 合成函数...............................................................................................104
8.2.4 Conics.................................................................................................104
8.2.5 データ解析............................................................................................104
9 離散数学：初等的数とグラフ理論 .................................................................104
9.1.1 方程式..................................................................................................104
9.1.1.1 記号分数の約分..............................................................................104
9.1.1.2 二つの記号分数の積を計算...............................................................106
9.1.1.3 x について線型方程式を解く............................................................107
9.1.1.4 分数を持つ線型方程式の解法............................................................1089.1.2 指数函数...............................................................................................110
9.1.3 冪........................................................................................................110
9.1.4 式........................................................................................................110
9.1.5 不等式..................................................................................................110
9.1.6 逆函数..................................................................................................110
9.1.7 線型方程式と函数..................................................................................111
9.1.8 線型プログラミング...............................................................................111
9.1.9 対数函数...............................................................................................111
9.1.10 兵站函数.............................................................................................111
9.1.11 行列...................................................................................................111
9.1.12 Parametric Equations.......................................................................111
9.1.13 区分函数.............................................................................................111

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

5/158

9.1.14 多項式函数.........................................................................................112
9.1.15 冪級数函数.........................................................................................112
9.1.16 Quadratic Functions........................................................................112
9.1.17 Radical Functions............................................................................112
9.1.18 有理函数.............................................................................................112
9.1.19 列......................................................................................................112
9.1.20 級数...................................................................................................112
9.1.21 方程式系.............................................................................................113
9.1.22 変換...................................................................................................113
9.1.23 三角函数.............................................................................................113
9.2 Precalculus And Trigonometry.................................................................113
9.2.1 二項定理...............................................................................................113
9.2.2 複素数..................................................................................................113
9.2.3 合成函数...............................................................................................113
9.2.4 Conics.................................................................................................114
9.2.5 データ解析............................................................................................114
10 離散数学: Elementary Number とグラフ理論............................................114
10.1.1 方程式................................................................................................114
10.1.2 指数函数.............................................................................................114
10.1.3 逆函数................................................................................................114
10.1.4 対数函数.............................................................................................114
10.1.5 兵站函数.............................................................................................114
10.1.6 行列と行列代数...................................................................................115
10.1.7 数学的解析..........................................................................................115
10.1.8 Parametric Equations.......................................................................115
10.1.9 区分函数.............................................................................................115
10.1.10 Polar Equations..............................................................................115
10.1.11 多項式函数.......................................................................................115
10.1.12 冪関数..............................................................................................115
10.1.13 多項式函数.......................................................................................116
10.1.14 Radical Functions..........................................................................116
10.1.15 有理函数...........................................................................................116
10.1.16 実数.................................................................................................116
10.1.17 列....................................................................................................116
10.1.18 級数.................................................................................................116
10.1.19 集合.................................................................................................116
10.1.20 方程式系...........................................................................................117
10.1.21 変換.................................................................................................117
10.1.22 三角函数...........................................................................................117
10.1.23 ベクトル...........................................................................................117
10.2 解析..........................................................................................................117
10.2.1 微分...................................................................................................117
10.2.2 積分...................................................................................................117
10.2.3 極限...................................................................................................117
10.2.4 多項式近似と級数................................................................................118

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

6/158

10.3 統計..........................................................................................................118
10.3.1 データ解析..........................................................................................118
10.3.2 Inferential Statistics.........................................................................118
10.3.3 標準分布.............................................................................................118
10.3.4 １変数解析..........................................................................................118
10.3.5 確率と試行..........................................................................................118
10.3.6 ２変数解析..........................................................................................119
11 高校生の科学の問題.................................................................................120
11.1 物理学.......................................................................................................120
11.1.1 原子物理.............................................................................................120
11.1.2 円運動................................................................................................120
11.1.3 力学...................................................................................................120
11.1.4 電磁界................................................................................................120
11.1.5 流体...................................................................................................120
11.1.6 運動学................................................................................................121
11.1.7 光......................................................................................................121
11.1.8 光学...................................................................................................121
11.1.9 相対性理論..........................................................................................121
11.1.10 回転運動...........................................................................................121
11.1.11 音響.................................................................................................121
11.1.12 波....................................................................................................121
11.1.13 熱力学..............................................................................................121
11.1.14 仕事.................................................................................................122
11.1.15 エネルギー........................................................................................122
11.1.16 モーメント........................................................................................122
11.1.17 Boiling............................................................................................122
11.1.18 浮力.................................................................................................122
11.1.19 Convection.....................................................................................122
11.1.20 密度.................................................................................................122
11.1.21 Diffusion.........................................................................................123
11.1.22 Freezing.........................................................................................123
11.1.23 摩擦.................................................................................................123
11.1.24 熱伝導..............................................................................................123
11.1.25 Insulation.......................................................................................123
11.1.26 Newton の法則.................................................................................123
11.1.27 圧力.................................................................................................123
11.1.28 プーリー...........................................................................................124
12 計算の基礎............................................................................................125
12.1 計算機ってなあに.......................................................................................125
12.2 記号(symbol)って何?.................................................................................125
12.3 記号としてビットの並びを使う計算機..........................................................126
12.4 文脈的意味................................................................................................130
12.5 変項..........................................................................................................130

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

7/158

12.6 モデル.......................................................................................................131
12.7 機械語.......................................................................................................133
12.8 コンパイラとインタプリタ..........................................................................136
12.9 アルゴリズム.............................................................................................137
12.1 計算..........................................................................................................139
12.2 アルゴリズムの記録に図式が使える..............................................................141
12.3 1 から１０までの数の総和を計算.............................................................141
12.4 数学計算系の数学の部分.............................................................................143
13 SAGE サーバーの立ち上げ.......................................................................144
13.1 インターネットに基づく技術への入門.......................................................144
13.1.1 複数の計算機はどの様にして互いに通信するの?.....................................144
13.1.2 TCP/IP プロトコルについて.................................................................145
13.1.3 クライアントとサーバー.......................................................................147
13.1.4 DHCP...............................................................................................147
13.1.5 DNS..................................................................................................148
13.1.6 プロセスとポート................................................................................149
13.1.7 良く知られたポート, 登録されたポートと動的ポート,..............................153
13.1.7.1 著名なポート (0 - 1023)...............................................................154
13.1.7.2 登録されたポート (1024 - 49151).................................................156
13.1.7.3 動的/個人ポート (49152 - 65535).................................................156
13.1.8 SSH (Secure SHell) サービス............................................................156
13.1.9 ネットワーク上の計算機間のファイルを複写する為の scp の利用について.157
13.2 SAGE の構成 (まだ)...................................................................................157
13.3 Linux に基づく SAGE 版............................................................................159
13.4 SAGE の VMware 仮想計算機版(大半の Windows 利用者向け)......................159

v1.23 - 02/17/08

2

1 はじめに3

1.1

はじめての SAGE（SAGE For Newbies)）

献辞

4

この本は Steve Yegge と彼の blog”Math Every Day(数学徒然）”に捧げます5( http://steve.yegge.googlepages.com/math-every-day).

6

1.1 ご了承

78

次の方々からは、この本についての意見を頂きました（もし、このリストの中に貴方の名前が抜け落ちていたら、どうか私宛（ted.kosan at gmail.com)に電子メイルを下さい:

9

Dave Dobbs

10

David Joyner

11

Greg Landweber

12

Jeremy Pedersen

13

William Stein

14

Steve Vonn

15

Joe Wetherell

16

8/158

1.2 支援団体

17

この本の面倒を見ているのは sage-support で、次で対処出来ます:18
19

http://groups.google.com/group/sage-support .
必ず表題に "[Newbies book]" と入れて下さい。

このグループに電子メイルを送る時には

v1.23 - 02/17/08

20
21
22
23
24
25
26

はじめての SAGE（SAGE For Newbies)）

9/158

2 はじめにSAGE は記号代数と数値計算の為のオープンソースの数学計算環境(MCE)です。数学計算環境は複雑なので、それに習熟する為に莫大な時間と労力を必要とします。ひとつの数学計算環
境を使えるようにする為に費やされるこの莫大な労力は、それを学ぶ為に必要となる労力に値します。 初心者が SAGE 使いの専門家になるには時間が暫く掛かりますが、幸運な事に、問題を解く為に SAGE の専門家になる必要はありません。

2.1 数学計算環境とはなに ?

27
28
29

数学計算環境は幅広い数学計算アルゴリズムを自動処理する事の出来る計算プログラムの集合です。計算アルゴリズムは数学の殆ど全ての領域に存在し、そして、新しいアルゴリズム
は日々発展し続けています。

30
31

１９６０年代より、膨大な数の数学計算機環境が生成され、そして、次野リストには最も人気のある物が含まれています：

32

http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems

33
34
35
36

幾つかの環境は高度に特殊化している一方で、ある物は汎用のものです。幾つかのものは伝統的な書式（これは数学の教科書で見られるものです）を表示したり、入力出来たり、ある物は伝統的な数式を表示出来ても、入力はテキストでなければならなかったり、それから、幾つかは数式出力も入力もテキストだけが可能であったりします。

37
38

伝統的な数式とテキスト書式の違いの例として、ここでは伝統的な書式の式を挙げておきま
す：39

それから、テキスト書式で同じ数式を示しておきましょう：

40

A == x^2 + 4*h*x41

殆どの数学計算環境はある種の数学向け高水準プログラム言語を保有しています。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

10/158424344

これによって、その環境が有する数学のアルゴリズムをプログラムで利用出来る様になります。幾つかのこれらの数学向けプログラム言語は、既存のプログラム言語の周囲で構築され、それらが動作する特殊な環境向けに構築されています。

45
46
47

ある数学計算環境は商用で購入しなければなりませんが、その他のものはオープンソースなの自由に利用出来ます。双方の環境は似た核となる機能を持っていますが、他の領域では通常異なっています。

48
49
50
51
52
53

商用の環境はオープンソース環境よりもより洗練されており、それらは往々にして GUI を持
ち、数式を伝統的な書式で入力したり操作する事が比較的容易になっています。その一方で商用環境は欠点も持っています。一つの欠点はソフトウエアを保持する会社が撤退する機会が常に付き纏い、それによって環境を将来利用出来なくなる恐れがある事です。別の欠点は
商用環境を拡張する事が出来ない事で、その環境のソースコードが利用者が利用出来る様になっていないからです。

54
55
56

オープンソースの数学計算環境は通常 GUI を持っていませんが、それらのユーザーインター
フェイスは汎用性があり、その環境のソースコードを望む人に対しては何時でも使えます。
これは人が興味を持てば使える環境で、望むままに拡張も出来る事を意味するのです。

57

2.2 SAGE はなに ?

58
59
60
61
62

SAGE はオープンソースの数学計算環境で、数式をテキスト形式で入力し、テキスト形式、あるいは伝統的な書式で表示するものです。大半の数学計算環境が自分自身を包含するものですが、SAGE は他の数学計算環境を包含する事で、それ自体があるアルゴリズムを提供する傘の様な手法を取っています。この戦略によって SAGE は簡単に将来の需要を取り込む事が容易な構造で、複数の数学計算環境の力を提供する事が出きるのです。

63
64
65
66
67

SAGE は強力でとても人気のある Python プログラム言語で記述されており、SAGE の利用者が扱える数学指向のプログラム言語は Python の拡張です。これは SAGE の熟練利用者は Python
プログラムの熟練者でなければならないことを意味します。Python プログラム言語の知識がまさに SAGE を上手に使いこなせるかどうかの指標となり、その SAGE の熟練度を決定する手助けとなる利用者の Python の知識もあります（表 1 参照)。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）水準

11/158

知識

SAGE 習熟者

Python も SAGE もよく分かっている

SAGE 知見者

Python は知っているけど、SAGE だけを少々かじった程度

SAGE 新米Python を知らないいけど、最低一つのプログラム言語を挙げる事が出来るプログラム作成新
米

計算機がどのように動作するか知らないし、一度もプログラムを組んだ事が無い

表 1: SAGE 利用者の経験水準
68
69
70
71
72
73

この本は SGAGE 新米の為のものです。読者は最低でも一つのプログラム言語が挙げられるものの Python でのプログラム経験は皆無だと仮定しています(もし、貴方が計算機のプログラ
ムがどの様に動作するのかを再確認しておく必要があれば、この本の計算の基礎 の節を通読すると良いでしょう。) この本は SAGE を使って問題を解くために十分な Python の事を教示します。貴方が SAGE 知見者となる為の手助けをしますが、SAGE 熟練者になる前に、この本に関連する本から Python を学ばなければなりません。

74
75
76
77
78
79

もし、貴方がプログラムの初心者であれば、この本はおそらく貴方に取っては余りにも上級過ぎるかもしれません。私は The Professor and Pat Programming
Series(http://professorandpat.org) という無料本を書いており、それらはプログラム初心者向けになっています。もし、貴方がプログラム初心者であって、SAGE を使って学ぶ事に興味があるのなら、The Professor and Pat Programming 本から進める事を第一にすべきで、それらを済ませてから、この本に戻ってくるべきです。

80
81

SAGE のウエブサイト (sagemath.org) には他の SAGE の情報源に従った SAGE の沢山の情報があります。

v1.23 - 02/17/08

82
83
84
85
86

2.3

12/158

はじめての SAGE（SAGE For Newbies)）

WEB サービスとして SAGE を利用

SAGE はその構造上可能な限り、色々な方法に柔軟に対処可能です。SAGE の超新米さんはWEB ブラウザから WEB サービスとして SAGE を使うことになるでしょう。SAGE の任意の複製は
この WEB サービスが行えるように設定されています。 図 2.1 に三つの SAGE の WEB サービスの手法を示しておきましょう:

BrowserBrowser
手法 その 1:
Sage web サービスは
インターネットで利用 可能

Sage
Serverインター
ネット

BrowserBrowserBrowserBrowser

手法その 2:
Sage web サービスは
LAN で利用可能

Network
SwitchBrowserBrowser

手法その 3:
Sage web サービスはブラ ウザが動作している計算 機上で利用 可能

Browser

パソコン rSage
Server
図 2.1: 三通りの Web サービスによるセッション

Sage
Serverv1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

2.3.1 WEB サービスとして SAGE を利用

13/158

手法その１

87
88

SAGE は現在 Firefox ウエブブラウザが動作に最適なので、もしも、貴方の計算機に Firefox
を入れていなければ、 http://mozilla.com/firefox.で入手しておきましょう。

89
90
91
92
93
94

SAGE 開発チームは公開 SAGE ウエブサービスを(http://sagenb.com) で提供しており、このサービスは SAGE のホームペイジのトップからも利用出来ます。この公開 SAGE ウエブサービ
ス向けのアカウントを取得する為には登録が必要なので、手順をここで解説しておきましょう。

95

http://sagenb.com

96

すると Welcome ペイジが表示されます（ 図 2.2 を参照してください)

Firefox ブラウザのウィンドウを開いて、下記を URL バーに書き込みます:

図 2.2: SAGE Welcome screen.
97

SAGE ウエブサービスは SAGE ノート（Notebook）と呼ばれています。何故かというと、数学

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

14/15898
99
100

者が数学の計算を実行する為に伝統的に用いているノートを模擬しているからです。ノートが使えるようになる前に、貴方はノートのアカウントの為に最初に登録をしなければなりま
せん。

101
102

Sign up for a new SAGE Notebook account リンクを選択すると登録ペイジが表示されます( 図 2.3 を参照して下さい)

図 2.3: Signup page.
103
104
105
106
107
108
109

利用者名（Username)とパスワード(Password)を Username と Password の入力欄に入れ、それから Register Now ボタンを押します. すると、別のペイジが表示され、そこには登録情報が受け取られた事と、承認メッセージが貴方が指定した電子メイルアドレスに送られた事が書かれています。

110
111

貴方のノートのアカウントでログインが成功すると、 worksheet management ペイジが現れます ( 図 2.4 を参照して下さい)

このメイルを開いて、その中に有るリンクを開きます。これで登録は完了し、いよいよ、貴方はノートの Welcome ペイジに戻って、ログインが出来ます。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

15/158

図 2.4: Worksheet management ペイジ
112
113
114
115

物理的な数学ノートはワークシートを含んでいるので、SAGE の仮想ノートもワークシートを持っています。ワークシート管理ペイジはワークシートの生成、削除、インターネット上で印刷等の事が出来ます。これは新規に生成されたノートなので、未だ何もワークシートがあ
りません。

116
117
118
119
120

New Worksheet リンクを選択すると新しいワークシートを生成します。ワークシートは伝統的な書式で数式を表示する為の特別な数学フォント、或いはこれらのフォントの画像が使えます。もし、貴方が作業している計算樹に数学フォントが入っていなければ、ワークシー
トは代わりに組込みの画像フォントを用いる様に指示するメッセージが表示されます ( 図2.5 参照)図 2.5: jsMath と TeXfonts が無い事の警告
121
122
123

画像フォンとは通常の数学フォントとしてはあまり明瞭ではありませんが、殆どの事には使えます。
望めば、あとで数学フォントを貴方の計算機に入れられますが、ここでは取り敢えず Hidev1.23 - 02/17/08
124
125

はじめての SAGE（SAGE For Newbies)）

16/158this Message ボタンを押します。すると、真っ新のワークシートを含むペイジが現れます( 図 2.6 参照)

ワークシートセル

図 2.6: まっさらのワークシート
126
127
128
129
130

ワークシートは１つ、或いはそれ以上のセル(cell)を含みます。ここでセルは SAGE によって実行されるソースコードに用います。セルは図６に示す様に長方形で、その中に沢山書込んでゆくにしたがって大きくなります。ワークシートが最初に生成された時には最初のセルは
そのワークシートの上端にあり、これが貴方が通常式を書き込む場所になります。

2.4 SAGE のセルにソースコードを入力

131
132
133
134

早速、SAGE を簡単な計算樹として使って試してみましょう。貴方のマウスカーソルを貴方のワークシートの上端にあるセルの中に置いて下さい。カーソルが自動的に新しいセルの左端に置かれた事に注意して下さい。貴方は SAGE のソースコードの新しい行をセルの左端から改行を入れずに開始しなければなりません（貴方が他の事をするように指図されるまでは）。

135

次の式を入力しますが、Enter キーは押さないで:

136

2 + 3

137

貴方のワークシートは 図 2.7 の様になっている筈です.

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

17/158

図 2.7: セルに式を入力
138
139
140

この時点で貴方には二つの選択肢があります。Enter キー<enter>を押すか、Shift キーを押しながら Enter キー<shift><enter>を押すかの何れかです。単純に Enter キーを押せば、セルは展開されてカーソルは次の行に移動して、ソースコードの入力が続けられます。

141
142
143
144
145

Shift と Enter を押すとワークシートはセルに入力されたすべてのソースコードを取り込んでネットワークを通じて SAGE サーバーにそのコードを処理出来る様に送り付けます。SAGEに処理すべきソースコードが与えられると最初に SAGE 前処理機と呼ばれるソフトウエアを用いた処理になります。この前処理機では SAGE ソースコードを Python ソースコードに変換
して SAGE を構築した Python 環境を用いて処理出来る様にします。

146
147
148

変換されたソースコードは Python 環境を通過しますが、そこで、Python バイトコードと呼ばれる特殊な書式の機械言語に翻訳されます。このバイトコードはハードウエア CPU を模擬するプログラムで処理されますが、このプログラムの事を Python 翻訳機と呼びます。

149
150
151

サーバがそのコードを効率良く処理出来る事もあれば、時間が掛かる事もあります。そのコードがサーバーで実行されている間、件のワークシートは小さな緑の縦棒を図 2.8.に示す
様にセルの下側、ウィンドウの左端に表示します。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

18/158緑の縦棒 は SAGE サーバが上のセルで<shft><enter> を押すことで 投入した
コードを現在 処理中で ある事を指し示しています 。

図 2.8: セルの式を処理中
152
153
154

サーバーがソースコードの処理を終えると緑の棒が消えます。もし、表示可能な結果が生成されていれば、この結果は件のワークシートに返送され、ワークシートはその結果を式を投入したセルの真下の領域に表示します。

155
156

ここで shift と enter を貴方のセルで押して、ちょっと待てば 図 2.9 に示すような結果が得られます。

図 2.9: 処理結果の表示

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

19/158157
158

ノートの下のセルから処理させるためにコードを投入すると、そのコードの処理をサーバーが終えると自動的にこのセルの下に真っ新のセルが付加されます。

159

そこで、 図 2.10 の 2 番目のセルにあるソースコードを入力して処理しましょう。

図 2.10: もっと複雑な処理

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

160

3 SAGE でプログラムをする上での基礎

161

3.1 対象、変数、そして式

20/158162

ソースコード行

163

2 + 3

164

と

165

5 + 6*21/18 - 2^3

166の双方を式(expression)と呼び、次を何が式であるかの定義とします:

167
168
169
170
171

プログラム言語での式(expression)とは、値、変数、演算子、函数の組合せであり、既存の特定の規則や、それらを計算したり別の値で置き換える特定のプログラム言語の介在で解釈（評価）されるものです。式を評価するとはその値の事を指します。数学で式はそれ自体の評価された値です（あるいは持つと言っても良いでしょう）;式はその値の表現です。
(http://en.wikipedia.org/wiki/Expression_(programming))

172
173
174
175
176

計算機では、値（value)は一つ、或いはそれ以上のメモリでのビットの並びで、与えられた文脈(context)を使って解釈される時の何者かを意味します。SAGE では意味を持ったメモ
リでのビットの並びを対象(object)と呼びます。SAGE 自体は対象で構成されており、そのSAGE プログラムが生成する与件もまた対象として表現されます。対象は第 4 章 でより詳細に解説します。

177
178
179
180
181
182
183

上の式で,2, 3, 5, 6, 21,と 18 は対象で、sage.rings.integer.Integer 文脈と呼ばれる文脈を用いて解釈されます。文脈は 型(type)と呼ばれる対象に関連付けられ、型
sage.rings.integer.Integer は整数(integer)の表現で用いられる型の対象です。SAGE にはtype()と呼ばれる命令があり、これは引数として与えた任意の対象の型を返します。type()
命令を使って、対象 3 と 21 の型が何であるか、次のコードを実行させてみましょう:(註:この点からソースコードはセルに入れるべきで、さらに表示されるべき任意の結果は GUI を使
わないものにすべきです。）

184
185
186

type(3)|<type 'sage.rings.integer.Integer'>v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

21/158

187
188
189

type(21)|<type 'sage.rings.integer.Integer'>

190
191

対象の型の情報がなにであるかを type()に尋ねる方法は、'type'の右側の括弧の中にその対象を置くことです。

192

3.2 演算子

193
194
195
196
197

上の式の文字+,-,*,/,^は演算子と呼ばれ、それらの目的は SAGE に式中の対象に対して実行すべき操作が何であるかを伝える事です。例えば、式 2+3 では和の演算子+は SAGE に
整数 2 と 3 の和を計算し、その結果を返却すべき事を伝えています。ここで対象 2 と 3 はsage.ring.integer.Integer 型なので、それらの和から得られた結果は共にsage.rings.integer.Integer 型の対象になります。

198
199
200

差の演算子は-で、積の演算子は*,/は商の演算子で、%は剰余の演算子、そして、^は冪の演算子です。SAGE はこれらに加え、他にも沢山の演算子を持っており、それらに関する詳細な情報は Python の文書で見つけることが可能です。

201

次の例では、-,*,/,%と^演算子が用いられています:

202
203
204

5 - 2
|
3

205
206
207

3*4
|

208
209
210

30/3
|
10

211
212
213

8%5
|

214
215
216

2^3
|

217

文字-は負の数を示す為にも用いられます:

12

3

8

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

218
219
220

-3
|

221

負の数の差は正数になります:

222
223
224

- -3
|
3

22/158-3

3.3 演算子の優先度

225
226
227
228
229

式が一つ以上の演算子を含む場合、SAGE は演算子の優先度と呼ばれる規則の集合を用いて、その式の対象に作用させる演算子の順位を定めます。演算子はまた演算子の順位も参照
します。より高い優先度の演算子は優先度の低い演算子よりも先に評価されます。次の表では SAGE の優先度の規則の一部を示し、高い優先度の演算子が表の上に来る様にしています:230^

指数は右から左に評価されます。

231

*,%,/

積、剰余、そして商演算子については左から右に評価されます。T

232

+, −

最後に、和と差は左から右に評価されます。

233
234

沢山の演算子を含む式を手早く扱える様に、これらの優先度の規則を実際に人力で試してみましょう。ここで、ソースコードの式は:

235

5 + 6*21/18 - 2^3236

すると、伝統的な書式はこうなります:237

この優先度規則に従うと、これが式の演算子を SAGE が評価する際の順番になります:

238
239
240
241
242
243

5 + 6*21/18 - 2^3
5 + 6*21/18 - 8
5 + 126/18 - 8
5 + 7 - 8
12 - 84

v1.23 - 02/17/08
244
245
246

はじめての SAGE（SAGE For Newbies)）

23/158最初の式から始めると SAGE はその下の式の８を結果とする^演算子を最初に評価します。
2 番目の式では*演算子が次に実行され、以降、順番に実行されて、最後の式は全ての演算子が評価された後の最後の結果として 4 を示しています。

3.4 式で演算の順番を変更する事

247
248
249
250

式に含まれる演算子の順序は括弧の中に式の一部を纏める事で変更する事が可能です。括弧の中に式を入れる事で他の演算子が評価されるよりも、その式が強制的に評価されます。例
えば、式 2+4*5 は通常の優先度規則を用いて評価すると 22 になります:

251
252
253

2 + 4*5
|
22

254
255

もし、4+5 の回りに括弧を置くと、積の前に強制的に和の評価が行われるので結果は 30 にな
ります:

256
257
258

(2 + 4)*5
|
30

259

括弧は入れ子にする事が可能で、最も内側の括弧がその外側よりも先に評価されます:

260
261
262

((2 + 4)*3)*5
|
90

263
264

括弧は他の任意の演算子よりも先に評価されるので、これらを優先度表の一番上に置いてお
きます:

265

()

括弧はその内側から先に評価される。

266^

指数は右から左に評価される。

267

*,%,/

積、剰余、そして商演算子については左から右に評価されます。

268

+, −

最後に、和と差は左から右に評価されます。

v1.23 - 02/17/08
269

はじめての SAGE（SAGE For Newbies)）

24/1583.5 変数

270
271
272
273

変数は人間が数の代わりにメモリの中のビットの羅列記号が参照出来る様にメモリの番地に関連させられた名前です。SAGE で変数を生成する一つの方法は割当を通じて行う事で、この場合は記号'='の左側に貴方が生成したい変数の名前を置き、記号の右側に式を置きます。式が対象を返すと対象はその変数に割当てられています・274

次の例では、box という変数を生成し、数 7 をそれに割り当てます:

275
276

box = 7
|

277
278
279

以前の例とは異なり、結果がワークシートに帰っていない事に注意してください。何故なら、その結果は変数 box に置かれたからです。box の内容を見たければ真っ新のセルにその名前を入れてセルを評価します:

280
281
282

box
|

283
284
285
286
287
288

この例で見ることが出来る様にワークシート上の、とあるセルで生成された変数はワークシートの他のセルでも利用可能です。変数はワークシートが開かれている限り存在します
が、ワークシートを閉じると、その変数は失われます。ワークシートを再び開くと変数は割当が行われたセルを評価する事で再び生成する必要があります。変数はワークシートを閉じる前に保存する事も可能で、ワークシートを再び開いた時に読込む事も可能ですが、これは後で解説するより上級の項目になります。

289
290
291
292
293

SAGE 変数は大文字と小文字を区別します。これは二つ、あるいはそれ以上の変数名が同じ変数かそうでないかどうかを決定する時に、SAGE が変数名に現れる個々の文字を調べ上げる事を意味します。例えば、変数名 Box と変数名 box は同じ変数ではありません。何故なら、最初の変数名は大文字'B'で始まっていますが、二番目の変数名は小文字の'b'で開始している
からです。

294

プログラムは 1 変数以上持つ事が可能です。ここでは 3 変数のより洗練した例を示します:

295
296

a = 2
|

297
298

b = 3
|

7

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

25/158

299
300
301

a + b
|
5

302
303

answer = a + b
|

304
305
306

answer
|
5

307
308

記号'=’の式の右側にある部分は常に最初に評価され、その結果は等号記号の左側の変数に割り当てられます。

309

変数を type()命令に通すと、変数に割り当てられた対象の型が返されます:

310
311
312
313

a = 4
type(a)|<type 'sage.rings.integer.Integer'>314

与件型と type 命令は後でその詳細を解説します。

315
316
317
318
319

3.6 文
文はアルゴリズム(algorithm)の記述で用いられるプログラム言語の一部分です。式とは違って、文は対象を返却せず、それらが作り出せる様々な効果の為に用いられます。文は式と個々の文を含み、プログラムは文の列を用いて構成されます。

3.6.1 print 文

320
321

セルの一つ以上の式が表示可能な結果を生成すると、セルは頭の式からだけ結果を表示します。例えば、このプログラムは 3 変数を生成し、これらの変数の内容を表示しようとします:

322
323
324
325
326
327
328
329

a = 1
b = 2
c = 3
a
b
c
|
3

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

26/158

330
331
332
333
334

SAGE では、プログラムは一度にその一行を処理し、その際にコードの一番上の行の処理を開始し、そして、そこから下側の処理を行います。この例では、a = 1 の行が最初に実行されると b = 2 の行が実行され等々となります。しかしながら、全ての 3 変数に何が割当てられているかを見たくても、最後の変数に割当てられた物だけが表示される事に注意してくださ
い。

335
336
337

SAGE は print と呼ばれる文を持ち、それはセルに置かれた式であれば、その結果を表示する事を許容するものです。この例は前の例と一つの例外を除いて同様です。つまり、print 文
は全ての 3 変数を表示する為に用いられている点です:

338
339
340
341
342
343
344
345
346
347

a = 1
b = 2
c = 3
print aprint bprint c
|
1
2
3

348
349

print 文は、式と式の間にコンマが置かれたものが引き渡されると、同じ行に複数の結果を表示します:

350
351
352
353
354
355

a = 1
b = 2
c = 3*6
print a,b,c|
1 2 18

356
357
358

コンマは print 文に引き渡される変数や対象の後ろに置かれると、print 文に表示を終えた
あとも次の行にカーソルを落とさない事を指示します。それ故に、print 文が実行されたあとには、その前の print 文の出力と同じ行にその出力が置かれます。

359

一つのセルから複数の結果を表示させる別の方法はセミコロン';'を使うことです。SAGE で

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

27/158

360
361
362

はセミコロンは文の末尾にオプションの行の末尾を示す文字として置く事が出来ますが、大半は同じ行に複数の文を置く為だけに用いられています。次の例ではセミコロンは変数 a,bと c を一行で初期化する為に用いられていることを示すものです:

363
364
365
366

a=1;b=2;c=3
print a,b,c
|
1 2 3

367
368

次の例は、セミコロンがセルからの複数の結果を出力する為にも、どのように用いられているかを示すものです:

369
370
371
372
373
374
375
376

a = 1
b = 2
c = 3*6
a;b;c
|
1
2
18

377

3.7 文字列 (string)

378
379
380
381
382

文字列(string)は文字に基づく情報を保つ為に用いる対象の型です。文字列の対象を生成する為に使われる典型的な式は二重引用符或いは単引用符で囲まれた文書で出来ています。文字列は丁度数の様に変数を用いて参照することが可能で、print 文を使って文字列を表示する事も出来ます。次の例では文字列対象を変数'a'に割り当て、文字列対象を'a'を参照する事で表示し、それから、その型も表示させています。

383
384
385
386
387
388

a = "Hello, I am a string."
print atype(a)|Hello, I am a string.
<type 'str'>

389
390
391
392

3.8 注釈 (comment)
ソースコードは往々にして理解し難いもので、それ故に、全てのプログラム言語ではコードの中に注釈を書込めます。注釈はその近くにあるコードが何を遂行する物であるかを説明する為に用いられ、ソースコードを眺めている人間が読むものと意味づけられています。注釈

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

28/158393

はプログラムが実行される時には無視されます。

394
395
396
397

SAGE でソースコードに注釈を入れる方法が二つあります。第一の方法は記号'#'を任意の文
書の左側に置いて、サーバーに注釈である事を意味付けておきます。記号'#'から行末尾迄の文書は注釈として扱われます。ここで、記号'#'を使った注釈を含むプログラムを示しておき
ます:

398
399
400
401
402

#これは注釈x = 2 #変数 x に２を割り当て
print x|
2403

このプログラムを実行すると、記号'#'で開始する文書は無視されます。

404
405
406

SAGE プログラムに注釈を入れる第二の方法は 3 個の引用符で注釈を囲む事です。このオプションは注釈が長過ぎて一行に収まらない時に便利です。このプログラムは 3 個の引用符を用いた注釈を示しています:

407
408
409
410

"""

411
412
413
414

x = 3
print x
|
3

415
416
417
418

これは長い注釈で一行よりも長いものに使います。
次のコードでは変数 x に３を割り当てて、x を印字します。

"""

3.9 条件演算子
条件演算子は二つの対象を比較する為に用いられる演算子です。条件演算子を含む式は論理値（boolean）対象を返し、論理値対象は True か False の何れか一つになります. 表 2 にSAGE で用いる条件演算子を示しておきます:v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

演算子

29/158概要

x == y二つの対象が同値であれば True を返し、それらが同値でなければ False を返します。==は比較を実行し、=の様な意味を持たないことに注意してください

x <> y対象が同値でなければ True を返し、同値であれば False 。

x != y

同値でなければ True を返し、同値ならば False 。

x < y

左側の対象が右側よりも小さければ True を返し、左側の対象が右側よりも小さ
くなければ False 。

x <= y左側の対象が右側の対象以下であれば True を返し、左側の対象が右側の対象以下
でなければ False 。

x > y

左側の対象が右側の対象よりも大であれば True を返し、左側の対象が右側の対象よりも大でなければ False。

x >= y左側の対象が右側の対象以上であれば True を返し、左側の対象が右側の対象以上でなければ False 。

表 2: 条件演算子
419
420
421
422
423
424

次の例では、 表 2 の各条件演算子が変数 x と y に置かれた対象の比較で用いられている様子を示すものです:

425
426
427
428
429
430
431
432
433
434
435
436
437
438
439

print x, "==", y, ":", x == yprint x, "<>", y, ":", x <> yprint x, "!=", y, ":", x != yprint x, "<", y, ":", x < yprint x, "<=", y, ":", x <= yprint x, ">", y, ":", x > yprint x, ">=", y, ":", x >= y|2 == 3 : False
2 <> 3 : True
2 != 3 : True
2 < 3 : True
2 <= 3 : True
2 > 3 : False
2 >= 3 : False

440# Example 2.

# Example 1.
x = 2
y = 3

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

441
442

x = 2
y = 2

443
444
445
446
447
448
449
450
451
452
453
454
455
456
457

print x, "==", y, ":", x == yprint x, "<>", y, ":", x <> yprint x, "!=", y, ":", x != yprint x, "<", y, ":", x < yprint x, "<=", y, ":", x <= yprint x, ">", y, ":", x > yprint x, ">=", y, ":", x >= y|2 == 2 : True
2 <> 2 : False
2 != 2 : False
2 < 2 : False
2 <= 2 : True
2 > 2 : False
2 >= 2 : True

458
459
460

# Example 3.
x = 3
y = 2

461
462
463
464
465
466
467
468
469
470
471
472
473
474
475

print x, "==", y, ":", x == yprint x, "<>", y, ":", x <> yprint x, "!=", y, ":", x != yprint x, "<", y, ":", x < yprint x, "<=", y, ":", x <= yprint x, ">", y, ":", x > yprint x, ">=", y, ":", x >= y|
3 == 2 : False
3 <> 2 : True
3 != 2 : True
3 < 2 : False
3 <= 2 : False
3 > 2 : True
3 >= 2 : True476

条件演算子は今迄解説してきた他の演算子と比較して低い優先度に置かれています:

477

()

括弧はその内側から先に評価される。

478^

指数は右から左に評価される。

30/158

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

479

*,%,/

積、剰余、そして商演算子については左から右に評価されます。

480

+, −

それから和と差は左から右に評価されます。

481==,<>,!=,<,<=,>,>=

482

31/158

最後に条件演算子が評価されます。

3.10 if 文による判断

483
484

全てのプログラム言語には判断を行う機能が提供されており、SAGE で最も一般的に用いられる判断を行う文として if 文があります。

485

If 文の単純化した構文は次のようになります:

486
487
488
489
490
491
492

if <式>:
<文>
<文>
<文>
.
.
.

493
494
495

if 文の動作は、その if のすぐ右に置かれた式を評価して、それから、返却された対象を調べます。ここで、この対象が"真”であれば if 文内部の文が実行されます。対象が"偽”であれば、if 文内部の文は実行されません。

496
497
498

SAGE では対象が非零、或いは非空であれば"真”で、零、あるいは空になれば"偽”となります。一つ、あるいはそれ以上の条件演算子を含む式は論理値(boolean)対象の True かFalse を返却します。

499
500
501
502
503
504

if 文内部に文を置く方法は、if 文の先頭部分の末尾にコロン':'を置いて、一つ、あるいはそれ以上の文をその下に置きます。if 文内側に置く文は、if 文の行に続けて、一つあるいはそれ以上の tab や space を使って、if 文の行の左側の先頭から字下(indent)をしていなけ
ればなりません。その上、全ての字下をされた文は同じ方法で、しかも、同じ分量だけ字下を行っていなければなりません。この様に字下げされた一つ、あるいはそれ以上の文はコードの一塊として参照されます。

505
506

次のプログラムでは if 文を変数 x に割り当てられた数値が５よりも大であるかどうかを決定させる為に用いています。 もし、x が 5 よりも大であれば、プログラムは"Greater”を表示

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

32/158507

し、それから"End of program”を表示します。

508

x = 6

509

print x > 5

510
511
512

if x > 5:
print xprint "Greater"

513
514
515
516
517
518

print "End of program"|
True
6Greater
End of program

519
520

このプログラムの x は６が割り当てられており、それ故に x > 5 は真となります。この式が表示された時、６が５よりも大なので論理値対象 True を表示します。

521
522
523

if 文で式を評価し、それが True の時、if 文はその内側の print 文を実行し、それから変数x に割り当てられた対象を文字列"Greater"の前に表示します。もし、追加の文が if 文の内側に置く必要があれば、その追加の文は print 文と同じ字下位置で、その下に追加します。

524
525

最後に、終に表示した文字列”End of program”は if 文が何をしようと無関係です。
ここで 6 の代わりに x が４を割り当てられていた場合は:

526

x = 4

527

print x > 5

528
529
530

if x > 5:
print xprint "Greater."

531
532
533
534

print "End of program."|
False
End of program.

535
536

ここで、式 x > 4 は対象 False を返し、これは if 文がその内側の文の実行を行わない原因となります。

v1.23 - 02/17/08
537

はじめての SAGE（SAGE For Newbies)）

33/158

3.11 論理演算子 and,or,not

538
539

二つ、あるいはそれ以上の式が全て真であるかどうかを検証したければ and 演算子を使いま
しょう：

540
541
542
543
544
545
546
547
548
549
550
551
552
553

a = 7
b = 9
print a < 5 and b < 10
print a > 5 and b > 10
print a < 5 and b > 10
print a > 5 and b < 10
if a > 5 and b < 10:
print "These expressions are both true."
|
False
False
False
True
These expressions are both true.

554
555

また一群の式のうち、少なくとも一つが真であるかどうかを決定したければ or 演算子を使いましょう：

556
557
558
559
560
561

a = 7
b = 9
print a < 5 or b < 10
print a > 5 or b > 10
print a > 5 or b < 10
print a < 5 or b > 10

562
563
564
565
566
567
568
569

if a < 5 or b < 10:
print "At least one of these expressions is true."
|
True
True
True
False
At least one of these expressions is true.

570
571

最後に、not 演算子で True の結果を False に、あるいは False の結果を True に変更することに使えます：

572
573
574

a = 7
print a > 5
print not a > 5

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

575
576
577

|

578

ブール演算子は他の演算子と比較してより低い優先度にしています：

579

()

括弧は中から外へと評価します。

580^

それから冪は右から左と評価します。

581

*,%,/

それから、積、剰余、商演算子が左から右へと評価されます。

582

+, −

そして、加法と減算が左から右へと評価されます。

583
584

==,<>,!=,<,<=,>,>=
それから条件演算子が評価されます。
not
ブール演算子が最後に評価されます。

585

and

586

or

587

34/158

True
False

3.12 while 文による反復処理

588
589

計算機を含め、多彩な機械は繰り返される一連の動作という原理から、それらの力の大半を導き出しています。

590
591

SAGE はプログラムに於ける反復処理を実装する為に、いくつかの手法を提供しますが、それらの手法は単刀直入のものからまどろっこしいものまであります。

592

単刀直入的な while 文から開始する事で、SAGE での反復処理の解説を始めましょう

593

While 文の構文指定は次のようなものです:

594
595
596
597
598

while <式>:
<文>
<文>
<文>
.

v1.23 - 02/17/08
599
600

はじめての SAGE（SAGE For Newbies)）

35/158

.
.

601
602
603
604
605
606

while 文は if 文に似ていますが、その頭の右側にある式が真である限り、その while 文が含む文を反復して実行する事が異なります。その式が False の値を持つ対象になると、 while
文は包含する文の実行を飛ばして while 文に続く文（存在していれば)の処理を継続して実
行します。

607

# 1 から１０までの整数を表示

608

x = 1

609
610
611
612
613
614
615
616
617
618
619
620
621
622

while x <= 10:
print xx = x + 1 #Increment x by 1.
|
1
2
3
4
5
6
7
8
9
10

623
624
625

このプログラムでは、 x という名前の一つの変数が生成されます。その変数は print 文にどの整数を印字すべきかを伝え、そしてまた while による反復処理を継続すべきかどうかを決定することにも用いられます。

626
627
628

プログラムが実行されると、１は x に入れられて、それから while 文に入ります。式 x<=10
は 1<=10 になって、１が１０以下なので論理対象が True を包含しているとその式を繰り返し
ます。

629
630

while 文はその式が真となる対象が返されるので、その文に含まれるすべての文を実行します。

631

print 文でその時点の x に含まれる値(それは１）を印字し、それから x=x+1 が実行されま次の例題は while を用いた１から１０までの整数を表示する反復処理です:#Initialize a counting variable to 1 outside of the loop.

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

36/158

632

す。

633
634
635

式 x=x+1 は多くのプログラミング言語で用いられる標準的な式です。この書式の式が評価される度に、変数が含む値に１を加えます。この式の x に与える効果は別途、x に 1 増分するとも言います。

636

この場合では、x は１を包含し、その式の評価の後には x は２を包含します。

637
638
639
640

while 文内部の最後の文が実行されると、while 文は while の左側にある式の再評価を行って、反復を継続するかどうかを決定します。この時点では x が２なので、その式は True を返すので、コード内部の while 文は再び実行されます。この反復処理は x が１１に達して、その式が False を返すまで実行されます。

641
642
643
644

このプログラムは別の結果が得られる様に調整する事ができます。 例えば、次のプログラ
ムは１から１００迄の整数を表示する様に while の右にある 10 を１００に書き換えたものです。そして、コンマを出力がウィンドウの右側に当たるまで同じ行に表示される様に print
文の後ろに置きます。

645# １から１００迄の整数を印字

646

x = 1

647
648
649
650
651
652
653
654
655

while x <= 100:print x,x = x + 1 #Increment x by 1.
|656

次のプログラムは増分を１から２に変更する事で１から９９迄の奇数を印字します:657#１から９９迄の奇数を印字

658

x = 1

659
660
661
662

while x <= 100:print x,x = x + 2 #Increment x by 2.
|

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
100

v1.23 - 02/17/08
663
664

はじめての SAGE（SAGE For Newbies)）

37/158

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51
53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99

665

最後に、このプログラムは 1 から１００迄の数を逆の順序で印字します:666# １から１００迄の整数を逆順で印字

667

x = 100

668
669
670
671
672
673
674
675
676

while x >= 1:
print x,x = x - 1 #Decrement x by 1.
|

677
678

この結果に達する為に、x の初期値を１００にするので、反復処理を継続する為に x が 1 以
上(x>=1)である事を検証し、１を加えるのではなく x から 1 を引く様にしています。

679

100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77
76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53
52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29
28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2
1

3.13 長い反復処理 , 無限反復処理 , そして処理の中断

680
681
682
683
684
685
686
687

膨大な時間を費やしたり、更には、無限の時間を費やす様な反復処理を行わせる事は、まっとうな事でも錯誤からであったも簡単な事です。無限反復処理を含むプログラムを実行してしまったとき、
SAGE にその実行を中断する事を伝えない限り処理が継続します。これはワークシートの左上側の Action メニューを選択して Interrupt メニュー項目を選択する事で行われます。長
く実行されている反復処理を持つプログラムはこの方法でも中断する事ができます。双方
で、緑の縦棒がプログラムが実行中である事を示しており、プログラムを中断すれば緑の棒が消えます。

688

このプログラムは無限反復処理を包含します:689#無限反復処理の例

690
691
692
693

x = 1
while x < 10:answer = x + 1|

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

38/158694
695

反復処理内部の x の包含する値が決して変化しないので、式 x<10 は常に True と判断されるので、反復処理が継続するのです。

696
697
698
699
700
701

このプログラムを実行し、ワークシートの Interrupt 命令を使って中断します。時にはワークシートが実行を止めるのに十分でない事があれば、Action->Restart worksheet を選択しましょう。
ワークシートを再起動する時には、全ての変数がその初期状態に戻されるので、それらの変数に値を指定したセルを再び実行する必要があるでしょう。

702

3.14 ワークシートのセルの挿入と削除

703
704
705

新しいワークシートのセルが必要になると、貴方のマウスカーソルをセルを挿入する上下の二つのセルの間に移動すると水平の青色の棒が現れます。この青い棒を押すと新しいセルがワークシートのその箇所に挿入されます。

706
707
708

もしもセルを削除したければ、セルのすべての文書を削除して、それを空にします。カーソ
ルを空のセルに置いたことを確認してからキーボードのバックスペースキーを押します。するとセルが削除されます。

709
710
711
712
713

3.15 より高度な対象の型について
この点について、我々は単に'sage.rings.integer.Integer'と'str'という対象の型しか扱っていません。しかし、SAGE は多様な目的に応じて使える莫大な数の数学的、或いは非数学的対象の型を保有します。次の節では、新たに二つの数学的対象と二つの非数学的対象を紹介
しましょう。

3.15.1 有理数
714
715
716

有理数は sage.rings.rational,Rational 型の対象に属します。次の例で、有理数 1/2の型を表示し、変数 x に 1/2 を割り当て、それから x が参照する対象の型を表示させていま
す:

717
718
719
720
721
722
723
724

print type(1/2)
x = 1/2
print xtype(x)|<type 'sage.rings.rational.Rational'>
1/2<type 'sage.rings.rational.Rational'>

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

39/158

725
726
727

次のプログラムは前のプログラムを実行した後に、そのワークシートの別のセルに入力したものです。二つの有理数同士の和とその結果を示すもので、結果も有理数で、変数 y に割り当てられています:

728
729
730
731
732
733

y = x + 3/4
print ytype(y)|5/4<type 'sage.rings.rational.Rational'>

734
735

有理数と整数の和を行うと、その結果は sage.rings.rational.Rational 型の対象になりま
す。

736
737
738
739
740
741

x = 1 + 1/2
print xtype(x)|3/2<type 'sage.rings.rational.Rational'>

3.15.2 実数
742
743
744

実数は sage.rings.real_mpfr.RealNumber 型の対象に属します。 次の例題では、実数.5 の型を表示し、変数 x に.5 を割り当てて変数 x を表示し、それから x が参照する対象の型を表示させています:

745
746
747
748
749
750
751
752

print type(.5)
x = .5print xtype(x)|<type 'sage.rings.real_mpfr.RealNumber'>
0.500000000000000<type 'sage.rings.real_mpfr.RealNumber'>

753
754

次の処理は前の処理を実行した後で、そのワークシートの別のセルに入力したものです。二つの実数同士の和とその結果を示し、その結果もまた実数で、変数 y に割り当てています:

755
756
757
758

y = x + .75
print ytype(y)|v1.23 - 02/17/08
759
760

はじめての SAGE（SAGE For Newbies)）

40/1581.25000000000000<type 'sage.rings.real_mpfr.RealNumber'>

761
762

実数と有理数との和により、その結果は sage.rings.real_mpfr.RealNumber 型の対象となり
ます:

763
764
765
766
767
768

x = 1/2 + .75
print xtype(x)|1.25000000000000<type 'sage.rings.real_mpfr.RealNumber'>

3.15.3 他の対象の列を包含する対象: リストとタプル
769
770
771
772
773
774
775
776
777
778
779

list 対象の型は順序がある対象、即ち、列(sequence)を保持するために設計されています。List はとても柔軟性があって、SAGE で最も頻繁に用いられる型の一つです。list は任意の型の対象を保持する事が可能で、必要に応じて大きくしたり小さくしたりする事が出来
れば、入れ子にする事も出来ます。list に含まれる対象は list に於けるそれらの位置で取り出す事や他の対象で置き換える事も出来ます。list を大きくしたり小さくしたりする事
や、その包含する内容を変えられる能力により可変(mutable)対象型となります。大括弧の対の替わりに 0 あるいはそれ以上の対象や式を置く事でリストを生成する手法があります。
次のプログラムではリストの型を印字する事から開始します。それから、それは数 50, 51,
52 と 53 を含むリストを生成し、変数 x に割り当てて x を印字します。次に０と 3 の位置にある対象を印字し、3 の位置にある 53 を 100 で置き換えて x を再度印字し、それから最後に xの対象の型を印字します:

780
781
782
783
784
785
786
787
788
789
790
791
792
793
794

print type([])
x = [50,51,52,53]
print xprint x[0]print x[3]x[3] = 100
print xtype(x)|<type 'list'>[50, 51, 52, 53]50
53[50, 51, 52, 100]
<type 'list'>

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

41/158

795
796
797

リストの最初の対象が 1 ではなく 0 の位置であり、これによってリストの最後の対象の位置
はそのリストの長さよりも一つ小さくなる事に注意しましょう。また、変数の右側に位置番号を大括弧で括れば、リストの中の対象を参照することになります。

798

次の例では異なった型の対象がリストの中に置ける事を示します：

799
800
801
802

x = [1, 1/2, .75, 'Hello', [50,51,52,53]]
print x|[1, 1/2, 0.750000000000000, 'Hello', [50, 51, 52, 53]]

803
804
805
806
807
808

タプル（Tuples)もまた列(sequences) で、不可変であることを除いてリストに似ています。タプルは大括弧ではなく小括弧を使うことで生成され、不可変(immutable)であると言う事は、一旦、タブル対象を生成すると、大きく、小さくしたり、それが包含する対象を変えられない事を意味します。次のプログラムは最初のリストプログラムに似ていますが、リストの代わりにタプルを用いており、位置 4 の対象を変更しようとせず、print 文の代わりにセミコロンを使う手法で複数の結果を表示させています：

809
810
811
812
813
814
815
816
817
818

print type(())
x = (50,51,52,53)x;x[0];x[3];x;type(x)|<type 'tuple'>(50, 51, 52, 53)50
53(50, 51, 52, 53)<type 'tuple'>

3.15.3.1 多変数の取りまとめと取り崩し
819
820

コンマで分離された多変数が一つの変数として割り当てられると、その変数は自動的にタプルとして置かれ、これをタプル纏め(tuple packing)と呼びます：

821
822
823
824

t = 1,2t|(1, 2)

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

42/158825
826

タプルにコンマで区切った複数の変数を割り当てる時、これをタプル展開(tuple
unpacking)と呼びます：

827
828
829
830
831
832

a,b,c = (1,2,3)
a;b;c
|
1
2
3

833
834

タプル展開をする為にはタプル内部の対象の数は等号左側にある変数の総数と一致しなけれなりません。

835

3.16 リストとタプルを使った while 反復処理の利用

836
837
838

反復処理を行う文はリストやタプルの各成分を次々と選択して、処理がそれらの対象に対して処理されるようにすることが出来ます。次のプログラムはリストの各成分を表示する為に
while 文による反復処理を使っています：

839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855

#リストの各成分を印字
x = [50,51,52,53,54,55,56,57,58,59]
y = 0
while y <= 9:print x[y]y = y + 1
|
50
51
52
53
54
55
56
57
58
59

856
857

反復処理はまたリストでの検索にも使えます。次のプログラムでは while による反復処理とif 文を使って、数 53 を含むかどうかリストの検索で用います。もし、53 をリストの中で見v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）858

つけると、メッセージを表示します。

859
860
861
862
863
864
865
866
867

# 53 がリストにあるかどうかを判断。
x = [50,51,52,53,54,55,56,57,58,59]
y = 0
while y <= 9:if x[y] == 53:
print "53 was found in the list at position", yy = y + 1|
53 was found in the list at position 3

868

43/1583.17 in 演算子

869
870
871
872
873

反復処理は非常に便利な機能であり、内部的な反復を行う in と名付けられた演算子さえもSAGE は持っています。 in 演算子はリストに与えられた対象が含まれているかどうかを判断する為に自動的に検索を行うことが出来ます。もし、その対象を見つけると、True を返却しますが、対象がみつからなければ False を返します。次のプログラムは両方の場合を示して
います:

874
875
876
877
878

print 53 in [50,51,52,53,54,55,56,57,58,59]
print 75 in [50,51,52,53,54,55,56,57,58,59]
|
True
False

879

not 演算子はその結果を変更する為に in 演算子と併用する事も出来ます:

880
881
882
883
884

print 53 not in [50,51,52,53,54,55,56,57,58,59]
print 75 not in [50,51,52,53,54,55,56,57,58,59]
|
False
True

885

3.18 for 文を使った反復処理

886
887

For 文は while 文でやっている様に、リストやタプルからの添字を用いた反復を使います
が、もっと柔軟で自律的です。ここでは for 文の簡略化した構文を示しておきます：888

for <target> in <対象>:v1.23 - 02/17/08
889
890
891
892
893
894

はじめての SAGE（SAGE For Newbies)）

44/158

<文>
<文>
<文>
.
.
.

895
896
897
898

この構文で、<target> は通常変数であり、<対象>は通常、複数の対象を包含する一つの対象です。この節の残りでは、<対象>はリストであると仮定しておきます。for 文は交互にそのリストの対象を選出し、<target>に割り当て、インデントされた箇所の内部の文を実行します。次のプログラムでは for 文をリスト内部の項目のすべてを表示する為に用いています：

899
900
901
902
903
904
905
906
907
908
909
910
911

for x in [50,51,52,53,54,55,56,57,58,59]:
print x
|
50
51
52
53
54
55
56
57
58
59

912

3.19 函数

913
914
915
916
917

プログラムした Function は、コードの名付けられたブロックで構成されていて、一つ、あるいは何回もそのプログラムの他の部分から呼び出されることによって実行され得る文です。函数は呼び出したコードから引き渡される対象を持ち、函数は呼び出したコードに対象を返します。函数の例として、対象の型を決定する事に使える type()命令を挙げておきま
す。

918
919
920
921
922

函数は SAGE がコードを再利用できる一つの手法です。大半のプログラム言語では、この方法
でコードが用いられませんが、再利用される文のコードの型はサブルーチン、あるいは手続と呼ばれています。函数名はすべての小文字を使います。もし、函数名が一つの語(例えば、calculatesum の様に)を含んでいれば、下線を語と語の間に置いて(calculate_sum のように)読み易くする事が出来ます。

v1.23 - 02/17/08
923

はじめての SAGE（SAGE For Newbies)）

45/1583.20 def 文を用いた函数の定義

924

函数定義で用いられる文は def と呼ばれ、その構文は次の通りです：

925
926
927
928
929
930
931

def <函数名>(arg1, arg2, ... argN):
<文>
<文>
<文>
.
.
.

932
933
934
935

def 文は引数を伴った函数名を包含するヘッダを含みます。ここで引数は省略が可能です。
函数は 0、又はそれ以上の引数を持つことが可能で、それらの引数は括弧の中に置かれます。函数が呼び出されたときに実行される文はインデント付けられたプログラムブロックを使った函数の内部に置かれます。

936
937

次のプログラムは addnums と呼ばれる函数を定義し、この函数は二つの数を引数として取り、それらを足し合わせ、それから return 文を使って輪を返します：

938
939

def addnums(num1, num2):
"""

940
941
942
943

num1 と num2 の和を返す"""
answer = num1 + num2
return answer

944
945
946

#函数を呼び出し、2 に 3 を加えさせる Ca = addnums(2, 3)
print a

947
948
949
950
951
952

#函数を呼び出して４に５を加えさせる
b = addnums(4, 5)
print b
|
5
9

953
954
955

最初にこの函数を呼び出すと、数字の 2 と 3 が引き渡されて、これらの数は変数 num1 とnum2 にそれぞれ割り当てられます。函数の呼び出しの間に対象が引き渡された引数変数は必要に応じて函数内部で利用することが出来ます。

v1.23 - 02/17/08

956
957
958
959
960
961
962
963
964
965
966

はじめての SAGE（SAGE For Newbies)）

46/158函数がそれを呼び出したものに結果を返却する時に、return 文の右側に置かれた対象は呼び出したプログラムの内部で利用出来ることに注意してください。函数自体が、その返却する対象で置き換えられるかのようです。返却された対象について別の見方は、呼び出したコードの中で函数名の左側に送り出され、しかしながら、符号は一致し、その変数に割当てられるというものです。最初の函数呼出では、函数が返す対象は変数'a'に割り当てられたもので、この対象が印字されています。第２の函数呼出は最初の函数呼出に似ていますが、異なった数(4, 5)を函数に与えている点が異なります。

3.21 SAGE 内部の函数の一部
SAGE は幅広く多様な目的に対応出来る様に莫大な数の組込み函数があります。
表 3 にはこれらの函数の一部を示しておきますが、SAGE の文書にはもっと長い函数の一覧があります。より完全な函数の一覧は SAGE Reference Manual にあります。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

Function Name

47/158Description

abs

引数の絶対値を返却

acos

逆余弦函数.

add

数列(文字列ではない)と媒介変数'start'の値の総和を返します。列が空であれば start の値を返却します。

additive_orderx の additive order を返す。

asin

逆正弦函数。

atan

逆正接函数。

binomial

二項係数を返す函数。

ceil

足切り函数

combinations

複合集合(同時に同じ対象を含んでいるかもしれない対象のリスト)の組合せの mset は反復なしで順序付けられていない選出であり、mset のソートされた副リストによって表現されています。k 成分の複合集合 mset の全ての組合せの集合を返却します。

complex

実部とオプションの虚部から複素数を生成します。つまり(実部 + 虚部*1j)と同値で、実部の附置は０です。

cos

正弦函数

cosh

双曲余弦函数coth

双曲余接函数csch

双曲余割函数

denominator

x の分母

derivative

f の微分

det

x の行列式

diff

f の微分

dir

与えられた対象の(幾つかの)属性込みの名前や対象から到達可能な属性の一
覧をアルファベット順で返します。

divisors

全ての整数因子を返す

dumps

文字列 s に対象 obj を吐き出す。対象 obj の復元には load(s)を使います。

e自然底

eratosthenes

素数<= n のリストを返す。

existsS が P(x)が True となる成分 x を含む場合、この函数は True と成分 x を返し、それ以外は False と None を返します

exp

指数函数, exp(x) = e^x.

expand多項式を展開した書式で返す

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

48/158factor整数の因数分解をタプルのリストとして返します

factorialn の階乗を計算します。階乗は積

fibonaccin 番目の Fibonacci 数を返却.

fibonacci_sequencen=start から n=stop 迄の全ての fibonacci 数 f_n に対して、Fibonacci 列の反復を返却します。

fibonacci_xrange

与えた範囲で Fibonacci 数のリストを返しますが、f_n=start を含みます
が、f_n=stop は含みません。

find_root

閉区間[a, b](または[b, a])に於ける根を可能なら探す。ここで f は 1 変数の函数である。

floor

floor 函数

forallP(x)が S の全ての x で真であれば True と None を返します。もし、S のある成分 x で P が True にならなければ、False と x を返します

forget

仮定を忘却する、あるいは無引数で全ての仮定を忘却する。ここで仮定は記号拘束の一種ですfunction

記号函数を生成します。

gaussian_binomial

ガウス分布を返します。

gcd

a と b の最大公約因子を返却

generic_power

m が非負であれば、a の m 乗を返します。

get_memory_usage

記憶の状態を返します。

hex

整数、あるいは長整数の１６進表現を返す

imag

x の虚部を返す

imaginary

複素数の虚部を返す

integer_ceil

x の四捨五入を返す.

integer_floor

整数で <= x を満たす最大の整数を返す

integral

対象 x の不定積分を返す

integrate

積分intervala と b の間にある整数(a と b は整数)

is_AlgebraElementx の型が AlgebraElement であれば True を返す

1 * 2 * 3 ... (n-1) n です。

is_commutative
is_ComplexNumber
is_evenis_Functor
is_Infinite

偶数、つまり、2 で割り切れるかどうかを返します。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

49/158is_Integer
is_odd奇数であるかどうかを返す。定義による is_even の補完

is_power_of_two

2 の冪乗のときだけ Ttue を返す。

is_prime

素数であれば True を返し、そうでなければ False を返す。

is_prime_power

素数の冪乗であれば True、それ以外は False。

is_pseudoprime

擬素数であれば True、そうでなければ False。

is_RealNumber

RealNumber 型であれば True を返し、 meaning that it is an element of
the MPFR real field with some precision.

is_SetSAGE Set であれば True を返す

is_square

平方数であるかどうかを返します。平方数であれば平方根を返し、そうでな
ければ None を返します。

is_SymbolicExpression
isqrt

整数の平方根を返します。つまり、平方根を越えない整数を返します。

laplace

Laplace 変換を計算して返します。

latex

SAGE の対象を latex(...) で latex の書式に変換します。

lcm

a と b の最小公倍数、The least common multiple of a and b, or if a is
a list and b is omitted the least common multiple of all elements ofv.

len

列や写像の成分の総数を返します。Rlim

与えられた方向からの変数 v の a への極限を返す

limit

与えられた方向からの変数 v の a への極限を返す

list

list() -> new list, list(sequence) -> new list で sequence の成分で初期化されます。

list_plot

list_plot は単与件リストを取り、これはタプル(i,di)のリストとなります。ここで i は 0 から len(data)-1 迄で、di は与件の i 番目の値です。そして、点はこれらのタプル上に配置されます。list_plot はまたタプル(dxi,dyi)のリストを取ります。ここで dxi は X 座標を表現する i 番目の与件、dyi は i 番目の値で、plotjoined=True なら全ての点が繋がれて描かれま
す。

load

名前が filename のファイルから SAGE の対象を読み込みます。ファイル名には.sobj という修飾子がもしもなければ追加されます。註:load と呼ばれる特殊な SGAE 命令(Python では使えません)もあり、load filename.sage と入力して用います。

loads

s=dumps(x)を使うことで文字列 s に吐き出された対象 x を復元します。

log

底を２とする自然対数。

matrix行列を生成

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

50/158max

単列の変数で、その最も大きな元を返します。二つ、あるいはそれ以上の引数に対しては、最大の引数を返します。

min

単列の変数で、その最も小さな元を返します。二つ、あるいはそれ以上の引数に対しては、最小の引数を返します。

minimal_polynomial

x で最小多項式を返す

modmrange

与えられた大きさと型の複合リストを返します。

mul

リストの成分の積を返します。

next_prime

整数 n の次に大きな整数

next_prime_powern が素数の時に、n よりも大きく、n に最も近い素数を返します

norm

ノルムを返すnormalvariate

正規分布

nth_prime
number_of_arrangements

arrangements(mset,k)の大きさを返します。

number_of_combinations

combinations(mset,k)の大きさを返します。

number_of_derangements

derangements(mset)の大きさを返します。

number_of_divisors

因子の数を返します。

number_of_permutations

permutations(mset)の大きさを返します。

numerator

分子を返す

numerical_integral

区間 xmin から xmax で函数の数値積分を返します。R

numerical_sqrt

x の平方根を返します

oct

整数や多倍長整数の 8 進数表現を返します。

order

x の次数を返す。x が環、あるいは可換環の元であれば、これは x のaadditive order となる。

parametric_plot

parametric_plot はリストやタプルとしての二つの函数を取り、最初の函数
が x 座標を与え、二番目の函数が y 座標を与えるグラフを描きます。

parent定義されていれば x.parent() 、そうでなければ type(x)を返します。

permutations

mset として丁度同じ成分を含み、順序が異なるリストによる置換の表現。

pg

置換群。SAGE では置換は分離した円環表示を使って置換を表現する文字列
か、分離した円環で表現されたタプルのリストの何れかで表現されていま
す。

pi

円周率

plot
pow

二つの引数を取り、x^y と同値になります。三引数では、(x^y) % z と同値

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

51/158になりますが、もっと効率的かもしれません(e.g. long に対し)power_mod

The m-th power of a modulo the integer n.

prangestart と stop-1 の間の素数のリスト。

previous_primen よりも小さな素数で最大の物を返します。

previous_prime_powern よりも小さな素数の冪乗で最大の物を返します。

prime_divisors

The prime divisors of the integer n, sorted in increasing order.

prime_factors

The prime divisors of the integer n, sorted in increasing order.

prime_powers

List of all positive primes powers between start and stop-1,
inclusive.

primesstart から stop-1 の間の全ての素数の列を返します。.

primes_first_n

最初の n 個の素数を返します。

prod

リスト x の元の積を返します。

quo

Return the quotient object x/y, e.g., a quotient of numbers or of apolynomial ring x by the ideal generated by y, etc.

quotient

Return the quotient object x/y, e.g., a quotient of numbers or of apolynomial ring x by the ideal generated by y, etc.

random区間[0,1]での乱数を返します。

random_prime

2 と n の間の素数 p をランダムに返します(つまり、 2 <= p <= n)。

randrange

範囲(start, stop[, step])からの乱数を選出します

range

Returns a list containing an arithmetic progression of integers.

rational_reconstruction

この函数は x/y を計算しようとします, ここで x/y は有理数です。

real

x の実部を返します。

reduceApply a function of two arguments cumulatively to the items of asequence, from left to right, so as to reduce the sequence to asingle value.

repr

Return the canonical string representation of the object.

reset

Delete all user defined variables, reset all globals variables backto their default state, and reset all interfaces to other computer
algebra systems. If vars is specified, just restore the value ofvars and leave all other variables alone (i.e., call restore).

restore

大域変数を再定義することで、それらの初期値に戻します。

round

Round a number to a given precision in decimal digits (default 0
digits). This always returns a real double field element.

sampleChooses k unique random elements from a population sequence.

save

Save obj to the file with name filename, which will have an .sobj

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）
extension added if it doesn't have one.
contents of filename.

52/158This will *replace* thesave_session

Save all variables that can be saved wto the given filename.

searchReturn (True,i) where i is such that v[i] == x if there is such ani, or (False,j) otherwise, where j is the position that a should be
inserted so that v remains sorted.

search_doc

Full text search of the SAGE HTML documentation for lines containings.

search_src

Search sage source code for lines containing s.

sec

正割函数

sech

双曲正割函数seedseq

A mutable list of elements with a common guaranteed universe, which
can be set immutable.

set

順序のない単一元で構成される集まりを生成する。

show

グラフィックス対象を表示する

show_default

Set the default for showing plots using the following commands:
plot, parametric_plot, polar_plot, and list_plot.

shufflesigma

Return the sum of the k-th powers of the divisors of n.

simplify

式を簡易化する

sin

正弦函数

sinh

双曲正弦函数

sleep
slice

Create a slice object.
a[0:10:2]).

This is used for extended slicing (e.g.

slide

Use latex(...) to typeset a SAGE object.
typeset slides.

solve

単一の方程式や方程式系を与えられた変数に対して代数的に解く。

Use %slide instead tosortedsqrt

平方根函数。 これは記号平方根です。

square_free_part

Return the square free part of x, i.e., a divisor z such that x = zy^2, for a perfect square y^2.

srangeReturn list of numbers \code{a, a+step, ..., a+k*step}, wherea+k*step < b and a+(k+1)*step > b. The type of the entries in thev1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

53/158list are the type of the starting value.
str

対象の文字列表現を返します。

subfactorial

Subfactorial or rencontres numbers, or derangements: number of
permutations of $n$ elements with no fixed points.

sum

Returns the sum of a sequence of numbers (NOT strings) plus thevalue of parameter 'start'

super

Typically used to call a cooperative superclass method.

symbolic_expression
sysThis module provides access to some objects used or maintained by
the interpreter and to functions that interact strongly with theinterpreter.

tan

正接函数

tanh

双曲正接函数

taylorExpands self in a truncated Taylor or Laurent series in the variablev around the point a, containing terms through (x - a)^n.

transposetrial_division

Return the smallest prime divisor <= bound of the positive integern, or n if there is no such prime.

two_squares

Write the integer n as a sum of two integer squares if possible;
otherwise raise a ValueError.

type

対象の型を返しますunion

x と y の結合をリストとして返します

uniq

Return the sublist of all elements in the list x that is sorted andis such that the entries in the sublist are unique.

valuationp>0 を割り切る整数 m による p の冪を返します

var

記号変数を生成します。

vars

引数なしで locals()と同値です。引数があれば object._dict_と同値です。

vector与えられた成分を持つ R 上のベクトルを返します。

versionSAGE の版を返す。

view

対象の latex 表現を計算します。註:ノートブックモードではこの函数は単純に出力に png 画像を埋め込みます。

walltimewall time を返却します

xgcd

g = s*a+t*b = gcd(a,b)を満たす三個の整数(g,s,t)を返します。

xinterval

Iterator over the integers between a and b, inclusive.

xrangerange()に似ていますが、リストを返す代わりに要求された範囲の数を生成

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

54/158

する対象を返します。
zip

Return a list of tuples, where each tuple contains the i-th elementfrom each of the argument sequences.

表 3: SSAGE 函数の一部
967

3.22 SAGE 函数の情報を得る

968
969
970

表 3 には各函数がどの様な事をするか短い解説の一覧があります。しかしながら、これらの函数をどのように使うかを示す情報としては不十分です。任意の函数の追加の情報を得る一つの方法は疑問符'?'をワークシートのセルの中で、函数名のうしろに続けて入力してから

971<tab>キーを押すことです：

972
973
974
975
976
977
978

is_even?<tab>|File: /opt/sage-2.7.1-debian-32bit-i686Linux/local/lib/python2.5/site-packages/sage/misc/functional.py
Type:<type 'function'>
Definition:is_even(x)Docstring:

979

Return whether or not an integer x is even, e.g., divisible by 2.

980
981
982
983
984
985
986

EXAMPLES:
sage: is_even(-1)
False
sage: is_even(4)Truesage: is_even(-2)
True

987

表示される灰色のウィンドウには函数についての次の情報が含まれています：

988
989

File: 函数を実装するソースコードを含むファイル名を与えます。函数がどのように実装されているかを見る為、あるいは編集する為にファイルを探そうとしていれば便利です。

990

Type: 参照している情報サービスに引き渡された名前の対象の型を示します。

991

Definition: 函数の呼び出され方を示します。

992

Docstring: 函数のソースコードの中に置かれた文書文字列を表示します。

v1.23 - 02/17/08
993
994
995
996

はじめての SAGE（SAGE For Newbies)）

55/158

表 3 で挙げられた任意の函数のヘルプ、あるいは SAGE のマニュアルがこの方法を使って得られます。また、二つの疑問符'??'を函数名のうしろに置いて、<tab>キーを押せば、函数のソースコードが表示されます。

3.23 利用者が入力した函数についても情報が使える

997
998
999
1000

情報サービスは利用者入力の函数についての情報を得ることにも使え、情報サービスがどのように動作するかをより良く理解すれば、一度、これを入力することでご利益があります。
もしも、貴方が既に現時点でのワークシート上でそれを実行していたのであれば、再びaddnums 函数を入力して、それを実行してください:

1001
1002
1003
1004
1005
1006

def addnums(num1, num2):"""
num1 と num2 の和を返す。
"""
answer = num1 + num2
return answer

1007
1008
1009
1010
1011

#函数を呼出し、３に２を加える。
a = addnums(2, 3)
print a|5

1012

そして、ここで新しく再入力した函数についての情報が前節の手法を使って得られます：

1013
1014
1015
1016
1017
1018

addnums?<tab>|File: /home/sage/sage_notebook/worksheets/root/9/code/8.py
Type: <type 'function'>
Definition: addnums(num1, num2)
Docstring:

1019
1020
1021
1022
1023
1024

Returns the sum of num1 and num2.
これは函数に関して表示された情報が函数のソースコードから得られた事を示しています。

3.24 SAGE に含まれる函数を用いた例
次の短いプログラムは 表 3 に挙げられていた幾つかの函数がどのように用いられるかを示すものです：

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

1025
1026
1027
1028

#１から１０までの数の総和。
add([1,2,3,4,5,6,7,8,9,10])
|
55

1029
1030
1031
1032

#1 ラジアンの余弦函数の値
cos(1.0)|
0.540302305868140

1033
1034
1035
1036

#15/64 の分母
denominator(15/64)
|
64

1037
1038
1039
1040

#20 の全ての約数のリストを得る
divisors(20)|[1, 2, 4, 5, 10, 20]

1041
1042
1043
1044

#４０と 132 の最大公約数を求める。
gcd(40,132)
|
4

1045
1046
1047
1048

#2, 3, と 4 の積。
mul([2,3,4])
|
24

1049
1050
1051
1052
1053

#リストの長さ。
a = [1,2,3,4,5,6,7]
len(a)
|
7

1054
1055
1056
1057
1058

#０から１０までの整数リストを生成。
a = srange(11)a|[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

1059
1060

#0.0 と 10.5 の間の実数を 0.5 刻みでリストで出力。
a = srange(11,step=.5)

56/158

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

1061
1062
1063
1064
1065
1066

a
|

1067
1068
1069
1070
1071

#-5 から 5 までの整数を含むリストを生成。
a = srange(-5,6)a|[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]

1072
1073
1074
1075
1076
1077
1078
1079
1080
1081

#The zip() function takes multiple sequences and groups#parallel members inside tuples in an output list. One#application this is useful for is creating points from#table data so they can be plotted.
a = [1,2,3,4,5]b = [6,7,8,9,10]c = zip(a,b)
c|[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]1082

57/158[0.0000000, 0.5000000, 1.000000, 1.500000, 2.000000, 2.500000,
3.000000, 3.500000, 4.000000, 4.500000, 5.000000, 5.500000,
6.000000, 6.500000, 7.000000, 7.500000, 8.000000, 8.500000,
9.000000, 9.500000, 10.00000, 10.50000]

3.25 for 文で srange() と zip() を利用

1083
1084

for 文用に手動で列を構成する代わりに、srange()が自律的に列を生成することに使えま
す：

1085
1086
1087
1088

for t in srange(6):print t,|0 1 2 3 4 51089

for 文はまた zip()函数の利用から複数の列を並べて使うことが出来ます：

1090
1091
1092

t1 = (0,1,2,3,4)
t2 = (5,6,7,8,9)
for (a,b) in zip(t1,t2):

v1.23 - 02/17/08
1093
1094
1095
1096
1097
1098
1099

1100

はじめての SAGE（SAGE For Newbies)）

58/158print a,b
|
0 5
1 6
2 7
3 8
4 9

3.26 リスト内包 (list comprehension)

1101
1102
1103
1104

ここまでで、我々は if 文、for 文、list と函数が、個別に、そして互いに用いられた時に、それそれ非常に強力なことを見ています。より強力で、リスト内包(listcomprehension)と呼ばれる特殊な文では、最小の構文でこれらを合わせて使うことが
できます。

1105

ここでリスト内包の簡略化した構文は：1106[ 式 for 変数 in 列 [if 条件] ]

1107
1108
1109
1110

リスト内包が行うことは、列を通じて、各列の成分をかわるがわる指定した変数で置いた反復処理を行うことです。その式はまた変数を含み、変数の中に数を置くのにしたがって式が評価され、その結果は新しいリストに置かれます。列の中の全ての数が処理されると、新しいリストが返されます。

1111

次の例では、 t が変数で、 2*t が式です。 そして [1,2,3,4,5] が列です:

1112
1113
1114
1115

a = [2*t for t in [0,1,2,3,4,5]]a|[0, 2, 4, 6, 8, 10]1116

列を人手で生成する代わりに、列の自律的生成で srange()函数がしばしば利用さ:

1117
1118
1119
1120

a = [2*t for t in srange(6)]a|[0, 2, 4, 6, 8, 10]

1121
1122

おまけの if 文は、リスト内包で新しいリストで置き換えられる結果を篩にかける為に用いることが出来ます：

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

1123
1124
1125
1126

a = [b^2 for b in range(20) if b % 2 == 0]a|[0, 4, 16, 36, 64, 100, 144, 196, 256, 324]1127

この場合、２で割り切れるものに対する結果のみが出力リストに置かれます。

59/158

v1.23 - 02/17/08

1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138

はじめての SAGE（SAGE For Newbies)）

60/158

4 オブジェクト指向プログラミング
この章の目的は、オブジェクト指向の SAGE プログラムがどのように動作し、どの様に問題を解く為の用いられるかといった背後にある主要な概念を紹介する事です。貴方が僅か、あるいは全くオブジェクト指向プログラミング（OOP) の経験がないと仮定しており、貴方が OOP
を十分理解することで問題を解く為に SAGE の対象を効果的に使えるようになる事を目的にしています。もしも、この OOP の詰込が完全に飲み込めなかったとしても心配する必要はありません。何故なら、貴方自身、何もない状態から対象をプログラムすることに必要とされる技能を持っていなくても、問題を解く為に SAGE の対象が使えるからです。そういいながらも、この章では、どの様に真っ新な状態から対象をプログラムするかを示すことで、貴方がSAGE の組込の対象がどの様に動作するかがより良く理解出来るでしょう。

4.1 オブジェクト指向な心の書換

1139
1140
1141
1142
1143
1144
1145
1146

私の意見では、この類のプログラミングで貴方が遂行する物事で最も難しい物の一つが手続き型プログラミングの世界からオブジェクト指向プログラミングの世界へと心の切り替えを行うことです。問題はオブジェクト指向プログラミングが手続き型プログラミングよりも必然的に難しいことではありません。問題はプログラミングの問題を解くその手法に違いが大きくて、貴方が本当に"それを会得する"前に幾つかの心的な書換が生じなければならないことです。この心理的な書換は貴方がオブジェクト指向プログラムを書いたり、一体全体何がOOP であるかを本当に理解する為に苦労してオブジェクト指向の書籍に耽溺するに従って、非常にゆっくりと生じる過程です。

1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158

まず初めに、貴方が何か特別で強力な何かが進行していると思うでしょうが、それに固く結びついた貴方の労力を逃してしまうでしょう。貴方がやっと”理解する”事は、普通、明るい光が差し込むように一挙に生じる事ではありません。それは薄明にとても似たもので、貴方の意識の背後で、その耀きをゆっくりと感じられるものです。貴方が関わる新しいプログ
ラミングの問題の各々に対し、貴方の心の正面側では依然、それを解く為に手続的な計画を作成しようとするでしょう。しかし、貴方の心の背後で、この薄明がオブジェクト指向的な戦略(最初はぼんやりとしていますが、やがて明瞭さを増してゆきます)を表現し、それでまた問題が解けることに気付くでしょう。そして、これらのオブジェクト指向的な戦略がやがて興味深い物となって、やがて、それらにより多くの時間を費やしている自分に気付く事になるでしょう多くのプログラミングの問題が、それらを解く為に豊かなオブジェクト指向的な戦略と云う生産の引き金を引くことになったその時に、輝くオブジェクト指向的な部分が貴方の心に訪れるでしょう。

1159

4.2 属性と振舞

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

61/158

1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171

オブジェクト指向プログラミングはソフトウエア設計の哲学であり、そこでソフトウエアは
物理的な世界で対象が作用する方法に似た動作をさせます。全ての物理的な対象は属性(attribute)と振舞(behavior)があります。一つの例として、典型的な事務所の椅子には、色、コロの数、そして物質的な型を属性とし、スピン、ロールや高さの設定が振舞
です。

1172
1173

対象が生成されると、メソッドの呼出し、あるいは起動を意味するメッセージの送付に使わ
れます。

1174
1175
1176

椅子の場合は、char.spin(3)メッセージでその椅子を 3 回スピンさせる事を伝え、さらには、chair.setHeight(32)メッセージでその椅子を 32 センチメートルに設定する事を伝えることを想像してもよいでしょう。

1177

ソフトウエア対象は物理的対象の様に働かせられ、それらはまた属性と振舞を持っています。ソフトウエア対象の属性はインスタンス変数と呼ばれる特殊な変数で保持され、その振舞はメソッド(これは構成員函数(menber function)とも呼ばれます)で保持されるプログラムで決定されます。メソッドは標準の函数と似ていますが、ただ、それは"自由に漂っている"代わりに対象に関連付けられています。SAGE では、インスタンス変数とメソッドはしばしば属性として参照されます。

4.3 類 ( 対象を生成する為の設計図）

1178
1179
1180
1181
1182
1183
1184
1185
1186
1187

類(class)は対象を構築する為に用いられる設計図として考えられ、概念的に家の設計図に似たものです。建築家は、与えられた家がどのように構築されるべきか、どの様な材料が使われ、様々な寸法がどうあるべきか等が正確に定義された設計図を使います。設計図が終わると、ひとつ、あるいはそれ以上の家の建設でそれが使えますが、何故なら、設計図には家をどの様に建築するかと言ったことが記述された情報を含んでいるからですが、家それ自体にはありません。プログラマーが類を生成することは建築家が家の設計図を作成するのと非常に似ていますが、建築家が図面台や CAD システムを使って設計図を作るのに対し、プログ
ラマーはテキストエディタや IDE(総合開発環境:Integrated Development Environment)を使って類を開発する点が異なります。

1188

4.4 オ ブ ジ ェ ク ト 指 向 プ ロ グ ラ ム は 必 要 に 応 じ て 対 象 の 生 成 と 破 壊 を

1189
1190
1191

行う
次の類比はオブジェクト指向プログラム内部でソフトウエア対象が必要に応じてどのように生成され、破壊されるかを解説するものです。対象の生成はまたインスタンスによる表現と

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

62/158

1192
1193
1194

も呼ばれますが、それは対象を定義する類(設計図)が対象インスタンスを生成するために用いられているからです。対象を破壊し、記憶と他の資源を再要求してそれを用いる行為のことをゴミ収集(garbage collection)と呼びます。

1195
1196
1197
1198
1199
1200
1201

オブジェクト指向プログラムに似せた手法で与えられたジェット旅客機を操作し、それから、そのジェット機が大西洋を渡ってニューヨークからロンドンに飛ぶ準備をしているところを想像してください。離陸の前に、飛行機の全ての部品の設計図が滑走路に運び込まれ、飛行機の構築に必要とされる部品の全てを非常に素早く製作する為に一団の作業員が送り込まれます。各部品が出来上がると、飛行機の正しい位置に据え付けられ、短い時間の間に飛行機が完成して利用できるようになります。乗客はジェット機に乗り込み、そしていよいよ
離陸です。

1202
1203
1204
1205

飛行機が地面を離れると滑走車輪を解体してしまいます(ゴミ収集されます)。なぜなら、それらは飛行中は不要で、大西洋を渡っている間に車輪を出して風切り音をたてていることは全く燃料の無駄だからです。だからといって心配する必要はありません。と言うのもロンドンに着陸する前に滑走車輪を適正な設計図(類)を使って再構成してしまえばよいからです。

1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220

離陸後の数分後に、パイロットは飛行機のジェットエンジンを作った会社が丁度、新モデルを出し、今使っているものよりも 15%以上燃料効率がよいので飛行中でも航空会社が飛行機のエンジンの取替えを行うとの連絡を受け取ります。航空会社はニューヨークから新しいエンジンの設計図を飛行機に送り込み、これらは新しい三個のエンジンの組立て(インスタンス化)で用いられます。新しいエンジンが組み立てられると、古い三個のエンジンは同時に停止させられて、新しいエンジンで置き換えられて解体されてしまいます。エンジンの取替えは素早く行われ、旅客はこの取替えが行われたことに気付きさえしません。この飛行には世界的重要人物が乗っており、途上で遭遇した敵対機が我らがパイロットに航路を外れるように要求します。この要求に応じる代わりに、パイロットは設計図のライブラリから一群の 50mm機銃砲塔の設計図を取り出し、4 個の砲塔を構築し、それから飛行機の頭、腹、鼻と尻尾にそれらを取り付けます。機銃からの多少の砲火は敵機を驚かせるに十分で、さっさと逃げてしまって、やがてレーダーからも消えてしまいました。残りの飛行は何も問題はありません。飛行機がロンドンに近づくに従って機銃の砲塔は解体され、新しい着陸車輪が設計図を使って構成されると飛行機は無事に着陸します。旅客がターミナルに入ると、飛行機全体は解体されてしまいます。

1221
1222
1223
1224

4.5 オブジェクト指向プログラム例
次の二節では、Hellos という名前の単純なオブジェクト指向プログラムの話をします。最初の節ではプログラムを含んでいますが、そのプログラム自体を見やすいように何らの注釈も入れていません。第二の節では、注釈をしっかり入れたプログラムがあり、そのプログラ

v1.23 - 02/17/08
1225

はじめての SAGE（SAGE For Newbies)）

ムがどのようにして動作するのかが詳細に記述されています。

4.5.1 Hellos オブジェクト指向プログラム例 (無注釈)1226

class Hellos:

1227
1228

def __init__(self, mess):
self.message = mess

1229
1230

def print_message(self):
print"The message is: ", self.message

1231

1232
1233
1234

1235
1236
1237
1238
1239
1240

def say_goodbye(self):
print "Goodbye!"def print_hellos(self, total):count = 1
while count <= total:
print"Hello ", count
count = count + 1
print " "

1241

1242
1243

obj1 = Hellos("Are you having fun yet?")obj2 = Hellos("Yes I am!")

1244
1245
1246

obj1.print_message()obj2.print_message()print " "

1247
1248

obj1.print_hellos(3)obj2.print_hellos(5)

1249
1250
1251
1252
1253

obj1.say_goodbye()obj2.say_goodbye()|
The message is:
The message is:

1254

1255
1256
1257
1258

1259
1260

Hello
Hello
Hello

1
2
3

Hello
Hello

1
2

Are you having fun yet?
Yes I am!

63/158

v1.23 - 02/17/08
1261
1262
1263

Hello
Hello
Hello

1264

1265
1266

1267

はじめての SAGE（SAGE For Newbies)）

64/1583
4
5

Goodbye!
Goodbye!

4.5.2 Hellos オブジェクト指向プログラム例 ( 注釈付き )

1268
1269
1270

では、Hellos プログラムの詳細を見ることにしましょう。このプログラムの版は注釈を付けたものです。プログラム左側の行数とコロンはプログラムそれ自身ではなく、それらはプ
ログラムの異なった部分を参照し易くする為に追加したものです。

1271
1272

1:class Hellos:
2:
"""

1273

3:

Hellos は'類'であり、類は対象生成の青写真になります。

1274

4:

類はインスタンス変数(属性,Attribute）とメソッド(振舞,Behavior)

1275
1276
1277
1278
1279

5:
6:
7:
8:
9:

で構成されます.
"""

1280

10:

__init__ はコンストラクタが呼び出した組込の特殊な

1281

11:

メソッドです。コンストラクタ

1282

12:

された時に一度だけ呼び出され、その作業は対象の構築を

1283

13:

完遂する事です。その対象が生成されたのちには、

1284

14:

そのコンストラクタはもはや用いられません。

1285

15:

コンストラクタの目的は'伝言'と呼ばれるインスタンス

1286

16:

変数を生成することで、それから、文字列を使って、

1287
1288
1289
1290

17:
18:
19:
20:

それを初期化します。
"""

1291

21:

このコードはインスタンス変数を生成します。

1292

22:

類から生成された対象インスタンスは任意のインスタンス変数

1293

23:

のそれ自身のユニークな複製を持っています。インスタンス

1294

24:

変数は対象の属性(あるいは状態)を保持します。

1295
1296

25:
26:

ここでの self 変数は現行の対象への参照を保ちます。

def __init__(self, mess):"""
メソッドは、対象が生成"""
この'設計図'v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

1297
1298
1299
1300
1301
1302
1303

27:
28:
29:
30:
31:
32:
33:

1304

34:

print_message はインスタンスメソッドであり、この類を使って、

1305
1306
1307
1308
1309
1310
1311
1312

35:
36:
37:
38:
39:
40:
41:
42:

生成された対象に'伝言を印字する'振舞を与えます。
"""
print"The message is: ", self.message

1313

43:

say_goodbye はインスタンスメソッドであり、この類を使って、

1314
1315
1316
1317
1318
1319
1320
1321

44:
45:
46:
47:
48:
49:
50:
51:

生成された対象に'goodby と言う'振舞を与えます。
"""
print "Goodbye!"

1322

52:

print_hellos はインスタンスメソッドで、Hello の数を

1323

53:

印字の引数として取り、画面にこの Hello を沢山印字し

1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334

54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:"""

ます。
"""
count = 1
while count <= total:
print"Hello ", count
count = count + 1

1335

65:

1336

66: を生成し、これらは変数 obj1 と obj2 としてそれぞれが表現

1337

67: されます。インスタント化された時に、ユニークな文字列

1338

68: 助変数が各対象に、引き渡され、この文字列は対象の状態を

1339

69: 初期化する為に用いられます。

"""
self.message = mess;def print_message(self):"""

def say_goodbye(self):"""

def print_hellos(self, total):"""print " "次のプログラムは二つの分離した Hellos 対象(インスタンス)

65/158

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

66/158

1340

70:

1341

71: 対象が生成されると、それらに振舞を実行させる為に、

1342

72: メソッドを呼び出すことで対象に対して伝言が送られます。

1343

73:

これは'対象の取り上げ'による参照(obj1 とします)で実行

1344

74:

されますが、その参照ではうしろに点を置いて、呼び出したい。

1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359

75: 対象の名前を記入します。
76:"""
77:
78:obj1 = Hellos("Are you having fun yet?")79:obj2 = Hellos("Yes I am!")80:
81:obj1.print_message()
82:obj2.print_message()83:print " "84:
85:obj1.print_hellos(3)86:obj2.print_hellos(5)87:
88:obj1.say_goodbye()89:obj2.say_goodbye()

1360
1361
1362
1363
1364

1 行での Hellos 類は class 文を使って定義され、類名は習慣から大文字で始めます。類名が複数の語で構成されていれば、各語の最初の文字を大文字にして、残りの全ての文字を小文字で記述します(例えば、HelloWorld)。その類は行 1 で始まり行 61 で終わります。この行 61
はインデントをつけたコードの最終行です。類の一部としての全てのメソッドとインスタンス変数は類のインデント付けられた区画の中にある必要があります。

1365
1366
1367
1368
1369
1370
1371

Hellos 類は一つのコンストラクタメソッドを 8 行目に、28 行目で生成された一つのインス
タンス変数と 32 行目、41 行目と 50 行目にそれぞれ 3 個のインスタンスメソッドを含んでいます。インスタンス変数の目的は対象に、与えられた類から生成された他の対象と異なるユニークな属性を与えることです。インスタンスメソッドの目的は各対象にその振舞を与えることです。対象の全てのメソッドは、対象のインスタンス変数に接続し、これらのイ
ンスタンス変数はこれらのメソッドの中のプログラムによって接続が可能です。インスタン
ス変数名は函数名と同様の習慣に従います。

1372
1373
1374
1375
1376

8 行目のメソッドはコンストラクタと呼ばれる特殊なメソッドです。 コンストラクタ
メソッドは対象が生成される時に一度だけ呼び出され、その目的は対象の構築を完遂することです。 対象が生成されたあとには、そのコンストラクタは最早使われません。8 行目のコ
ンストラクタの目的は、Hellos 対象の message インスタンス変数を Hellow 型の新しい対象が生成されたとき(78 行と 79 行を参照)にそれに引き渡される文字列で初期化する事です。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

67/158

1377
1378
1379
1380

全てのインスタンスメソッドは呼び出されたメソッドからの特定の対象に対する参照を含む
一つの引数を持ちます。この引数は常に左端の位置に置かれ、通常、この位置に置かれる変数を self と呼びます。この self 変数は特定の対象のインスタンス変数を生成したり、利用する為に使われます。

1381
1382
1383
1384
1385

28 行目の self.message=mess でコンストラクタ mess 変数に引き渡された対象を取り、message と呼ばれるインスタンス変数に引き渡します。インスタンス変数は通常の変数であるかの様に、割り当てによって生成されます。この点演算子'.'は対象のインスタンス変数に対象を参照する変数とインスタンス変数名の間に(self.message や obj1.message の様に)置かれることで対象のインスタンス変数を参照する為に用いられます。

1386
1387
1388
1389
1390
1391

32 行目, 41 行目と 50 行目のメソッドは Hellos 類を用いて生成された対象に、それらの振舞を与えます。print_message()はその対象の message インスタンス変数にある文字列を印字するという振舞を実行し、sat_goodbye()メソッドは、文字列"Goodbye!”を印字するという振舞を実行します。print_hellos()メソッドは引数として一つの整数を取り、その回数
程、'Hello'という言葉を印字します。メソッドの名付け方は函数名で用いたものと同様で
す。

1392
1393
1394
1395
1396
1397
1398
1399

Hellos 類の下のコードは二つの分離した対象(インスタンス)を生成し、これらは変数 obj1と変数 obj2 にそれぞれ割り当てられます。対象はその類名を括弧に続けて入力することで生成されます。括弧の中に置かれた引数はコンストラクタメソッドに引き渡されます。
Hellos 類が呼出されたとき、文字列がそれのコンストラクタメソッドに引き渡され、この文字列は対象の状態の初期化で用いられます。対象の状態はそのインスタンス変数の内容で決定 され ます 。もし、対象のインスタンス変数が変更されると、対象状態も変更 され ます。Hellos 対象は message と呼ばれるインスタンス変数のみを持っているので、それらの状態はこの変数によって決定されます。

1400
1401
1402
1403

対象が生成されると、それらの振舞はメソッドの呼出によって要求されます。
これは参照する変数(obj1 と呼びましょう)による"対象の摘み上げ"によって実行され、点のうしろにこの変数を置き、呼び出したい対象のメソッドの内の一つの名前を入力し、その引数のうしろに括弧を続けます。

1404
1405
1406
1407

4.6 SAGE 類 (Class) と対象 (Object)
SAGE の函数は沢山の機能を持っているので、SAGE の機能の殆どは類と類から実体化された対象に含まれいます。SAGE の類と対象は説明するには莫大な情報を表現します。とはいえ、貴方が可能な限り早く SAGE の対象を使って作業を始めることが出来るように、より簡単な素v1.23 - 02/17/08
1408

はじめての SAGE（SAGE For Newbies)）

68/158

材を最初に示すことにしましょう。

1409

4.7 SAGE の対象について情報を得ること

1410

セルに次のコードを入力し、それを実行てみましょう:

1411
1412
1413
1414

x = 5
print type(x)|<type 'sage.rings.integer.Integer'>

1415
1416
1417

我々は既に type()函数を整数の型を定める為に用いていますが、ここで我々は型がどのようなものであるか詳細を説明する事が出来ます。Sage.rings.integer.Integer と疑問符'?'に続けて入力して<tab>キーを押してみましょう：

1418
1419
1420
1421
1422
1423

sage.rings.integer.Integer?<tab>|File:/opt/sage-2.7.1-debian-32bit-i686Linux/local/lib/python2.5/site-packages/sage/rings/integer.soType:<type 'sage.rings.integer.Integer'>
Definition: sage.rings.integer.Integer([noargspec])1424

Docstring:

1425
1426
1427

The class{Integer} class represents arbitrary precision
integers. It derives from the class{Element} class, so
integers can be used as ring elements anywhere in SAGE.

1428
1429
1430
1431

begin{notice}
The class class{Integer} is implemented in Pyrex,
as a wrapper of the GMP mpz_t integer type.
end{notice}

1432
1433
1434

この情報は、sage.rings.integer.Integer が本当に類であり、整数類を生成できる事を示しています。また、貴方が二つの疑問符'??'を類名のうしろに置いて、<tab>キーを押せば、類のソースコードが表示されます。

1435

では、別のセルで x.と入力し、 それから<tab>キーを押しましょう:

1436
1437

x.<tab>|

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

69/158

1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463

x.additive_orderx.base_base_extend
x.inverse_of_unit
x.base_extend
x.base_extend_canonicalx.is_perfect_powerx.base_extend_recursivex.base_ring
x.binary
x.categoryx.ceilx.coprime_integers
x.crt
x.db
x.degreex.denominatorx.digits
x.div
x.lcm
x.divides
x.dumpx.dumpsx.exact_log
x.factorx.factorial
x.floor

1464
1465
1466
1467
1468

表示させる灰色のウィンドウには対象が包含する全てのメソッドが含まれています。これらの任意のメソッドがマウスで選択されると、その名前がドット演算子のうしろのセルに置かれます。ここでは、is_prime メソッドを選択しましょう。その名前がセルに置かれた時点
で、疑問符'?'をそのうしろに入力して、<tab>キーを押すと、このメソッドの情報が得られ
ます:

1469
1470
1471
1472
1473
1474

x.is_prime?
|File:/opt/sage-2.7.1-debian-32bit-i686Linux/local/lib/python/site-packages/sage/rings/integer/pyx
Type:<type 'builtin_function_or_method '>Definition: x.is_prime()

1475

Docstring:

x.gcd
x.inverse_mod
x.orderx.is_nilpotent
x.is_onex.powermod
x.is_power
x.is_power_of
x.is_prime
x.is_prime_power
x.is_pseudoprime
x.is_square
x.is_squarefreex.is_unit
x.is_zero
x.isqrtx.jacobi
x.kronecker
x.subsx.leading_coefficientx.listx.mod
x.multiplicative_orderx.next_prime
x.next_probable_prime
x.nth_root

1476

Retuns True if self is prime

1477

EXAMPLES:

x.numerator
x.ord
x.parent
x.plotx.powermodm_ui
x.quo_rem
x.rename
x.reset_namex.savex.set_six.set_str
x.sqrtx.sqrt_approx
x.square_free_part
x.str
x.substitutex.test_bit
x.val_unit
x.valuation
x.version
x.xgcdx.parent
x.plotx.rename
x.reset_namex.powermodm_ui

v1.23 - 02/17/08
1478
1479
1480
1481
1482
1483

はじめての SAGE（SAGE For Newbies)）

70/158sage: z = 2^31 - 1
sage: z.is_prime()True
sage: z = 2^31
sage: z.is_prime()
False

1484
1485
1486
1487

定義の節から is_prime()メソッドが引数を引き渡されるに呼び出さ事が分かり、Docstringの節から、このメソッドが対象が素数であれば True を返すものであることが分かります。次のコードは変数 x(これは 5 を包含しています)が is_prime()メソッドを呼び出す為に用いられています:

1488
1489
1490

x.is_prime()
|
True

1491

4.8 対象のメソッドのリスト

1492

リストは対象であり、それ故、リストには便利な機能を持ったメソッドを含んでいます:

1493
1494
1495
1496
1497

a = []
a.<tab>|a.append
a.count1498

次のプログラムは対象としてのリストの幾つかのメソッドのデモです:

1499
1500
1501
1502
1503
1504
1505
1506

# リストの末端に対象を追加.
a = [1,2,3,4,5,6]
print aa.append(7)print a|[1, 2, 3, 4, 5, 6][1, 2, 3, 4, 5, 6, 7]

1507
1508
1509
1510
1511
1512

# リストに対象を挿入.
a = [1,2,4,5]
print aa.insert(2,3)
print a|a.extend
a.indexa.insert
a.pop

a.removea.reverse

a.sortv1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

1513
1514

[1, 2, 4, 5][1, 2, 3, 4, 5]

1515
1516
1517
1518
1519
1520
1521
1522

# リストの成分を並び替え.
a = [8,2,7,1,6,4]
print aa.sort()print a|[8, 2, 7, 1, 6, 4][1, 2, 4, 6, 7, 8]

1523

71/1584.9 継承による類の拡張

1524
1525
1526
1527
1528
1529

オブジェクト技術は微妙ですが強力です。これは複雑なものを扱う為の幾つかの機構をもっており、類継承(class inheritance)はそのうちの一つの物です。類継承は、最小の処理で、他の類(親の類、スパークラス、あるいはベースクラスと呼ばれます)のインスタンス
変数やメソッドの全てを得たり、あるいは継承する為の類の能力です。親の類から継承された類のことを子供の類、あるいはサブクラスと呼びます。この意味は、子供の類はその親で実行出来るものが利用可能だからです。

1530
1531

次のプログラムでは、Person 類が組込みの object 類から継承し、ArmyPrivate 類が Person
類から継承するという類継承を示します：

1532
1533
1534

class Person(object):def __init__(self):
self.rank = "I am just a Person, I have no rank."

1535

1536
1537

def __str__(self):
return "str: " + self.rank

1538
1539

def __repr__(self):
return "repr: " + self.rank

1540
1541
1542

class ArmyPrivate(Person):def __init__(self):
self.rank = "ArmyPrivate."

1543
1544

a = object()print type(a)v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

72/1581545
1546

b = Person()print type(b)

1547
1548
1549
1550
1551
1552

c = ArmyPrivate()
print type(c)|<type 'object'><class '__main__.Person'><class '__main__.ArmyPrivate'>

1553
1554
1555

類が生成されたあとに、このプログラムは object 型の対象を変数'a'に割当て、Person 型の対象を変数'b'に割当て、ArmyPrivate 型の対象を変数'c'に割当ててインスタンス化し
ます。

1556
1557
1558

次の処理は任意の対象の継承階層を表示させることに使えます。上のプログラムを実行した
あとで別のセルでそれを実行すれば、ArmyPrivate 類の継承階層が表示されます.
(この処理がどの様にして動作するか考え込まないように。使ってみましょう。):

1559
1560
1561
1562
1563
1564

#対象の継承階層を表示します。註： このプログラムが度のように動作するのか#思い悩む必要はありません。
def class_hierarchy(cls, indent):
print '.'*indent, cls
for supercls in cls.__bases__:class_hierarchy(supercls, indent+1)

1565
1566
1567

def instance_hierarchy(inst):
print 'Inheritance hierarchy of', instclass_hierarchy(inst.__class__, 3)

1568

z = ArmyPrivate()

1569
1570
1571
1572
1573
1574

instance_hierarchy(z)|Inheritance hierarchy of str: ArmyPrivate... <class '__main__.ArmyPrivate'>.... <class '__main__.Person'>..... <type 'object'>

1575
1576
1577
1578
1579

instance_hierarchy 函数がそれに引き渡された任意の対象の継承階層を表示します。この場
合、ArmyPrivate 類がインスタンス化されて instance_hierarchy 函数に引き渡され、それから対象の継承階層が表示されるのです。その階層で最上の類、つまり、object 類ですが、これが最後に表示され、Person は object から継承し、ArmyPrivate は Person から継承します。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

73/1584.10 対象類、 dir() 函数、組込メソッド

1580
1581
1582
1583
1584
1585
1586
1587

対象類は SAGE に組込まれており、いくつかの便利なメソッドを持っています。これらのメ
ソッドは非常に便利なので、多くの SAGE の類がその object 類から 1)直接、あるいは 2)間接的に継承しますが、それは object 類から継承している類からの継承によります。
さて、object 類に含まれるメソッドを調べることで、継承プログラムについて議論を始めることにしましょう。dir()函数は全ての属性(インスタンス変数とメソッドの双方を意味します)を一覧表示するので、object 型の対象がどのメソッドを含むかを見るためにそれが使
えます：

1588
1589
1590
1591
1592

dir(a)|['__class__', '__delattr__', '__doc__','__getattribute__','__hash__','__init__', '__new__', '__reduce__','__reduce_ex__', '__repr__','__setattr__', '__str__']

1593
1594
1595
1596
1597

二重の'__'で開始し、それで終わる名前が SAGE の一部であり、下線によって、これらの名前がプログラマーが定義した名前と衝突する事がない様にしています。Person 類は object 類
からのこれらの属性の全てを継承しますが、それらの内の幾つかだけしか使いません。メ
ソッドが親の類から継承されたとき、子供の類はメソッドの親の実装を使ったり、親のものとは異なった振舞をするように再定義することが出来ます。

1598
1599
1600
1601
1602

先に議論した様に、__init__メソッドはコンストラクタであり、それは類を使って生成された新しい類の完全な構成を助けるものです。Person 類は__init__メソッドを再定義して、rank と呼ばれるインスタンス変数を生成して文字列"I am just a Person, I have norank”をそれに割り当てます。 __ repr__と __str__ メソッドもまた Person 類で再定義されています。__repr__メソッドは、対象の一部である対象の文字列表現を返します：

1603
1604

|
repr: I am just a Person, I have no rank.

1605
1606
1607

__str__函数はまた対象の一部でもある対象の文字列表現を返しますが、print の様な文に引き渡された時だけです：

1608
1609
1610

print b|str: I am just a Person, I have no rank.

1611__str__メソッドは通常、__repr__メソッドよりもより利用者にやさしい文字列を返す為に用

v1.23 - 02/17/08
1612
1613

はじめての SAGE（SAGE For Newbies)）

74/158

いられますが、この例では、とても似た文字列が返されます。

4.11 Sage.rings.integer.Integer 類の継承階層

1614

次のプログラムは sage.rigns.integer.Integer 類の継承階層を表示します：

1615
1616
1617
1618
1619
1620

# 類の継承階層を表示します。 註：このプログラムがどの様にして動作するのかを# 理解しなくても構いません。使ってみましょう。
def class_hierarchy(cls, indent):
print '.'*indent, cls
for supercls in cls.__bases__:class_hierarchy(supercls, indent+1)

1621
1622
1623

def instance_hierarchy(inst):
print 'Inheritance hierarchy of', instclass_hierarchy(inst.__class__, 3)

1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637

instance_hierarchy(1)|Inheritance hierarchy of 1... <type 'sage.rings.integer.Integer'>.... <type 'sage.structure.element.EuclideanDomainElement'>..... <type 'sage.structure.element.PrincipalIdealDomainElement'>...... <type 'sage.structure.element.DedekindDomainElement'>....... <type 'sage.structure.element.IntegralDomainElement'>........ <type 'sage.structure.element.CommutativeRingElement'>......... <type 'sage.structure.element.RingElement'>.......... <type 'sage.structure.element.ModuleElement'>........... <type 'sage.structure.element.Element'>............ <type 'sage.structure.sage_object.SAGEObject'>............. <type 'object'>

1638
1639
1640
1641
1642
1643

次の解説では、私は節約の為に類名の"sage.xxx.xxx...”の頭の部分を外す事にします。
instance_hierarchy 函数からの出力は、数字 1 が類型 Integer であることを示しています。その出力は Integer は EuclideanDomainElement から継承
し、EuclideanDomainElement は PrincipalIdealDomainElement から継承し..等であることを示しています。階層の頂点(この一覧の底になります)には SAGEObject が object から継承しています。

1644

ここで二つの他の広く使われる SAGE 類の継承階層は：

1645
1646
1647

instancehierarchy(1/2)|
Inheritance hierarchy of 1/2

v1.23 - 02/17/08
1648
1649
1650
1651
1652
1653
1654
1655

1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676

はじめての SAGE（SAGE For Newbies)）

75/158... <type 'sage.rings.rational.Rational'>.... <type 'sage.structure.element.FieldElement'>..... <type 'sage.structure.element.CommutativeRingElement'>...... <type 'sage.structure.element.RingElement'>....... <type 'sage.structure.element.ModuleElement'>........ <type 'sage.structure.element.Element'>......... <type 'sage.structure.sage_object.SAGEObject'>.......... <type 'object'>

instancehierarchy(1.2)|
Inheritance hierarchy of 1.20000000000000... <type 'sage.rings.real_mpfr.RealNumber'>.... <type 'sage.structure.element.RingElement'>..... <type 'sage.structure.element.ModuleElement'>...... <type 'sage.structure.element.Element'>....... <type 'sage.structure.sage_object.SAGEObject'>........ <type 'object'>4.12 " は一つの " 関係
継承の概念の別の側面とは、親が出来ることなら何でも子供の類でも出来るので、親の類が使えるどの様な場所でも子供の類が使えます。整数類(Integer class)の継承階層に注目してみましょう。この階層は、整数は EuclideanDomainElement であり、EuclideanDomainElement
は PrincipalIdealDomainElement であり、PrincipalIdealDomain は DedekindDomainElement
である等となっています。最後に辿り着く SAGEObject は一つの対象です(丁度、SAGE での他の殆ど全ての類の様に object 類が根本の類で、全てはそこからの子孫になるからです。)。
一般的には、その先祖が使える任意の場所で子孫の類が使えるということです。

4.13 こんがらがったかな ?
この章は多分貴方を困惑させるものでしょうが、そのことに悩むことはありません。この本の残りは SAGE で対象がどのように使われているかを示す例を含んでおり、たくさんの用いられている対象を見て、それらのお陰でより快適になることでしょう。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

1677

5 いろいろなこと

1678

5.1 前回の処理結果の参照

76/1581679
1680

一つのワークシートに複数のセルを広げて問題を解くとき、以前の処理結果を参照する事が望ましい事がしばしばあります。下線記号'_'は次の例で示すようにこの目的に使えます：

1681
1682
1683
1684
1685
1686

2 + 3
|
5
_
|
5

1687
1688
1689

_ + 6
|
11

1690
1691
1692
1693

a = _ * 2
a
|
22

1694

5.2 例外処理

1695
1696
1697
1698

SAGE のプログラムが動作している間に生じるかもしれない例外条件の処理を行う為に単一の方法を持っている事を保証する為、例外表示と処理の仕組は SAGE に組み込まれています。この節では単に表示された例外についてのみ解説します。何故なら、例外処理はこの文書の領域を越える進んだ話題だからです。

1699

次のプログラムは例外が生じる原因となり、それから、その例外の情報が表示されます：

1700
1701
1702
1703
1704

1/0
|

1705
1706

何故なら、1/0 は未定義の数学的演算なので、SAGE はその計算の実行が出来ません。そのプ
ログラムの実行を停止し、この問題に関してプログラムの別の領域、或いは、利用者に報せ

Exception (click to the left for traceback):...
ZeroDivisionError: Rational division by zero

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

77/158

1707
1708
1709
1710

る例外を生成します。その例外を扱うプログラムの別部分がなければ、その例外のテキスト
による説明が表示されます。この場合、その例外が利用者に ZeroDivisionError が生じたことと、これが"rational division by zero(零による有理数の割算)”を実行しようとした為に生じたことを利用者に報せています。

1711
1712
1713
1714

とにかく、これは利用者にとってソースコードにある問題を突き止めて修正するのに十分な情報です。時には、利用者はその問題を突き止める為により多くの情報を必要とすることもあるので、例外はマウスを表示された例外のテキストの左側をクリックすれば、追加の情報が表示される様になっています。

1715
1716
1717
1718
1719
1720
1721

Traceback (most recent call last):
File "", line 1, inFile "/home/sage/sage_notebook/worksheets/tkosan/2/code/2.py",line 4, in
Integer(1)/Integer(0)File "/opt/sage-2.8.3-linux-32bit-debian-4.0-i686Linux/data/extcode/sage/", line 1, in

1722

1723
1724
1725
1726
1727
1728

File "element.pyx", line 1471, in element.RingElement.__div__
File "element.pyx", line 1485, in element.RingElement._div_cFile "integer.pyx", line 735, in integer.Integer._div_c_impl
File "integer_ring.pyx", line 185, in
integer_ring.IntegerRing_class._div
ZeroDivisionError: Rational division by zero

1729
1730
1731
1732

この追加情報で、例外が生じた時に利用されている SAGE ライブラリの全てのプログラムの追跡結果とそのプログラムが含まれているファイル名が見られます。そのお陰で、例外が SAGEの虫か入力されたプログラムの虫を原因とするものかどうかを決定する為に、SAGE の猛者は
ソースコードを見ることが出来ます。

1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743

5.3 数値結果を得る
対象の数値近似が必要になることがありますが、SAGE はこれを遂行するいくつかの方法があります。一つの方法は n()函数で、別のもう一つの方法は n()メソッドを使うことです。次の例では双方を利用した物を示します：
a = 3/4
print aprint n(a)print a.n()|
3/4

v1.23 - 02/17/08
1744
1745

はじめての SAGE（SAGE For Newbies)）

78/1580.750000000000000
0.750000000000000

1746

返却される対象の桁数は digits 助変数を使って調整で来ます：

1747
1748
1749
1750

a = 3/4
print a.n(digits=30)|
0.7500000000000000000000000000000

1751

そして、精度の桁数は prec 助変数を使って調整で来ます：

1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763

a = 4/3
print a.n(prec=2)
print a.n(prec=3)
print a.n(prec=4)
print a.n(prec=10)
print a.n(prec=20)
|
1.5
1.2
1.4
1.3
1.33331764

5.4 式の表記指南

1765

常に、次の二項演算子には両方に空行一つを置きます:

1766
1767

割当 '=', 引数付き割当 (+=, −=, 等), 比較 (==, <, >, !=, <>, <=, >=, in, not in,is, is not), 論理値 (and, or, not).

1768
1769

算術演算子+ と – のまわりには空行を置きますが、算術演算子 *, /, %, と^には空行を置
いてはいけません：

1770

x = x + 1

1771

x = x*3 − 5%2

1772

c = (a + b)/(a − b)1773

添字引数や引数の附置として指す場合には等号'='の回りに空行を置かないように：

v1.23 - 02/17/08
1774

1775
1776

はじめての SAGE（SAGE For Newbies)）

79/158a.n(digits=5)

5.5 組込定数
SAGE は組込の幾つかの数学定数を有しており、次は最も一般に使われるもののリストです:1777

Pi, pi: 円周率

1778E, e: 自然底

1779
1780
1781

I, i: 純虚数

1782

Infinity, infinity: 正や負の無限大を指す為に + や − を前に置けます。

log2: 実数２を底とする対数

1783

次の例では定数の利用が示されています:

1784
1785
1786
1787
1788
1789

a = pi.n()b = e.n()c = i.n()a,b,c|(3.14159265358979, 2.71828182845905, 1.00000000000000*I)

1790
1791
1792
1793
1794

r = 4
a = 2*pi*ra,a.n()|(8*pi, 25.1327412287183)

1795
1796
1797
1798
1799

SAGE での定数は大域変数として定義され、この大域変数は大半の SAGE のプログラムから、函数の内部やメソッドも含めて参照出来ます。定数は単純に、それらに一定の対象が割り当てられた変数なので、必要であっても定数対象が失われているのであれば、その変数に最割り当てが可能です。もし、変数にそれが通常持っていんる定数を再度割り当てなければならない場合は restore()函数が用いられます。 次のプログラムではどの様に変数 pi がそれに

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

80/1581800
1801

割り当てられた対象 7 を持つことができ、それから、restore()函数にその名前を単引用符で括って引き渡すことで再びそのデフォルトの定数値を持つようになるかを示しています：

1802

print pi.n()

1803
1804

pi = 7
print pi

1805
1806
1807
1808
1809
1810

restore('pi')
print pi.n()|
3.14159265358979
7
3.14159265358979

1811
1812

restore()函数が引数なしで呼び出されると、一度別の値を割り当てられた全ての定数は元の値に戻されます。

1813
1814
1815

5.6 根
sqtrt()函数は値の平方根を得る為に使えるだけではなく、より一般的な手法が値の他の根を得る為に用いられています。例えば、8 の三乗根を得たければ:
3

8
1816

8 would be raised to the 1/3 power:

1817
1818
1819

8^(1/3)
|
2

1820
1821

演算子の順序により、有理数 1/3 は指数として評価されるために括弧で括る必要がありま
す。

1822

5.7 記号変数

1823
1824

ここまでで、我々が利用している全ての変数は割当のときに生成されています。たとえば、次の処理では変数 w が生成されて、数 8 がそれに割り当てられます：

1825
1826

w = 7
w

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

81/158

1827
1828

|

1829
1830
1831

しかし、指定した値を何も割り当てていない変数を処理する必要があればどうなるでしょうか？次の処理では変数 z の値を表示させようとします。しかし、z にはまだ値が割り当てられていないので、例外処理が返されてしまいます：

1832
1833
1834
1835
1836

print z|Exception (click to the left for traceback):...
NameError: name 'z' is not defined

1837
1838
1839
1840
1841

数学で、"割り当てられていない変数"はいつでも使われます。SAGE は数学指向のソフトウエ
アなので、割り当てられていない変数を使って処理する能力があります。SAGE では、割り当
てられていない変数は記号変数と呼ばれ、それらは var()函数を用いて定義されます。ワー
クシートが最初に開かれた時に、変数 x は自律的に記号変数として定義され、貴方のコードの中で別の値を割り当てるまではそのままです。

1842

次のコードが新しく開いたワークシート上で実行されました：

1843
1844
1845
1846
1847

print xtype(x)|x<class 'sage.calculus.calculus.SymbolicVariable'>

1848
1849

変数 x には SymbolicVariable 型の対象が自律的に SAGE 環境によって割り当てられる事に注意してください。

1850
1851
1852
1853

もし、記号変数として y と z も使いたければ、var()函数をこの為に使わなければなりません。var('x,y')、または var('x y')の何れかが入力出来ます。var()函数は一つ、またはそれ以上の変数名を文字列の中に受け入れられる様に設計されており、その名前はコンマか
空行の何れかで分離することが出来ます。

1854
1855

次のプログラムでは var()が y と z を記号変数として初期化することに用いている事を示し
ます：

1856

var('y,z')7

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

82/158

1857
1858
1859

y,z
|
(y, z)

1860
1861

ひとつ、あるいはそれ以上の記号変数が定義された後で、reset()函数はそれらを未定義にすることが出来ます：

1862
1863
1864
1865
1866
1867

reset('y,z')
y,z|
Exception (click to the left for traceback):...
NameError: name 'y' is not defined

1868

5.8 記号変数

1869
1870

記号変数を含む式の事を記号式(symbolic expressions)と呼びます。次の例で、b は記号変数として定義されており、それから、記号式 2*b の生成で用いられています。

1871
1872
1873
1874

var('b')type(2*b)|<class 'sage.calculus.calculus.SymbolicArithmetic'>

1875
1876

この例で見られる様に。記号式 2*b は SymbolicArithmetics 型の対象で置き換えられます。
この式はまた変数に割り当てる事が可能です：

1877
1878
1879
1880

m = 2*btype(m)|<class 'sage.calculus.calculus.SymbolicArithmetic'>

1881
1882

次のプログラムは二つの記号式を生成し、それらを変数に割り当てて、それから、それらに関する演算を行います：

1883
1884
1885
1886
1887

m = 2*bn = 3*bm+n, m-n, m*n, m/n|(5*b, -b, 6*b^2, 2/3)

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

1888

二つの記号式同士の積のもう一つの別例です：

1889
1890
1891
1892
1893
1894

m = 5 + bn = 8 + b
y = m*ny|(b + 5)*(b + 8)

83/158

5.9 展開と因子分解
1895
1896

前節の式の展開式が必要であれば、expand()メソッドを呼び出すことで簡単に得られます(この例では前節のセルが動作していると仮定しています)：

1897
1898
1899
1900

z = y.expand()z|b^2 + 13*b + 40

1901
1902

式の展開式は変数 z に割り当てられ、因子分解式は z から factor()メソッドから得られま
す：

1903
1904
1905

z.factor()|(b + 5)*(b + 8)

1906
1907

兎に角、数は変数に割当てをしなくても、回りを括弧で括って factor()メソッドを呼び出せば因子分解が行えます：

1908
1909
1910

(90).factor()|
2 * 3^2 * 5

5.10 いろいろな記号式の例
1911

var('a,b,c')

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

1912
1913
1914

(5*a + b + 4*c) + (2*a + 3*b + c)|
5*c + 4*b + 7*a

1915
1916
1917

(a + b) - (x + 2*b)|-x - b + a

1918
1919
1920

3*a^2 - a*(a -5)|
3*a^2 - (a - 5)*a

1921
1922
1923

_.factor()|a*(2*a + 5)

84/158

5.11 記号式への値の引き渡し
1924
1925

もし、値が記号式に引き渡されると、それは評価され、その結果が返却されます。もし、式が一つの変数を持っていれば、その値を次の様に単純に引き渡すことが出来ます：

1926
1927
1928
1929

a = x^2
a(5)
|
25

1930
1931

しかしながら、式が二つ以上の変数を持っていれば、各変数には名前を使って値を割り当てる必要があります：

1932
1933
1934
1935
1936

var('y')a = x^2 + ya(x=2, y=3)
|
7

1937
1938

5.12 記号方程式と solve() 函数
記号式の処理に加え、SAGE はまた記号方程式が扱えます：

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

85/158

1939
1940
1941
1942

var('a')type(x^2 == 16*a^2)|<class 'sage.calculus.equations.SymbolicEquation'>

1943
1944

この例で示すことが出来るように、記号方程式 x^2 == 16*a^2 は二重等号'=='を使う必要があるので、単等号'='を次のように使って変数に割り当てることが出来ます：

1945
1946
1947
1948

m = x^2 == 16*a^2
m, type(m)|(x^2 == 16*a^2, <class 'sage.calculus.equations.SymbolicEquation'>)

1949
1950
1951
1952

たくさんの方程式が solve()函数を用いて代数的に解けます：
solve(m, a)|[a == -x/4, a == x/4]

1953

solve()函数の第 1 引数は記号方定式で、第 2 の引数は解くべき記号変数です。

1954

solve() 函数もまた同時に方程式を解けます：

1955

var('i1,i2,i3,v0')

1956
1957
1958
1959

a = (i1 - i3)*2 + (i1 - i2)*5 + 10 - 25 == 0
b = (i2 - i3)*3 + i2*1 - 10 + (i2 - i1)*5 == 0c = i3*14 + (i3 - i2)*3 + (i3 - i1)*2 - (-3*v0) == 0
d = v0 == (i2 - i3)*3

1960
1961
1962

solve([a,b,c,d], i1,i2,i3,v0)|[[i1 == 4, i2 == 3, i3 == -1, v0 == 12]]

1963
1964

一つ以上の方程式を solve()に与える場合、リストの形式で与えなければならないことに注意してください・1965

5.13 記号数学函数

1966
1967

SAGE には数学の構文を使った函数を定義する能力があります。次の例では x を変数の函数として函数 f を定義する様子を示しておきます：

1968

f(x) = x^2

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

86/158

1969
1970
1971
1972

f, type(f)|(x |--> x^2,
<class'sage.calculus.calculus.CallableSymbolicExpression'>)

1973
1974

この方法で生成された対象は CallableSymbolicExpression 型で、これらは次の例題で示される様に呼出可能な事を意味します：

1975
1976
1977

f(4), f(50), f(.2)|(16, 2500, 0.040000000000000010)

1978

ここでは複製の代わりに上の CallableSymbolicExpression を使います：

1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993

a = 0
while a <= 9:f(a)a = a + 1
|
0
1
4
9
16
25
36
49
64
81

1994
1995

次の例では前の例題で行った同じ作業を完遂しますが、より進んだ言語機能を用いる点で異
なります：

1996
1997
1998
1999

a = srange(10)a|[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2000
2001
2002
2003
2004
2005
2006

for num in a:f(num)|
01
4
9

v1.23 - 02/17/08
2007
2008
2009
2010
2011
2012

はじめての SAGE（SAGE For Newbies)）

87/158

16
25
36
49
64
81

5.14 グ ラ フ を 使 っ た 根 の 検 出 と find_root() メ ソ ッ ド を 利 用 し た 数

2013

値的な根の検出

2014
2015
2016

方程式が代数的に解けない場合には、solve()函数は引き渡された入力の複製を返す事でこれを示唆します。これは次の例で見られます：

2017
2018
2019
2020
2021

f(x) = sin(x) - x - pi/2
eqn = (f == 0)
solve(eqn, x)|[x == (2*sin(x) - pi)/2]

2022
2023

ところで、代数的に解けない方程式はグラフを使ったり数値的な方法の両方で解く事が出来ます。次の例では上の方程式をグラフを使って解いています：2024

show(plot(f,-10,10))

2025

|

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

88/1582026

このグラフは方程式の根が-2.5 よりも僅かに小さいことを示しています。

2027
2028

次の例で、この方程式をより正確に find_root()メソッドを使って解けることを示してい
ます：

2029
2030
2031

f.find_root(-10,10)|-2.309881460010057

2032-10 と 10 を find_root()メソッドに引き渡す事で、根を探す区間を教えています2033

5.15 伝統的な書式で数学対象を表示

2034
2035
2036
2037

早くから、SAGE は数学的対象をテキスト書式か伝統的書式の何れかで表示出来る様にしていました。この点について、我々は通常はテキスト書式を用います。数学対象を伝統的な書式で表示したければ、show()函数が使えます。次の例題では数学式を生成し、それからテキスト書式と伝統的書式の両方で表示します：

2038
2039

var('y,b,c')z = (3*y^(2*b))/(4*x^c)^2

2040
2041
2042
2043

#テキスト書式で式を表示します。
z|3*y^(2*b)/(16*x^(2*c))

2044
2045
2046

#伝統的な書式で式を表示します。
show(z)|5.15.1 伝統的な数式で対象を表示する為に LaTeX を利用
2047
2048
2049

LaTex (ラテフと発音、 http://en.wikipedia.org/wiki/LaTeX)は文書作成言語で、莫大な数学記号を扱う事が出来ます。SAGE の対象は latex()メソッドが呼び出されると、対応する
LaTeX 表記を出力します。対象の LaTeX 表記は latex()函数からも得られます：

2050

a = (2*x^2)/7

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

2051
2052
2053

latex(a)|\frac{{2 \cdot {x}^{2} }}{7}2054

この結果を LaTeX に与えると、次に示す様な伝統的な数式出力を生成します：

89/158

2x 2
7
2055
2056
2057

図 2.5 で参照されている jsMath パッケージは SAGE のノートブックが LaTeX 入力を伝統的な数式に変換する為に用いているソフトウエアです。

5.16 集合2058

次の例題では SAGE が集合上で行える操作を示しています：

2059
2060
2061
2062
2063

a = Set([0,1,2,3,4])b = Set([5,6,7,8,9,0])a,b|({0, 1, 2, 3, 4}, {0, 5, 6, 7, 8, 9})

2064
2065
2066

a.cardinality()
|
5

2067
2068
2069

3 in a
|
True

2070
2071
2072

3 in b
|
False

2073
2074
2075

a.union(b)|{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

2076
2077
2078

a.intersection(b)|{0}v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

2079

6 2D 描画2080

6.1 plot() と show() 函数

90/158

2081
2082
2083
2084

SAGE は数学函数の 2D 描画を生成する為の沢山の方法を提供し、そのうちの一つが plot()函数を show()函数と絡めて用いる事です。次の例題では記号式を plot()函数の最初の引数として引き渡されることを示しています。第 2 の引数は X 軸上での描画の始点を指し、第 3 の引数が描画の終点を指します：

2085
2086
2087
2088
2089

a = x^2b = plot(a, 0, 10)
type(b)|<class 'sage.plot.plot.Graphics'>

2090
2091
2092

plot()函数は描画を表示する函数ではないことに注意してください。代わりに、それはsage.plot.plot.Graphics 型の対象を生成しますが、この対象は描画の与件を含んでいます。show()函数がこの描画の表示で使えるのです:2093

show(b)2094|

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

91/158

2095
2096
2097
2098
2099
2100

show()函数は xmin, xmax, ymin と ymax と呼ばれる 4 個の引数を持ち、これらは表示する
描画を調整するために用いられます。figsize 助変数もあり、これは画像の大きさを決定します。次の例では、xmin と xmax を X 軸上の 0 と.05 の間の描画を表示する様に用いています。plot()函数は入力の労を減らす為に show()函数への第 1 引数として用いる事が可能です(註：x 以外の任意の記号変数が用いられていれば、最初に var()函数を使って宣言を行っていなければなりません):

2101
2102
2103

v = 400*e^(-100*x)*sin(200*x)
show(plot(v,0,.1),xmin=0, xmax=.05, figsize=[3,3])|2104

引数 ymin と ymax は上の描画で表示される y 軸の大きさを調整する為に使えます：2105

show(plot(v,0,.1),xmin=0, xmax=.05, ymin=0, ymax=100, figsize=[3,3])

2106

|

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

92/1586.1.1 描画の結合と描画の色の変更
2107
2108

一つ、あるいはそれ以上の描画を纏めて一つの描画にする必要があるかもしれません。次の例では、show()函数を用いて 6 個の描画を結合します：

2109
2110
2111
2112
2113
2114
2115

var('t')p1 = t/4E5
p2 = (5*(t - 8)/2 - 10)/1000000
p3 = (t - 12)/400000
p4 = 0.0000004*(t - 30)
p5 = 0.0000004*(t - 30)
p6 = -0.0000006*(6 - 3*(t - 46)/2)

2116
2117
2118
2119
2120
2121

g1 = plot(p1,0,6,rgbcolor=(0,.2,1))
g2 = plot(p2,6,12,rgbcolor=(1,0,0))
g3 = plot(p3,12,16,rgbcolor=(0,.7,1))
g4 = plot(p4,16,30,rgbcolor=(.3,1,0))
g5 = plot(p5,30,36,rgbcolor=(1,0,1))
g6 = plot(p6,36,50,rgbcolor=(.2,.5,.7))

2122
2123

show(g1+g2+g3+g4+g5+g6,xmin=0, xmax=50, ymin=-.00001, ymax=.00001)|

v1.23 - 02/17/08

2124
2125
2126
2127
2128

はじめての SAGE（SAGE For Newbies)）

93/158

各描画の色は rgbcolor 助変数を用いて変更する事が出来ることに注意してください。RGB
は、赤、緑、青のタプルで成り立ち、rgbcolor 助変数には 0 から 1 の間の三つの値を割り当てます。最初の値は最初の値は、描画の赤をどの程度(0 から 100%の間)似するかを指定
し、二番目の値は描画の緑をどの程度にするかを指定し、それから三番目の値は描画の青をどの程度にするかを指定します。

6.1.2 グラフィックス対象とグラフィックスの結合
2129
2130

一つの画像に様々な種類のグラフィックスを纏めることはしばしば便利な事です。次の例では、6 点が描画されて、各点にはラベルがあります：

2131

"""

2132

次の点をグラフに描画:

2133
2134
2135
2136
2137
2138
2139

A (0,0)B (9,23)
C (-15,20)
D (22,-12)
E (-5,-12)
F (-22,-4)
"""

2140

# 複数のグラフィックス対象を持足せるためにグラフィックス対象を生成します。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

94/1582141
2142# これらのグラフィックス対象は同じ画像上に表示されます。
g = Graphics()

2143
2144
2145

# 点のリストを生成し、それらをグラフィックス対象に追加します。
points=[(0,0), (9,23), (-15,20), (22,-12), (-5,-12), (-22,-4)]
g += point(points)

2146
2147
2148

# 点のラベルをグラフィックス対象に追加します。
for (pnt,letter) in zip(points,['A','B','C','D','E','F']):g += text(letter,(pnt[0]-1.5, pnt[1]-1.5))

2149
2150

#結合したグラフィクス対象を表示します。
show(g,figsize=[5,4])

2151

|

2152
2153
2154
2155

最初に、空のグラフィックス対象を構築し、描画点のリストを point()函数を使って生成します。それから、これらの描画される点は+=演算子を使ってグラフィックス対象に追加されます。次に、各点のラベルはグラフィックス対象に for 文を使って追加されます。最後に、グラフィックス対象は show()函数を使ってワークシート上に表示されます。

2156
2157
2158
2159

表示し終わっても、グラフィックス対象はそれの中に置かれた全てのグラフィックスを含ん
でおり、その上、必要であればグラフィックスをさらに追加することが可能です。たとえば、点 C と D の間の線分を描く必要があれば、これを完遂する為に別のセルで次のコードを実行することが出来ます：

2160

g += line([(-15,20), (22,-12)])v1.23 - 02/17/08
2161
2162

2163
2164
2165
2166
2167

はじめての SAGE（SAGE For Newbies)）

95/158show(g)|

6.2 matplotlib による進んだ描画
SAGE は matplotlib (http://matplotlib.sourceforge.net)ライブラリを必要であれば描画で用い、もし、plot()が提供する機能以上の描画制御が必要になれば、matplot の機能を直接使うことが出来ます。matplotlib がどのように動作するかの完全な解説はこの本の程度を越えてしまうので、この節では貴方の手助けになりそうな例を示しておきます。

6.2.1 網目と軸のラベルを持ったリストデータの描画
2168
2169

x = [1921, 1923, 1925, 1927, 1929, 1931, 1933]y = [ .05, .6, 4.0, 7.0, 12.0, 15.5, 18.5]

2170
2171
2172
2173
2174

from matplotlib.backends.backend_agg import FigureCanvasAgg as \FigureCanvas
from matplotlib.figure import Figure
from matplotlib.ticker import *fig = Figure()v1.23 - 02/17/08
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187

はじめての SAGE（SAGE For Newbies)）

96/158canvas = FigureCanvas(fig)ax = fig.add_subplot(111)ax.xaxis.set_major_formatter( FormatStrFormatter( '%d' ))ax.yaxis.set_major_locator( MaxNLocator(10) )ax.yaxis.set_major_formatter( FormatStrFormatter( '%d' ))ax.yaxis.grid(True, linestyle='-', which='minor')ax.grid(True, linestyle='-', linewidth=.5)
ax.set_title('US Radios Percentage Gains')
ax.set_xlabel('Year')ax.set_ylabel('Radios')
ax.plot(x,y, 'go-', linewidth=1.0 )canvas.print_figure('ex1_linear.png')|

6.2.2 対数目盛の Y 軸を持った描画
2188
2189

x = [1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933]y = [ 4.61,5.24, 10.47, 20.24, 28.83, 43.40, 48.34, 50.80]

2190
2191
2192
2193
2194
2195
2196

from matplotlib.backends.backend_agg import FigureCanvasAgg as \FigureCanvas
from matplotlib.figure import Figure
from matplotlib.ticker import *fig = Figure()
canvas = FigureCanvas(fig)ax = fig.add_subplot(111)v1.23 - 02/17/08
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208

はじめての SAGE（SAGE For Newbies)）

97/158ax.xaxis.set_major_formatter( FormatStrFormatter( '%d' ))ax.yaxis.set_major_locator( MaxNLocator(10) )ax.yaxis.set_major_formatter( FormatStrFormatter( '%d' ))ax.yaxis.grid(True, linestyle='-', which='minor')ax.grid(True, linestyle='-', linewidth=.5)
ax.set_title('Distance in millions of miles flown by transport
airplanes in the US')ax.set_xlabel('Year')ax.set_ylabel('Distance')
ax.semilogy(x,y, 'go-', linewidth=1.0 )canvas.print_figure('ex2_log.png')|

6.2.3 描画の中にラベル付きの二つのグラフ
2209
2210
2211

x = [20,30,40,50,60,70,80,90,100]
y = [3690,2830,2130,1575,1150,875,735,686,650]z = [120,680,1860,3510,4780,5590,6060,6340,6520]

2212
2213
2214
2215
2216
2217

from matplotlib.backends.backend_agg import FigureCanvasAgg as \FigureCanvas
from matplotlib.figure import Figure
from matplotlib.ticker import *from matplotlib.dates import *fig = Figure()v1.23 - 02/17/08
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233

はじめての SAGE（SAGE For Newbies)）

canvas = FigureCanvas(fig)ax = fig.add_subplot(111)ax.xaxis.set_major_formatter( FormatStrFormatter( '%d' ))ax.yaxis.set_major_locator( MaxNLocator(10) )ax.yaxis.set_major_formatter( FormatStrFormatter( '%d' ))ax.yaxis.grid(True, linestyle='-', which='minor')ax.grid(True, linestyle='-', linewidth=.5)
ax.set_title('Number of trees vs. total volume of wood')
ax.set_xlabel('Age')ax.set_ylabel('')
ax.semilogy(x,y, 'bo-', linewidth=1.0 )ax.semilogy(x,z, 'go-', linewidth=1.0 )ax.annotate('N', xy=(550, 248), xycoords='figure pixels')
ax.annotate('V', xy=(180, 230), xycoords='figure pixels')
canvas.print_figure('ex5_log.png')|

98/158

v1.23 - 02/17/08

2234

はじめての SAGE（SAGE For Newbies)）

99/158

7 SAGE の書式

2235
2236
2237

SAGE はとても柔軟な環境なので、それ故に様々な利用方法があります。この章では二つのSAGE の構文書式について議論しますが、それらはスピード書式(Speed Usage Style)とOpenOffice プレゼン書式(OpenOffice Presentation Style)と呼びます。

2238
2239
2240

スピード書式は問題を可能な限り素早く解くことを目的に設計されており、結果の見栄えを良くする為に割く労力を最低にしています。この書式は通常の数学の教科書にある章末問題を解く事にとりわけ適しています。

2241
2242
2243

OpenOffice プレゼン書式は数学文書の作成能力がない人でも最小の労力で数学文書か書ける様に設計されています。このプレゼン書式はお家での宿題、報告書、記事や本等の作成に便利で、この本はこの書式を使って構築したものです。

2244
2245
2246
2247

7.1 スピード書式(まだ...)

7.2 オープンオフィスプレゼン書式(まだ...)

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

2248

8 高校数学の問題 ( 大半がまだ著作中 )2249

8.1 Pre-Algebra
Wikipedia entry.

2250

http://en.wikipedia.org/wiki/Pre-algebra(In development...)8.1.1 方程式
Wikipedia entry.
2251

http://en.wikipedia.org/wiki/Equation(In development...)8.1.2 式Wikipedia entry.
2252

http://en.wikipedia.org/wiki/Mathematical_expression(In development...)8.1.3 幾何学
Wikipedia entry.
2253

http://en.wikipedia.org/wiki/Geometry(In development...)8.1.4 不等式
Wikipedia entry.
2254

http://en.wikipedia.org/wiki/Inequality(In development...)8.1.5 線形函数
Wikipedia entry.
2255

http://en.wikipedia.org/wiki/Linear_functions(In development...)8.1.6 Measurement
Wikipedia entry.

http://en.wikipedia.org/wiki/Measurement

100/158

v1.23 - 02/17/08
2256

はじめての SAGE（SAGE For Newbies)）

101/158(In development...)8.1.7 非線形方程式
Wikipedia entry.
2257

http://en.wikipedia.org/wiki/Nonlinear_system(In development...)8.1.8 Number Sense And Operations
Wikipedia entry.

http://en.wikipedia.org/wiki/Number_sense

Wikipedia entry.

http://en.wikipedia.org/wiki/Operation_(mathematics)

2258(In development...)2259

8.1.8.1 分数の約分

2260
2261
2262

"""
問題:
90/105 を約分しなさい。

2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273

解:
この問題を解く一つの方法は、分子と分母の双方を素数因子に素因数分解して共通の因子を見つけて、それから分子と分母の双方をこれらの因子で割ってしまいます。
"""
n = 90d = 105
print n,n.factor()
print d,d.factor()|
Numerator: 2 * 3^2 * 5
Denominator: 3 * 5 * 7

2274
2275
2276
2277
2278

"""
分母と分子の双方に因子 3 と 5 が現れる事が分かり、そこで、分子と分母の双方を 3*5 で割ります："""
n2 = n/(3*5)

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

102/158

2279
2280
2281
2282
2283
2284

d2 = d/(3*5)
print "Numerator2:",n2
print "Denominator2:",d2|
Numerator2: 6
Denominator2: 7

2285
2286
2287

"""
それ故に, 6/7 が 90/105 の約分になります。

2288
2289
2290
2291
2292
2293

この問題はまた、単に 90/105 をセルの中に入れるだけでも解けます。何故なら、有理数対象
は自律的に約分されるからです："""
90/105|
6/7

8.1.9 多項式函数
Wikipedia entry.
2294
2295

(まだ...)

8.2 代数
Wikipedia entry.

2296

http://en.wikipedia.org/wiki/Polynomial_function

http://en.wikipedia.org/wiki/Algebra_1(まだ...)

8.2.1 絶対値函数
Wikipedia entry.
2297

http://en.wikipedia.org/wiki/Absolute_value(まだ...)

8.2.2 複素数
Wikipedia entry.
2298(まだ...)

http://en.wikipedia.org/wiki/Complex_numbers

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

8.2.3 合成函数
Wikipedia entry.
2299

http://en.wikipedia.org/wiki/Composite_function(まだ...)

8.2.4 Conics
Wikipedia entry.
2300

http://en.wikipedia.org/wiki/Conics(まだ...)

8.2.5 データ解析
Wikipedia entry.
2301

http://en.wikipedia.org/wiki/Data_analysis(まだ...)

9 離散数学：初等的数とグラフ理論
Wikipedia entry.
2302

http://en.wikipedia.org/wiki/Discrete_mathematics(まだ...)

9.1.1 方程式
Wikipedia entry.

http://en.wikipedia.org/wiki/Equation

2303(まだ...)

2304

9.1.1.1 記号分数の約分

2305
2306
2307

"""

2308
2309

解:

2310
2311
2312

var('a,b')n = 6*a^2 - a
d = b - 6 * a * b

問題:
式 (6*x^2 - b) / (b - 6*a*b) を約分しなさい。ここで a と b は正整数を表現します。

"""

103/158

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

104/158

2313
2314
2315
2316
2317
2318
2319
2320

print nprint "
print d
|

2321
2322
2323
2324
2325
2326
2327
2328
2329
2330

"""
分子と分母の双方の因子分解を始め、それから共通因子を探します："""
n2 = n.factor()
d2 = d.factor()
print "Factored numerator:",n2.__repr__()print "Factored denominator:",d2.__repr__()|
Factored numerator: a*(6*a - 1)
Factored denominator: -(6*a - 1)*b

2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342

"""
最初に、分子と分母の双方に何も共通因子が現れません。ところで、分子をもっと調べると、-1 を掛けることで(1 – 6 a)が見つけられるので、この(6 a – 1)が答で、この因子も分子に含まれています。だから、次の段階では分子と分母の双方に-1 を掛けます："""
n3 = n2 * -1
d3 = d2 * -1
print "Numerator * -1:",n3.__repr__()print "Denominator * -1:",d3.__repr__()|Numerator * -1: -a*(6*a - 1)
Denominator * -1: (6*a - 1)*b

2343
2344

"""
そこで、約分の為に分子と分母の双方が(6*a - 1)で割り切ることが出来ます：---------"

2
6 a - a--------b - 6 a b

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355

"""
common_factor = 6*a - 1
n4 = n3 / common_factor
d4 = d3 / common_factor
print n4print "
print d4
|

2356
2357
2358
2359
2360
2361
2362

"""
この問題は SymbolicArithmetic 対象を使うことで、より直接的に解けます："""z = n/dz.simplify_rational()
|
-a/b

2363

9.1.1.2 二つの記号分数の積を計算

105/158

---"

- a
--b



x 2 4y 2 3
 .

2y
3x

2364

次の計算を実行:

2365
2366
2367
2368

"""
記号式は通常自律的に簡易化されるので、この問題で実行されるべき全ての事は式を入力してある変数に割り当てる事です：
"""

2369
2370

var('y')a = (x/(2*y))^2 * ((4*y^2)/(3*x))^3

2371
2372
2373

#テキスト形式で式を表示:a|v1.23 - 02/17/08
2374

はじめての SAGE（SAGE For Newbies)）

106/158

16*y^4/(27*x)

2375
2376
2377

#伝統的な書式で式を表示：
show(a)|2378

9.1.1.3 x について線型方程式を解く

2379

3x2x−8=5x−3x7 を解け

2380
2381
2382
2383
2384
2385
2386

"""
この方程式を SymbolicEquation 対象として置くと、項の様に自律的に結合されます："""
a = 5*x + 2*x - 8 == 5*x - 3*x + 7a|7*x - 8 == 2*x + 7

2387
2388
2389
2390
2391
2392
2393

"""
最初に、方程式の左側に x の項を移動させる為に 2x を両側から引きます (註：下線記
号'_'は直前に実行されたセルの結果を保っています:"""_ - 2*x|
5*x - 8 == 7

2394
2395
2396
2397
2398
2399

"""
両側に 8 を加えます:
"""
_+8
|
5*x == 15

2400

"""

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

2401
2402
2403
2404
2405

最後に、解を決める為に両側を 5 で割ります：
"""
_/5
|
x == 3

2406
2407
2408
2409
2410
2411

"""
この問題は solve()を使うと自律的に解かれます："""
solve(a,x)|[x == 3]2412

9.1.1.4 分数を持つ線型方程式の解法

2413

16x−13 3x5 4−x
=
−
を解け
6
2
3

107/158

2414
2415
2416
2417
2418
2419
2420
2421

"""
最初の段階は方程式を SymbolicEquation 対象に置き換える事です。方程式を表示させる事は、方程式が正しく入力されたかを検証する事が出来るので良い思いつきです："""a = (16*x - 13)/6 == (3*x + 5)/2 - (4 - x)/3a|(16*x - 13)/6 == (3*x + 5)/2 - (4 - x)/3

2422
2423
2424
2425
2426
2427

"""
テキストとして方程式がされると、方程式が正しく入力されたかどうか確認する事は困難です。だから、伝統的な書式でも表示させましょう："""
show(a)
|

2428
2429
2430

"""
次の段階で、方程式の分母を消せるように最小公倍数(LCD)を計算しましょう："""

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

108/158

2431
2432
2433

lcm([6,2,3])
|
6

2434
2435
2436
2437
2438
2439
2440

"""
方程式の LCD は６なので、６を掛けて分数を消してしまいます："""b = a*6b|
16*x - 13 == 6*((3*x + 5)/2 - (4 - x)/3)

2441
2442
2443
2444
2445
2446
2447

"""
方程式の右辺にはまだ分数があるので展開してみましょう："""
c = b.expand()c|
16*x - 13 == 11*x + 7

2448
2449
2450
2451
2452
2453
2454

"""
11x を方程式の左辺に移す為に、SymbolEquation から 11x を引きます:"""d = c - 11*xd|
5*x - 13 == 7

2455
2456
2457
2458
2459
2460
2461

"""
-13 を方程式の右辺に移動させるために SymbolEquation に対して 13 を加えましょう:"""
e = d + 13e|
5*x == 20

2462

"""

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

109/158

2463
2464
2465
2466
2467
2468

最後に、SymbolEquation を５で割って、方程式の左側を x だけにすると解が得られます："""
f = e / 5f|x == 4

2469
2470
2471
2472
2473
2474

"""
この問題は solve()を使うと自律的に解かれます："""
solve(a,x)|[x == 4]9.1.2 指数函数
Wikipedia の見出
2475

http://en.wikipedia.org/wiki/Exponential_function(まだ...)

9.1.3 冪Wikipedia の見出.
2476

http://en.wikipedia.org/wiki/Exponent(まだ...)

9.1.4 式Wikipedia の見出.
2477

http://en.wikipedia.org/wiki/Expression_(mathematics)(まだ...)

9.1.5 不等式
Wikipedia の見出.
2478

(まだ...)

9.1.6 逆函数

http://en.wikipedia.org/wiki/Inequality

2479

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

Wikipedia の見出.

http://en.wikipedia.org/wiki/Inverse_function(まだ...)

9.1.7 線型方程式と函数
Wikipedia の見出.
2480

http://en.wikipedia.org/wiki/Linear_functions(まだ...)

9.1.8 線型プログラミング
Wikipedia の見出.
2481

http://en.wikipedia.org/wiki/Linear_programming(まだ...)

9.1.9 対数函数
Wikipedia の見出.
2482

http://en.wikipedia.org/wiki/Logarithmic_function(まだ...)

9.1.10 兵站函数
Wikipedia の見出.
2483

http://en.wikipedia.org/wiki/Logistic_function(まだ...)

9.1.11 行列
Wikipedia の見出.
2484

http://en.wikipedia.org/wiki/Matrix_(mathematics)(まだ...)

9.1.12 Parametric Equations
Wikipedia 見出.
2485

http://en.wikipedia.org/wiki/Parametric_equation(In development...)9.1.13 区分函数
Wikipedia 見出.

http://en.wikipedia.org/wiki/Piecewise_function

110/158

v1.23 - 02/17/08
2486

はじめての SAGE（SAGE For Newbies)）(In development...)9.1.14 多項式函数
Wikipedia 見出.
2487

http://en.wikipedia.org/wiki/Polynomial_function(In development...)9.1.15 冪級数函数
Wikipedia の見出.
2488

http://en.wikipedia.org/wiki/Power_function(In development...)9.1.16 Quadratic Functions
Wikipedia entry.
2489

http://en.wikipedia.org/wiki/Quadratic_function(In development...)9.1.17 Radical Functions
Wikipedia の見出.
2490

http://en.wikipedia.org/wiki/Nth_root(まだ...)

9.1.18 有理函数
Wikipedia の見出.
2491

http://en.wikipedia.org/wiki/Rational_function(In development...)9.1.19 列
Wikipedia の見出.
2492

http://en.wikipedia.org/wiki/Sequence(In development...)9.1.20 級数
Wikipedia の見出.
2493

(In development...)http://en.wikipedia.org/wiki/Series_mathematics

111/158

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

112/158

9.1.21 方程式系
Wikipedia の見出.
2494

http://en.wikipedia.org/wiki/System_of_equations(In development...)9.1.22 変換
Wikipedia の見出.
2495

http://en.wikipedia.org/wiki/Transformation_(geometry)(In development...)9.1.23 三角函数
Wikipedia の見出.
2496
2497

http://en.wikipedia.org/wiki/Trigonometric_function(In development...)9.2 Precalculus And Trigonometry
Wikipedia entry.

http://en.wikipedia.org/wiki/Precalculus
http://en.wikipedia.org/wiki/Trigonometry2498(In development...)9.2.1 二項定理
Wikipedia entry.
2499

http://en.wikipedia.org/wiki/Binomial_theorem(In development...)9.2.2 複素数
Wikipedia entry.
2500

http://en.wikipedia.org/wiki/Complex_numbers(In development...)9.2.3 合成函数
Wikipedia entry.
2501(In development...)http://en.wikipedia.org/wiki/Composite_function

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

9.2.4 Conics
Wikipedia entry.
2502

http://en.wikipedia.org/wiki/Conics(In development...)9.2.5 データ解析
Wikipedia entry.
2503

http://en.wikipedia.org/wiki/Data_analysis(In development...)10 離散数学: Elementary Number とグラフ理論
Wikipedia entry.
2504

http://en.wikipedia.org/wiki/Discrete_mathematics(In development...)10.1.1 方程式
Wikipedia entry.
2505

http://en.wikipedia.org/wiki/Equation(In development...)10.1.2 指数函数
Wikipedia entry.
2506

http://en.wikipedia.org/wiki/Equation(In development...)10.1.3 逆函数
Wikipedia entry.
2507

http://en.wikipedia.org/wiki/Inverse_function(In development...)10.1.4 対数函数
Wikipedia entry.
2508(In development...)10.1.5 兵站函数

http://en.wikipedia.org/wiki/Logarithmic_function

113/158

2509

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

Wikipedia entry.

http://en.wikipedia.org/wiki/Logistic_function(In development...)10.1.6 行列と行列代数
Wikipedia entry.
2510

http://en.wikipedia.org/wiki/Matrix_(mathematics)(In development...)10.1.7 数学的解析
Wikipedia entry.
2511

http://en.wikipedia.org/wiki/Mathematical_analysis(In development...)10.1.8 Parametric Equations
Wikipedia entry.
2512

http://en.wikipedia.org/wiki/Parametric_equation(In development...)10.1.9 区分函数
Wikipedia entry.
2513

http://en.wikipedia.org/wiki/Piecewise_function(In development...)10.1.10 Polar Equations
Wikipedia entry.
2514

http://en.wikipedia.org/wiki/Polar_equation(In development...)10.1.11 多項式函数
Wikipedia entry.
2515

http://en.wikipedia.org/wiki/Polynomial_function(In development...)10.1.12 冪関数
Wikipedia entry.

http://en.wikipedia.org/wiki/Power_function

114/158

v1.23 - 02/17/08
2516

はじめての SAGE（SAGE For Newbies)）(In development...)10.1.13 多項式函数
Wikipedia entry.
2517

http://en.wikipedia.org/wiki/Quadratic_function(In development...)10.1.14 Radical Functions
Wikipedia entry.
2518

http://en.wikipedia.org/wiki/Nth_root(In development...)10.1.15 有理函数
Wikipedia entry.
2519

http://en.wikipedia.org/wiki/Rational_function(In development...)10.1.16 実数
Wikipedia entry.
2520

http://en.wikipedia.org/wiki/Real_number(In development...)10.1.17 列
Wikipedia entry.
2521

http://en.wikipedia.org/wiki/Sequence(In development...)10.1.18 級数
Wikipedia entry.
2522

http://en.wikipedia.org/wiki/Series_(mathematics)(In development...)10.1.19 集合
Wikipedia entry.
2523(In development...)http://en.wikipedia.org/wiki/Set

115/158

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

116/158

10.1.20 方程式系
Wikipedia entry.
2524

http://en.wikipedia.org/wiki/System_of_equations(In development...)10.1.21 変換
Wikipedia entry.
2525

http://en.wikipedia.org/wiki/Transformation_(geometry)(In development...)10.1.22 三角函数
Wikipedia entry.
2526

http://en.wikipedia.org/wiki/Trigonometric_function(In development...)10.1.23 ベクトル
Wikipedia entry.
2527
2528

(In development...)10.2 解析
Wikipedia entry.

2529

http://en.wikipedia.org/wiki/Vector

http://en.wikipedia.org/wiki/Calculus(In development...)10.2.1 微分
Wikipedia entry.
2530

http://en.wikipedia.org/wiki/Derivative(In development...)10.2.2 積分
Wikipedia entry.
2531(In development...)10.2.3 極限

http://en.wikipedia.org/wiki/Integral

2532

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

Wikipedia entry.

http://en.wikipedia.org/wiki/Limit_(mathematics)(In development...)10.2.4 多項式近似と級数
Wikipedia entry.
2533
2534

(In development...)10.3 統計
Wikipedia entry.

2535

http://en.wikipedia.org/wiki/Convergent_series

http://en.wikipedia.org/wiki/Statistics(In development...)10.3.1 データ解析
Wikipedia entry.
2536

http://en.wikipedia.org/wiki/Data_analysis(In development...)10.3.2 Inferential Statistics
Wikipedia entry.
2537

http://en.wikipedia.org/wiki/Inferential_statistics(In development...)10.3.3 標準分布
Wikipedia entry.
2538

http://en.wikipedia.org/wiki/Normal_distribution(In development...)10.3.4 １変数解析
Wikipedia entry.
2539

http://en.wikipedia.org/wiki/Univariate(In development...)10.3.5 確率と試行
Wikipedia entry.

http://en.wikipedia.org/wiki/Probability

117/158

v1.23 - 02/17/08
2540

はじめての SAGE（SAGE For Newbies)）(In development...)10.3.6 ２変数解析
Wikipedia entry.
2541(In development...)http://en.wikipedia.org/wiki/Multivariate

118/158

v1.23 - 02/17/08

2542

はじめての SAGE（SAGE For Newbies)）

11 高校生の科学の問題

2543(In development...)2544

11.1 物理学
Wikipedia entry.

2545

http://en.wikipedia.org/wiki/Physics(In development...)11.1.1 原子物理
Wikipedia entry.
2546

http://en.wikipedia.org/wiki/Atomic_physics(In development...)11.1.2 円運動
Wikipedia entry.
2547

http://en.wikipedia.org/wiki/Circular_motion(In development...)11.1.3 力学
Wikipedia entry.
2548

http://en.wikipedia.org/wiki/Dynamics_(physics)(In development...)11.1.4 電磁界
Wikipedia entry.

http://en.wikipedia.org/wiki/Electricity
http://en.wikipedia.org/wiki/Magnetism2549(In development...)11.1.5 流体
Wikipedia entry.
2550(In development...)http://en.wikipedia.org/wiki/Fluids

119/158

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）11.1.6 運動学
Wikipedia entry.
2551

http://en.wikipedia.org/wiki/Kinematics(In development...)11.1.7 光
Wikipedia entry.
2552

http://en.wikipedia.org/wiki/Light(In development...)11.1.8 光学
Wikipedia entry.
2553

http://en.wikipedia.org/wiki/Optics(In development...)11.1.9 相対性理論
Wikipedia entry.
2554

http://en.wikipedia.org/wiki/Relativity(In development...)11.1.10 回転運動
Wikipedia entry.
2555

http://en.wikipedia.org/wiki/Rotational_motion(In development...)11.1.11 音響
Wikipedia entry.
2556

http://en.wikipedia.org/wiki/Sound(In development...)11.1.12 波
Wikipedia entry.
2557(In development...)11.1.13 熱力学

http://en.wikipedia.org/wiki/Waves

120/158

2558

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

Wikipedia entry.

http://en.wikipedia.org/wiki/Thermodynamics(In development...)11.1.14 仕事
Wikipedia entry.
2559

http://en.wikipedia.org/wiki/Mechanical_work(In development...)11.1.15 エネルギー
Wikipedia entry.
2560

http://en.wikipedia.org/wiki/Energy(In development...)11.1.16 モーメント
Wikipedia entry.
2561

http://en.wikipedia.org/wiki/Momentum(In development...)11.1.17 Boiling
Wikipedia entry.
2562

http://en.wikipedia.org/wiki/Boiling(In development...)11.1.18 浮力
Wikipedia entry.
2563

http://en.wikipedia.org/wiki/Bouyancy(In development...)11.1.19 Convection
Wikipedia entry.
2564

http://en.wikipedia.org/wiki/Convection(In development...)11.1.20 密度
Wikipedia entry.

http://en.wikipedia.org/wiki/Density

121/158

v1.23 - 02/17/08
2565

はじめての SAGE（SAGE For Newbies)）(In development...)11.1.21 Diffusion
Wikipedia entry.
2566

http://en.wikipedia.org/wiki/Diffusion(In development...)11.1.22 Freezing
Wikipedia entry.
2567

http://en.wikipedia.org/wiki/Freezing(In development...)11.1.23 摩擦
Wikipedia entry.
2568

http://en.wikipedia.org/wiki/Friction(In development...)11.1.24 熱伝導
Wikipedia entry.
2569

http://en.wikipedia.org/wiki/Heat_transfer(In development...)11.1.25 Insulation
Wikipedia entry.
2570

http://en.wikipedia.org/wiki/Insulation(In development...)11.1.26 Newton の法則
Wikipedia entry.
2571

http://en.wikipedia.org/wiki/Newtons_laws(In development...)11.1.27 圧力
Wikipedia entry.
2572(In development...)http://en.wikipedia.org/wiki/Pressure

122/158

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）11.1.28 プーリー
Wikipedia entry.
2573(In development...)http://en.wikipedia.org/wiki/Pulley

123/158

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）2574

12 計算の基礎

2575

12.1 計算機ってなあに

124/158

2576
2577
2578
2579
2580
2581

多くの人々は計算機が複雑である為に理解し難いと思っています。計算機は実際に複雑ですが、これが理解し難くしている理由ではありません。計算機が理解し難いのは、実体のある世界には計算機の小さな部分しか存在しないからです。実体としての計算機は人間が見ることの出来る部分でしかなく、計算機の残りは不可視の実体の無い世界に存在するからです。
この不可視の世界は概念（イデア）の世界であり、計算機の大半は概念としてこの実体の無い世界にあるのです。

2582
2583
2584
2585

計算機を理解する為の鍵は、概念に基づく機械の目的が全ての型の概念の自動操作である事を理解する事にあります。'計算機’と言う名前は計算機が現実に何であるかを描くには余り助けになるものではなく、寧ろ、概念操作機器(Idea Manipulation Device)、即ち、IMD と言う名前の方が良いでしょう。

2586
2587
2588

さて、概念は実体の無い対象なので、それらは実世界に持ち込めませんし、実世界の対象を概念の世界に持ち込む事も勿論出来ません。これらの二つの世界は互いに分離しているので、実世界の対象は記号による遠隔制御で概念の世界の対象を操作する事になります。

2589
2590
2591

12.2 記号 (symbol) って何 ?
記号(symbol) は別の対象を表現する為に用いられる対象です。
例で、この記号は実際の電話を表現する為に用いています。

図 12.1 は電話の記号のv1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

125/158

図 12.1: 実体を持つ対象と関連付けられた記号

2592
2593
2594
2595
2596
2597

図 12.1 で示した電話の記号は通常、（紙の様な）平面上でインクで印刷される事で生成されています。一般的に、ある種の並びとして調整された実体を持つ物の任意の型（或いは、実体を持つ物の属性）は記号として用いる事が出来ます。

12.3 記号としてビットの並びを使う計算機実体のある物から出来上がった記号は全ての実体のある対象の型を表現出来ますが、それらはまた、概念の世界の実体を持たない対象を表現する事にも使えます( 図 12.2 参照)

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

実体のある世界での記号

126/158

概念という実体の無い世界

Pi
5

+

図 12.2: 実体のある記号は実体を持たない概念を表現出来る。

2598
2599
2600
2601
2602

実体を持ったものより構成された記号で最も単純なものの中はビット(0/1)とビット(0/1)の羅列です。ビット単体は on 状態と off 状態という二つの状態に単純に置き換えられます。
on の状態を書いたり、印字したり、表示すると、数値１で表現され、off の状態は数値０で表現されます。ビットの並びを書いたり、印字したり、表示すると次の様なものになります:
101, 100101101, 0101001100101, 10010.

2603
2604

図 12.3 はビットの並びが、実体を持たない概念を表現する為、実体を持つ任意のから構成された記号として簡単に用いられる事を示すものです。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

実体のある世界での記号

127/158

実体を持たない世界での記号10100101
101
00101100

11100101001010

10100101010
図 12.3: ビットは実体を持たない概念も表現出来る。
2605
2606
2607
2608
2609

実体を持ったものをビットやビットの並びとして構成する他の手法は:二つの周波数の間の音
声信号のトーンを変えたり、灯りを点けたり消したり、ある物体の表面上に磁場を置いたり取り除いたり、電子ディバイスで二つの水準の間で電圧を変えるといった方法があります。
大半の計算機が概念を表現するビットの並びを保つ為にさいごのしゅほうをもちいていま
す。

2610
2611
2612
2613
2614

計算機の内部記憶は様々な"箱”、つまり、記憶番地(memory location)と各記憶番地は概念を表現する為に用いることが可能なビットの並びで構成さています。大半の計算機は数百万の番地をもっており、同時に数百万の概念を参照する事が容易に行えます。より大きな計算機は数十億の記憶番地を持っています。例えば、２００７年版の典型的な個人向けの計算機は十億を越える記憶番地を持っています。

2615

図 12.4 に小さな計算機の内部記憶の断片にビットの並びが含まれている様子を示します。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

128/158

01000111
01010010
01001111
計算機内部記憶は記憶番地と呼ばれる” 箱”に置かれます。
ほとんどの計算機は数百万の記憶番地を持っています。

0010111001001000
01010100

計算機の各番地にはビットの並びがあります。

01000001
01001101
01000101
01000111
01000001
01010011

図 12.4: 計算機の記憶番地にはビットの並びがある。

2616
2617
2618

計算機内部記憶での何百ものビットの並びのそれぞれが、人間が思考し得る任意の概念を表現する能力を持っています。ほとんどの計算機が保有する莫大なビットの並びは、ある種の組織化された体系を使わず配置を保つことは困難です。

2619
2620

計算機が保持する沢山のビットの並びを保つ為に用いている体系は、図 12.5 に示す様な一意な番地を各記憶番地に与えるものです。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

01000111

1101010010

10

01001111

900101110

8

01001000

701010100

6

01000001

5

01001101

4

010001013

010001112

01000001

1

010100110129/158

各記憶番地は計算機がそれを指し示せる様に一意に番地が与えられています

図 12.5:各記憶番地には一意に番地が与えられます。

2621

12.4 文脈的意味

2622
2623
2624

この点で、貴方は”記憶番地のビットの並び、すなわち、記憶番地の集まり、意味をどのように決定しするの？”と不思議に思うかもしれません。この答えはビットの並びに意味を与える文脈的意味付けと呼ばれる概念になります。

2625
2626

文脈は状況の中で生じた事象、あるいは何かが置かれた環境のことです。文脈的意味付は、すなわち、文脈中に置かれた事象や物事に対して与える意味付のことです。

2627
2628
2629
2630

大半の人々が日々文脈的意味付を用いていますが、それに皆が気付いていません。文脈的意
味付は非常に強力な概念であり、人間が思い浮かべられる任意の概念と計算機の記憶位置を結び付けるものです。 もし、一つの記憶で与えられた並びを保つ為により多くのビットが必要であれば、その並びは一つの場所以上に広げられるのです。

2631
2632
2633
2634

12.5 変項
計算機は数を覚えておくことがとても得意なので、簡単に膨大な番地を覚えられます。人間は、残念なことに計算機の様に数を覚える事は然程得意ではないので、この問題を解決する為に変項と呼ばれる概念が発明されました。.

v1.23 - 02/17/08
2635
2636
2637

はじめての SAGE（SAGE For Newbies)）

130/158

変項は数の代わりに名前を使って記憶の中のビットの並び記号を人間が参照できる記憶番地に結びつけられる名前です。 図 12.6 に計算機内部での４つの記憶番地に結びつけられた四個の変項を示しておきます。

01000111

1101010010

10

01001111

900101110

8

01001000

701010100

6

01000001

5

01001101

4

010001013

010001112

01000001

1

01010011

0

変項
y
x

車庫 _ 長さ
車庫 _ 幅図 12.6: 記憶番地の代わりに変項を使うこと
2638
2639
2640
2641

車庫_幅と車庫_長さと言う名前の変項は車庫の大きさを表現する並びが保存されている記
憶番地を参照し、変項 x と y は方程式に於ける数を表現するような記憶番地を参照しています。上の変項の記述が正確であるものの、これはさすがに使うには冗長で、人々が”変数「車庫_長さ」は車庫の長さである”の様な発言や記述には時間がかかります。

2642
2643
2644
2645
2646
2647

変数は記号的に対象の属性を表現する為に用いられます。典型的な個人向けの計算機でさえも数百万もの変数を擁する能力があるとはいえ、大半の対象が、ほとんどの計算機が擁することのできる能力以上の莫大な属性を所有しています。例えば、１キログラムの岩はおおよ
そ、 10,000,000,000,000,000,000,000,000 個の原子を含んでいます。この岩の原子の位置を表現することでさえも、最も進んだ計算機の能力を凌駕しているのです。それ故に、計算機は通常、対象の完全な表現の代わりにモデルを用いて作業するのです。

2648
2649
2650

12.6 モデル
モデルは対象の簡易化した表現で、対象のある種の属性のみに注目したものです。典型的な対象の属性としては、重さ、長さや色彩が含まれます。 モデルの為に選択される属性は所定

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

131/158

2651
2652
2653
2654

の目的の為に選ばれます。 モデルで表現される属性を増やせば増やす程、モデルの構築は高くつきます。 それ故に、所定の目的を達成する上で絶対的に必要とされる属性のみがモデル
で通常表現されるのです。対象の属性の幾つかだけをモデルの構成時に選択する行為を抽象化と呼びます。

2655
2656
2657
2658

次の例はモデルを用いて問題を解く手順を描いたものです。2 台の車が入る車庫を作ることを考えましょう。この車庫には車に沿って工作台、対の収納庫に芝刈り機があります。この倉庫は適切な天井の高さがあり、最初に述べた目的に必要な大きさ以上の車庫を作る気が無いと仮定すると、車庫の適切な長さ幅をどの様に決めれば良いでしょうか?

2659
2660
2661
2662

車庫の大きさを決定するための一つの戦略は広い野原で大体 10 個のいろいろな大きさの車庫を作ることです。まず、車庫を作り終えると、二台の車を工作台、対の倉庫と芝刈り機と一緒に原っぱに置きます。それから、これらの物を車庫に交互に入れて、引っかからずに適合するもっとも小さな車庫を探します。

2663
2664
2665

原っぱのテスト車庫は破棄しても良く、選択した物と同じ大きさの車庫を希望する場所に建てられます。不幸にして、一つではなく 11 個の車庫がこの方式では必要で、これは非常に高価で非効率でしょう。

2666
2667
2668

この問題を費用をかけずに解く方法は車庫のモデルとその中に置く物のモデルを用いることです。車庫の床の大きさを決めたいだけなので、紙を使って床の縮小モデルを作ることが
出来ます。

2669
2670
2671
2672
2673

車庫に据える物も紙で縮小したもので表現する事が出来ます。すると、これらの物を表現す
る紙製のものは床を表現する大きな紙の上に置く事ができ、紙の小物はどうすれば適合するかを見るために動かす事が出来ます。もし、これらの小物があまりにも窮屈であれば、床を表現する為に、より大きな紙を切れば良く、スカスカであれば、床の為により小さな紙を切れば良いのです。

2674
2675
2676

丁度良い具合になったら、床を表現する紙の長さと幅を計って、それらを実際の車庫向けに使える様に拡大します。この手法では、あとで捨ててしまう 10 個の実物の車庫の代わりに、幾らかの紙だけが問題を解くために必要とされます。

2677
2678
2679
2680

紙の小物に複製された実物大の対象の属性は対象の長さと幅でした。この例で示す様に、紙のモデルはそれらが表現する対象よりも明らかに作業し易いものです。ところで、計算機変数は紙、あるいは他の大半のモデル手法よりもモデル化で扱うにはより簡単なものです。

v1.23 - 02/17/08

2681
2682
2683
2684
2685
2686

はじめての SAGE（SAGE For Newbies)）

132/158

この点で、紙モデル化の技術は我々が注目している計算機変数について一つの重要な長所があります。紙モデルは小物のモデルを動かしたり、紙の車庫の床の大きさを変更することによって変更可能です。我々が議論する変数は対象属性を表現する為に与えられた能力がありますが、変数を変更する為の与えられた機構はありません。その変数の内容を変更する能力を持たない計算機は現実的に利用価値がありません。

12.7 機械語

2687
2688
2689
2690

計算機の記憶番地のビットの並びが人間が思考出来る任意の概念を表現する為に使えると以前述べました。記憶番地が任意の概念を表現していれば、それらが概念を参照できる事を意味し、この参照は計算機が自律的に記憶の中の変数をどの様に操作するか計算機に指図する
命令(instruction)になります。

2691
2692
2693

記憶の中の命令に追随する計算機の側は中央演算装置(CPU)、すなわち、マイクロプロセッサと呼ばれます。マイクロプロセッサが記憶の中の命令を追随しているときに、それらを走らせているとか実行しているとも呼びます。

2694
2695
2696
2697
2698
2699
2700
2701
2702

マイクロプロセッサはファミリーに分類され、各マイクロプロセッサのファミリーはそれ自身の命令の集合(命令集合:instruction set と呼ばれます)を持っており、他のマイクロプロセッサのファミリーが用いている命令とは異なっています。マイクロプロセッサの命令
集合はマイクロプロセッサに何をさせるかを伝えることが出来る組み上げた積木の様な言語を表現します。この言語は記憶に送り込まれる命令集合からの命令列で構成されており、マイクロプロセッサが理解できる唯一の言語です。これはマイクロプロセッサが理解できる唯一の言語なので、機械語と呼ばれます。計算機にやらせることを伝える為の機械語の命令の列は計算機プログラムと呼ばれ、計算機にやらせることを伝えるための機械語の命令の列を作成する人はプログラマーと呼ばれます。

2703
2704

そこで、単純なマイクロプロセッサの命令集合がどのようなもので、この命令集合を使って構築された単純なプログラムを見てみましょう。

2705

これがマイクロプロセッサ 6500 ファミリーの命令集合です：

2706
2707
2708
2709
2710

ADC
AND
ASL
BCC
BCS

キャリー付きで記憶を加算器に追加(ADd memory to accumulator with Carry)。
記憶と加算器の AND をとる(AND memory with accumulator)。
1 ビット算術的にずらす(Arithmetic Shift Left one bit)。
キャリークリアなら分岐(Branch on Carry Clear)。
キャリーセットなら分岐(Branch on Carry Set)。

v1.23 - 02/17/08
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747

BEQ
BIT
BMI
BNE
BPL
BRK
BVC
BVS
CLC
CLD
CLI
CLV
CMP
CPX
CPY
DEC
DEX
DEY
EOR
INC
INX
INY
JMP
JSR
LDA
LDX
LDY
LSR
NOP
ORA
PHA
PHP
PLA
PLP
ROL
ROR
RTI

はじめての SAGE（SAGE For Newbies)）

133/158

結果が零に等しければ分岐(Branch on result EQual to zero)。
加算器のビットをメモリと比較(test BITs in accumulator with memory)。
結果が負になれば分岐(Branch on result MInus)。
結果が零に等しくなければ分岐(Branch on result Not Equal to zero)。
結果が正なら分岐(Branch on result PLus)。
force Break.
オーバーフローフラグがクリアであれば分岐(Branch on oVerflow flag Clear)。
オーバーフローフラグがセットされれば分(Branch on oVerflow flag Set)。
キャリーフラグのクリア(CLear Carry flag)。
十進モードをクリア(CLear Decimal mode)。
インタラプトディセイブルフラグをクリア(CLear Interrupt disable flag)。
オーバーフローフラグをクリア(CLear oVerflow flag)。
記憶と加算器を比較(CoMPare memory and accumulator)。
記憶と X レジスタを比較(ComPare memory and index X)。
記憶と Y レジスタを比較(ComPare memory and index Y)。
記憶を１減算(DECrement memory by one)。
レジスタ S を 1 減算(DEcrement register S by one)。
レジスタ Y を１減算(DEcrement register Y by one)。
記憶と加算器の XOR を取る(Exclusive OR memory with accumulator)。
記憶に 1 加算(INCrement memory by one)。
レジスタ X に 1 加算(INcrement register X by one)。
レジスタ Y に 1 加算(INcrement register Y by one)。
新しい記憶位置に跳ぶ(JuMP to new memory location）。
新しいサブルーチンに跳ぶ(Jump to SubRoutine)。
記憶から加算器に読込み(LoaD Accumulator from memory)。
記憶から X レジスタに読込み(LoaD X register from memory)。
記憶から Y レジスタに読込み(LoaD Y register from memory)。
論理的 1 ビット右にずらし(Logical Shift Right one bit)。
無操作(No Operation)。
記憶と加算器の OR を取る(OR memory with Accumulator)。
スタックに加算器のものを押し出す(PusH Accumulator on stack)。
スタックにプロセッサ状態を押し出す(PusH Processor status on stack)。
スタックから加算器に取り込み(PuLl Accumulator from stack)。
スタックからプロセッサ状態に取り込み(PuLl Processor status from stack)。
1 ビット左にずらしてビット列を回します(ROtate Left one bit)。
1 ビット右にずらしてビット列を回します(ROtate Right one bit)。
インタラプトから復帰(ReTurn from Interrupt)。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

134/158

2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761

RTS
SBC
SEC
SED
SEI
STA
STX
STY
TAX
TAY
TSX
TXA
TXS
TYA

2762
2763

次は 6500 ファミリーの命令集合を使って書かれた小さなプログラムです。プログラムの目的
は 16 進数の番地 0200 から始まる記憶に置かれた 10 個の数の和を計算する事です。

2764
2765
2766

ここで、記憶の中の 10 個の数(これらは青で表示しています)が記憶位置にあり、そこに総和が保管されます(これは赤字で表示されています)。ここで 0200 は記憶の中の最初の数の番地
です。

2767
2768
2769

0200

2770
2771
2772
2773
2774
2775
2776
2777
2778
2779

0250
0252
0254
0255
0258
0259
025B
025D
0260
...

2780
2781

このプログラムが実行されたあとに、それが計算した和は記憶に蓄えられます。和は 16 進数
で 37(十進数なら 55)になり、ここでは赤で示しておきます：

サブルーチンから復帰(ReTurn from Subroutine)。
キャリーで減算(SuBtract with Carry)。
キャリーフラグのセット(SEt Carry flag)。
十進モードのセット(SEt Decimal mode)。
インタラプトディセイブルフラグのセット(SEt Interrupt disable flag)。
加算機の内容を記憶に保全(STore Accumulator in memory)。
X レジスタの内容を記憶に保全(STore Register X in memory)。
Y レジスタの内容を記憶に保全(STore Register Y in memory)。
加算機の内容をレジスタ X に転送(Transfer Accumulator to register X)。
加算機の内容をレジスタ Y に転送(Transfer Accumulator to register Y)。
スタックポインタの内容を X レジスタに転送(Transfer Stack pointer to register X)。
X レジスタを加算器に転送(Transfer register X to Accumulator)。
X レジスタをスタックポインタに転送(Transfer register X to Stack pointer)。
Y レジスタを加算器に転送(Transfer register Y to Accumulator)。

01 02 03 04 05 06 07 08 - 09 0A 00 00 00 00 00 00................

これらの 10 個の数の和を計算するプログラムです：
A2 00
A9 00
18
7D 00 02
E8
E0 0A
D0 F8
8D 0A 02
00

LDX #00h
LDA #00h
CLC
ADC 0200h,X
INX
CPX #0Ah
BNE 0255h
STA 020Ah
BRK

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

135/158

2782

0200

2783
2784
2785

もちろん、貴方にこのアセンブリ言語のプログラムがどの様に働くかを理解することを期待していません。それを貴方に示した目的は、この様なマイクロプロセッサーの命令集合を使ったプログラムがどの様なものであるかを貴方に見て頂く為です。

2786

低水準言語と高水準言語

2787
2788
2789
2790
2791

プログラマはその命令集合の命令を使って計算機のプログラムが出来ると入っても、これはうんざりする作業です。初期の計算機プログラマはマイクロプロセッサが理解できる機械語
よりも自然言語、例えば英語にもっと似た言語でプログラムを開発することを望んでいました。機械語は低水準言語として考えられています。何故なら、それはマイクロプロセッサの回路で簡単に実行できる様に単純に設計されているからです。

2792
2793
2794
2795
2796

プログラマはそこでプログラムで彼らが使いたい高水準言語を低水準言語を使って作り上げる事を思いました。こうして、FORTRAN (1957 年)、ALGOL (1958 年)、LISP (1959年)、COBOL (1960 年)、BASIC (1964 年) と C (1972 年)か作られました。不幸なことに、マイクロプロセッサは機械語しか理解できないので、高水準言語で記述された全てのプログラ
ムはマイクロプロセッサで実行出来る様に機械語に変換しなければなりません。

2797
2798
2799
2800

与えられたプログラミング言語向けにプログラムでどの様に入力するかを指図する規則のことを構文規則と呼びます。もしも、プログラマがプログラムの記述時に言語の構文規則に従わなければ、ソースコードを機械語に変換するソフトウエアが混乱し、所謂、構文エラーを返すことになります。

2801
2802
2803
2804

構文エラーがどの様な物であるかを示す例として、'印刷する'と云う言葉を考えてください。もし、'印刷する'という言葉が所与のプログラム言語の命令であったとしましょう。そこでプログラマーが'印刷する'の代わりに'印刷すろ'と打ち込んでしまうと、これが構文エラーになるわけです。

2805
2806
2807
2808
2809
2810

01 02 03 04 05 06 07 08 - 09 0A 37 00 00 00 00 00..........7.....

12.8 コンパイラとインタプリタ
高水準言語から機械語に変換する為に用いられるプログラムに通常二種類あります。最初の種類がコンパイラと呼ばれ、高水準言語のソースコード(通常は入力された書式です)をその入力として機械語に変換します。ソースコードと同値な機械語が生成されたのちに、それが計算機の記憶に読込まれて実行されます。コンパイルされたプログラムはまた記憶装置にも保存可能で、そうすることで必要な時なら何時でも計算機の記憶に読込む事が出来ます。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

136/158

2811
2812
2813
2814
2815
2816

第二の機械語へ高水準言語を変換することに通常用いられる第二のプログラムの種類はインタプリタと呼ばれます。コンパイラがする様なソースコードを機械語に変換する代わりに、
インタプリタはソースコードを読み取り(通常は一度に一行)、ソースコードの一行で遂行すべきとされる処理を決定し、それからこれらの処理を実行します。そして、その下にある
ソースコードの次の行を見つけると、プログラムのこの次の行で望まれる事の処理を決定す
ると、これらの処理を実行し、以下同様となります。

2817
2818
2819

幾千もの計算言語が１９４０年代から生成されていますが、２から 3 百程度の歴史的に重要な言語が現在あります。ここで歴史的に重要な計算機言語の一覧を掲げるウエブサイトのリンクがあります：http://en.wikipedia.org/wiki/Timeline_of_programming_languages

2820

12.9 アルゴリズム

2821
2822
2823

計算機プログラマは少なくとも一つのプログラム言語は知っている必要がありますが、プログラム間が問題を解く時には、より抽象的な計算機言語よりも抽象性ではより高度な水準でそれを遂行します。

2824
2825
2826

問題が解かれたのちには、その解がプログラム言語として展開されているのです。それはプログラマがあたかも二人の人であるかのようです。最初の人間は問題を解く人であり、第二の人はプログラム作成者です。

2827
2828
2829

単純な問題では、多くのプログラマが心の中でアルゴリズムを生成し、それらのアルゴリズ
ムを直接プログラム言語に展開します。この過程での問題を解く人とプログラム作成者との間を切り替えています。

2830
2831
2832
2833

複雑なプログラムになると、流石に、この問題を解く局面とプログラム作成の局面がより分離します。与えられた問題を解くアルゴリズムはプログラム言語よりも意味を用いて開発され、それは文書の中に記録されます。この文書は問題を解く人からプログラム言語への展開を行うプログラム作成者への橋渡しとなっています。

2834
2835
2836
2837
2838
2839
2840
2841

ある問題に対して問題を解く人が最初に行うことは分析です。これは殊に重要な段階です。
というのも、問題を分析しなければ、適切に解く事が出来ないからです。あるものを分析するということは、構成部品にバラバラに分解して、これらの部分についてそれ等がどのようにして動くかを定める為に研究する事を意味します。有名な文句は'分解して征服せよ'で、だから、難しい問題を分析する時には問題全体を解くよりも、それぞれをより単純にして小さな問題にバラバラにしてしまいます。問題を解く人は、より単純な問題をそれぞれ解くアルゴリズムを開発し、それから、これらのアルゴリズムを結合して、問題全体に対する回を構成するのです。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

137/158

2842
2843
2844
2845

アルゴリズム(「ある-ご-りずむ」と発音します)は命令の列であり、この命令は与えられた作業をどのように達成するかを記述したものです。これらの命令は(英語の様な)自然言語による記述、それらの図式の描画、プログラム言語の記述を含めた様々な方法で 表現されてい
ます。

2846
2847

アルゴリズムの概念は数学者が数学の問題、例えば、二つの数の和やそれ等の積と云った様なものを解く為に開発した様々な手続に由来します。

2848
2849
2850

アルゴリズムはより一般的な問題にも使う事が可能です。例えば、紙モデルを使った車庫の大きさの問題を解きたいと考えている人にとって、次のアルゴリズムに従うことが出来るも
のです：

2851

1) 車庫に据え付ける小物の長さと幅を計って、これらの計測量を記録します。

2852
2853

2) 第一からの計測量を 100 で割って、それから、元の小物のモデルとして使えるような大きさに合致する紙片を切り出す。

2854
2855

3) 紙片を切り出します。ここで紙片は長さを一番大きな車のモデルの長さの 1.5 倍、幅を 3倍とし、車庫の床モデルとします。

2856
2857

4)車庫床のモデルに車庫の扉を配置し、鉛筆を使ってその位置に印を付け、その紙の区画と鉛筆の印の間にちょうど入るように車庫の床モデルの上に両方の車を置きます。

2858

5)

2859
2860

6)小物のモデルを、それら全てが、この大きさの車庫の中で適合する様に、この空いた場所
でいろいろな位置に動かしてみます。

2861

7)受け入れられるものであれば段階 10 に行く。

2862
2863

8)車庫が窮屈だったら、車庫モデルの床の長さ、幅(あるいはその両方)を 10%増やして新しい床モデルを作って段階 4 に行く。

2864
2865

9)もし、車庫に余裕が有り過ぎれば、車庫の長さ、幅(あるいはその双方)を 10%減らして、新しい車庫の床モデルを生成し、段階 4 に行きます。

紙の床もデルの上の車が占有していない空いている場所に小物を置きます。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

138/1582866
286710)車庫の床モデルの長さと幅を計測し、これらを本来の大きさに拡大して戻し、これらの大きさの車庫を建てます。

2868
2869
2870
2871

この例で見る事が出来る様に、アルゴリズムは往々にして、かなりの数の段階を含みます。
何故なら、望ましい解を導出するに十分な程、詳細でなければならないからです。これらの段階を発展させて文書に記録したあとでやっと、その与えられた問題を解かなければならない人々が、幾度も、その手順に従うことになるのです。

2872

12.1 計算

2873
2874
2875

人間がどのようにしてアルゴリズムの各段階に従うかを理解することはわりと容易な事ですが、計算機のマイクロプロセッサが単純な機械言語の命令だけしか処理できない時に、これらの段階をどのように計算機が処理をするのかを理解することはより難しいことです。

2876
2877
2878
2879

マイクロプロセッサがアルゴリズムの各段階をどのようにして処理が出来ているかを理解する為には、計算(これは演算としても知られています)とは何であるかを最初に理解しなければなりません。インターネット上でこれらの言葉のよい定義を探し、どう言っているかを読んでみましょう。

2880

計算(computation)と言う言葉には二つの定義があります：

2881
2882
2883

1) 固定された規則に従った数や記号の操作。通常、算術的電子計算機の操作に対して使われるが、心や脳で処理されたある種の過程の実行にも使われる。
( www.informatics.susx.ac.uk/books/computers-and-thought/gloss/node1.html )

2884
2885
2886

2) 計算は計算機と呼ばれる閉じた物理系内部で生じる純粋な物理的現象として観察できる。このような物理系の例としては、デジタル計算機、量子計算機、DNA 計算機、分子計算機、アナログ計算機や、wetware 計算機がある( www.informatics.susx.ac.uk/books/computers-and-thought/gloss/node1.html )

2887
2888
2889
2890
2891
2892

これらの二つの定義は”計算が決まった規則に基づいた数や記号の操作”であり、"計算機と呼ばれる閉じた物理的系内部での物理的現象として観察される"ということを指しています。双方の定義は、我々が通常計算機と呼んでいる機械が計算機という一つの種族であり、閉じた物理系の他の種族もまた計算機として動作することが出来ることを意味しています。その他の計算機というものには DNA 計算機、分子計算機、アナログ計算機やwetware 計算機(すなわち、脳)が含まれます。

2893
2894

演算(calculation)の次の二つの定義は、通常の計算機、脳や他の種類の計算機を統べるものに光を当てるものです：

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

139/158289528961)演算は一つ、あるいはそれ以上の入力を一つそれ以上の結果に変換する内的な手続である。
( en.wikipedia.org/wiki/Calculation )

2897
2898

2)演算：計算する手続き；数学的、あるいは論理的手法によって何かを決定すること( wordnet.princeton.edu/perl/webwn )

2899
2900
2901
2902
2903

演算に関するこれらの定義によると、”一つ、あるいはそれ以上の入力を一つ、あるいはそれ以上の結果に変換する内的な手続”であり、これは”数学的、あるいは論理的”に実行されるということを指しています。我々は脳が計算を実行する為に、どの様な数
学的、論理的なものを用いるかをまだ完全に理解していませんが、この領域は急激に展開されている状態です。

2904
2905

演算の第二の定義では論理的という言葉を使っており、話を進める前に、この言葉の定義が
必要です：

2906
2907
2908
2909
2910

論理系は規則の全体を構成するもので、その体系の中での任意の意味付に用いられなければなりません。数学の大半が良く理解された規則の構造上を根底とし、高度に論理的なものとして考えられています。任意の論理が適用される以前に、どの規則が用いられるかを述べた
り、理解しておく必要が常にあります( ddi.cs.unipotsdam.de/Lehre/TuringLectures/MathNotions.htm )

2911
2912
2913
2914
2915
2916
2917

意味付(Reasoning)はその体系での一つの点から別の点へ動かす為の予め定義された規則を用いる手続の事です。例えば、人が紙片の二つの数を足し合わせる時に、それらは正しい和を得る為の和のアルゴリズムの規則に従わなければなりません。和のアルゴリズム規則がその論理であり、誰かが演算の間に、これらの規則を適用する時、これらは規則によって意味付けられています。 ここで、計算機がアルゴリズムの段階を、そのマイクロプロセッサが単純な機械語命令が実行出来るだけの時に、どの様にして実行するかという疑問に対して、これらの概念を適応してみましょう。

2918
2919

人がアルゴリズムを開発するとき、アルゴリズムの段階は通常、各作業を実行する為に必要なより小さな段階の全てを含まない、高水準の作業として述べられています。

2920
2921
2922
2923

例えば、ある人が"ニューヨークからサンフランシスコ迄の運転”という手引を書こうとします。この大きな手引は"その交差点を左に曲がり、西に 10 キロ進め等"の手順を含むより小さな手引に落とせます。大きな手引の全ての小さな手引が完成されれば、大きな手引も完成されます。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

140/158

2924
2925
2926
2927
2928
2929

この大きな運転の手引を使わなければならない人は通常、それを完遂する為に遂行しなければならない小さな手引を思い描く事が出来なければなりません。計算機は非常におバカなので、任意のアルゴリズムは計算機上で実行出来る以前に、アルゴリズムの段階がより小さな段階に分けられて、それらの小さな段階がまたさらに小さな段階に分けられて、それらの段
階がマイクロプロセッサの命令集合で実行されるのに十分に小さなものになっていなければなりません。

2930
2931
2932

ある場合は、いくつかの小さな段階が大きな段階を実装する上で必要なだけかもしれません
が、一方では数百、数千のより小さな段階が必要とされます。数百、数千の小さな段階は、アルゴリズムが機械語に変換される時に数百、数膳の機械語命令に変換されます。

2933
2934
2935
2936

機械語は計算機でプログラム出来る唯一の言語であれば、人間によって計算機に送り込まれるアルゴリズムの殆どが大き過ぎるものになるでしょう。高水準言語で記述されたアルゴリ
ズムはしかしながら、機械語で必要とされるより小さくて沢山の段階に分割する必要があり
ません。

2937
2938
2939

高水準言語で実装されるアルゴリズムを分解するという大変な作業は自律的にコンパイラや
インタプリタで実行されます。これが時間の大半をプログラマが機械語の代わりに高水準言語を使って開発する理由です。

2940
2941
2942
2943
2944
2945
2946
2947

12.2 アルゴリズムの記録に図式が使える
前に、英語の様な自然言語でアルゴリズムは記録できるだけではないと述べましたが、図式を使って記録する事も出来ます。貴方は、殆ど図式に基づく言語が創られていて、プログラ
ムが用いているアルゴリズムを含めて、'問題を解く人'がプログラムを設計出来ることを学べば驚くかもしれません。この言語は UML と呼ばれ、Unified Modeling Language(統合モデル化言語)の事です。UML 図式の一つは活動図式(activity diagram)と呼ばれ、幾つかの論理の組の段階(即ち、活動(activity))の列を示すことが出来ます。次の例は、アル
ゴリズムが活動図式でどの様に表現されるかを示すものです。

12.3 1 から１０までの数の総和を計算
2948
2949
2950

分析や求解の前に問題で実行されなければならない第一のことは、明確に、そして明瞭に問題を記述することです。ここではアルゴリズムを使って求解する問題の短い陳述を挙げてお
きます：

2951

陳述： この問題では、１から 10 の間に含まれる数の総和を決定することが必要とされる。

v1.23 - 02/17/08

2952
2953

はじめての SAGE（SAGE For Newbies)）

141/158

これはかなり単純な問題なので、分析にたっぷり時間を使う必要はありません。 図 12.7 に活動図式に置き換えた、この問題を解くアルゴリズムを示しています。
論理の開始点( 黒丸で示され
ます )

変数
試行箱

変数 sum に０を置く

1 count:: sum に加えられる現時点の数を

変数 count に１を置く

変数 ( それらの解説も含め )は、それらがアルゴリズムで矢印はアルゴリズム 必要になって生成されると、の論理の流れを示し 一覧で記録されます。
ます。

角が丸い長方形はアルゴリズムの段階 / 活動を含む。.

ダイアモンドは分岐による決定や、論理の流れへの融合の為に用いられます。

変数
0 sum: 和を保存します
保持し、そして、和の反復処理から抜ける
べき時点を決定するために用いられますCount をsumに加え、結果をsum に戻す
図式で前の処理に戻る
矢印は反復処理を示します。

count. に
1 加える[count が 11 に等しくない ]論理の終点( 二重丸で表示）鈎括弧内部の文は論理的流れの分岐が生じる条件を示します。

図 12.7: あるアルゴリズムの活動図式
2954
2955
2956
2957
2958
2959

アルゴリズムと活動図式は同時に開発されます。開発途上、変数は必要に応じて生成され、それらの名前は通常、それらの陳述に沿ったリストに記録されます。開発者は定期的に出発点から開始して、それが正しい事を確認する為に論理的に一通り試してみます。
試行箱は各変数の隣に置かれて、論理が変数をどのように変更するかを記録と更新ができるようになっています。一通り試している間に、誤りが見つかると、これらは流れの矢印を動かして、活動長方形の内部の文言を調整して修正しなければなりません。

v1.23 - 02/17/08
2960
2961
2962
2963

はじめての SAGE（SAGE For Newbies)）

142/158

論理で間違いがないことを見つけると、開発者は問題を解く人でありつづける事を止めて、アルゴリズムをプログラミング言語でプログラムするプログラマに引き渡す事が可能になります。

12.4 数学計算系の数学の部分

2964

数学は”並びの科学”とし記述されます。ここで並びの定義ですが：

2965
2966

1) 体系的整理...
(http://www.answers.com/topic/pattern)

2967

そして、系の定義は：

2968

1) 相互作用し、相互に関連し、あるいは互いに依存しあい、複雑な全体を構成する要素の一群。

2969
2970

2) 相互の関連する概念や原理の体系化された集合。
(http://www.answers.com/topic/system)

2971
2972
2973
2974
2975
2976

それ故に、数学は物理的と非物理的対象の組織的な属性を扱う科学として考えられます。
数学は非常に強力なので、全ての物理的、及び非物理的対象は組織的な属性を有し、それゆえに数学は、理解されて操作され得るこれらの対象によって、ひとつの平均値となります。
数学を知れば知るほど物理的世界に対して制御できるようになります。このことが数学をもっとも有用なものの一つで人間が得ることの出来る知識の中で興味深い領域にしているの
です。

2977
2978
2979
2980

伝統的に、数学は、人手の計算による数学に必要な、ワクワクすることでもなければ複雑なアルゴリズムを散々学ぶことを要求しました。典型的な数学の教科書の 50％以上の内容が手書に基づくアルゴリズムの教示に割かれ、その上、教科書を通じた勉強では、より高い割合
でこれらのアルゴリズムを人手で操作することに費やされています。

2981
2982
2983

ほとんどの人にとって、退屈な学習や実習、複雑な手計算アルゴリズムはあまりにも複雑
で、心を踊らす事のない退屈なことで、決して数学のとてつもなく面白く、強力で、美しい側面を見る機会を持つことがないのです。

2984
2985
2986

悪いことに、手書中心の計算アルゴリズムは常にワクワクするものでもなく、複雑で退屈なものです。良いことは数学計算環境の発見によって人々が手書中心のアルゴリズムを使う必要性が目立って減少した事です。

v1.23 - 02/17/08

2987

はじめての SAGE（SAGE For Newbies)）

143/158

13 SAGE サーバーの立ち上げ

2988
2989

前節で示した様に、大半の人々が最初に SAGE をウエブサービスとして使い、この本の冒頭で読者は既に SAGE サーバーに接続したと思っても良いでしょう。

2990
2991
2992
2993
2994

この節は自分自身の SAGE サーバが欲しい人向けのもので、Windows や Linux 上での、入手、インストール、設定と保守を範囲とします。SAGE ノートブックサーバはインターネット技術に基づくので、この節はこれらの技術の幾つかを包含することで始めましょう。SAGE の構成の高水準な俯瞰は SAGE 配布ファイルに含まれている議論でつづけられるでしょう。最後に、Linux と Windows を基盤とする SAGE サーバー双方の立ち上げも包含します。

13.1 インターネットに基づく技術への入門
2995
2996
2997
2998
2999

インターネットは現在、我々の文明の最重要の技術の一つであり、その重要性は今後増大する一方でしょう。実際、インターネットは非常に迅速に拡大しており、次の資料では、やがて殆ど全ての計算機器がそれに繋がる事を示しています( https://embeddedjava.dev.java.net/resources/waves_of_the_internet_telemetry.pdf )
。

3000
3001

だから、インターネットに関連する技術がどの様に働くのかを理解する事は計算機を使って仕事をすることに興味を持つ人々にとって価値のある事です。

3002
3003
3004
3005
3006

インターネットがどの様に創造されたかという歴史を理解する事も価値がありますが、我々はここで、この歴史を議論をするつもりはありません。何故なら、よそできちんと文書としてまとめられているからです。私は貴方がインターネットの歴史についてインターネットの検索を使って、貴方が見つけた記事を読む事を高く勧めます。そうする事が貴方の時間の優れた投資となる事を私が保証します。

13.1.1 複数の計算機はどの様にして互いに通信するの?
3007
3008
3009
3010
3011

二つの計算機だけが互いに通信する必要がある時、状況は単純です。何故なら、必要とされる全ての事は通信媒体（電線、光ファイバーケーブルや無線信号といった代物）で互いをつなげる事です。一方の計算機から出発した情報はもう一つの計算機に送り込まれる云々です。しかし、複数の計算機が互いに通信しなければならない状況であればどうでしょうか？
この問題を解く方法は沢山ありますが、最も一般的な方法が図１１で示す方法です:

3012
3013
3014

図 11 には、複数の計算機が所謂、局所ネットワーク、即ち、LAN と呼ばれるもので繋がっている様子を示しています。LAN は互いに物理的に閉じた複数の計算機（通常は同じ部屋や同じ建物の中）で構成され、通信媒介として用いられる物で互いに結合されています。図v1.23 - 02/17/08
3015
3016

はじめての SAGE（SAGE For Newbies)）

144/158

13.1 では計算機は銅線のイサーケーブルを使って switch と呼ばれる機器に繋げられています。

Local Area Network ( LAN )Sage Server B
DHCP
Server

DNS
Server

PC #1
銅線の
イーサー
ケーブル

ゲートウエイ

インターネット

SwitchPC #2
Sage Server A
Sage Server C
PC #3

PC #4

図 13.1: 局所ネットワーク(LAN)
3017
3018
3019

ネットワーク上の計算機は伝言を用いて互いに通信しますが、伝言を送る事は文通の手紙に似ています。switch の目的はそれに送り込まれる各伝言を監視し、その伝言が送り込まれるべき計算機を決定し、それからその伝言を当の計算機に送り込みます。

3020
3021
3022
3023
3024
3025
3026

図 11 のモデルには問題があります。というのは、このネットワーク上の各計算機に結びつけられた名前がそれらをユニークに同定することに、計算機の数が数百、数千に増加してしま
えば不向きになるからです。これはさておき、絵の右側の雲はインターネットとそれに接続されている数百万の計算機(これらはホストとも呼ばれます)を表現しています。インター
ネット上の各計算機がある方法でユニークに同定されれば、伝言はまたこれらの計算機に送られたり、これらから受け取られたりする事が出来ます。これはさておき、伝言がどの様にして交換されるべきかという規則も存在していなければなりません。

13.1.2 TCP/IP プロトコルについて
3027
3028
3029

インターネットが出現する以前、二つの解決すべき問題は 1)各計算機をユニークに同定する必要があったことと 2)どのようにメッセージが交換されるかを取り決める通信規則(プロトコルとも呼ばれます)を発達させる必要でした。インターネットのお陰で、プロトコルは

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

145/158

3030
3031
3032
3033

「系の間の通信の為にキチンとした書式を定義する規則の集合」(
www.unitedyellowpages.com/internet/terminology.html )として定義することができます。プロトコルの数は互いに用いられるときに、それらはプロトコル集(protocol
suite)と呼ばれます

3034
3035
3036
3037
3038
3039
3040
3041
3042

インターネット向けに発達したプロトコル集は TCP/IP と呼ばれ、その名前は、この集まりの中で最も煩雑に用いられる二つの名前の組み合わせです(TCP は転送制御プロトコル(Transmission Control Protocol)で、IP は Internet Protocol によります）。イ
ンターネットプロトコルは番地系を用いてインターネット上の計算機をユニークに同定する方法を定義しています。 IP version 4 (Ipv4)、これは現在もっとも広く用いられている
IP プロトコルの版で、ドットで区切った 0 から 255 の間の 4 個の数字で構成されています。IP アドレスの例には 207.21.94.50、 54.3.59.2 と 204.74.99.100 があります。0.0.0.0
から 255.255.255.255 までも全ての IPv4 アドレスが番地空間を生成し、 ここには
4,294,967,296 番地あります。

3043
3044
3045
3046

IP version 6 (IPv6) は IP プロトコルの最新版で、その番地空間が保有する番地は340,282,366,920,938,463,463,374,607,431,768,211,456 番地です！ IPv4 から IPv5 へのい
こうは始まっていますが、ゆっくりとしています。 大半のインターネット上のホストは長い間 IPv4 を使い続けており、それ故に、IPv4 はこの文書でも使われています。

3047

図 13.2 には 図 13.1 で示されたネットワークと同じモデルを含んでいますが、各計算機はIPv4 番地を使った局所ネットワーク( LAN )207.21.94.4
207.21.94.100

DHCP
Server

147.15.50.2

207.21.94.2

Sage Server B

DNS
ServerPC #1
207.21.94.1

銅線

SwitchGateway

PC #2

207.21.94.182

207.21.94.127

Sage Server A

インターネット

Sage Server C
PC #3

PC #4

207.21.94.72

207.21.94.214

図 13.2: IP アドレス

98.1.200.129

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

146/158

3048

IPv4 番地が割り当てられています：

3049
3050
3051
3052
3053

もし、PC #3 が PC #4 に伝言を送る必要があれば、PC #4 の IP アドレス(これは207.21.94.214 です)に宛てて伝言を送り込みます。送り手の IP アドレス(207.21.94.72)もまた、PC #4 が返事を送る必要があった場合に備えて、伝言の中に置かれます(これは返送先の番地を手紙に添えておくことと同様です)。PC #3 はそれから switch に伝言を送り、switch は伝言の送り先の番地を探し、それから PC #4 に伝言を引き渡します。

3054
3055
3056

もし、この局所ネットワーク上の一つの計算機が、その LAN 上にない計算機に伝言を送る必要があれば、その伝言はゲートウエイ計算機に送られて、そのゲートウエイはそれからその伝言をインターネットに流します。

13.1.3 クライアントとサーバー
3057
3058
3059
3060

LAN 上やインターネット上で、組織化された計算機同士が通信する幾つかの方法があり、そして、それらの組織の事を構成(architecture)と呼びます。 一つの構成は Peer-toPeer(P2P)とよばれ、ネットワーク上の計算機を互いに情報を交換する等価なものとして扱います。P2P アプリケーションの例はインスタントメッセージングです。

3061
3062
3063
3064
3065

ネットワーク上の計算機を使った別の構成はクライアント−サーバと呼ばれます。クライア
ント・サーバー構成では、サーバーはネットワーク上の他の計算機の要求を受け入れる計算機で、要求された仕事を果たし、請求者に向けて作業結果を返します。クライアントは計算機で、サーバーに要求を送って、応答を受け取って、それから応答に含まれている情報を利
用します。

3066
3067

図 11 に示す LAN では、三個のサーバ(DHCP サーバー、DNS サーバと SAGE サーバー)と四個のクライアントがあります。DHCP と DNS サーバーは次の二つの節で議論しましょう。

13.1.4 DHCP
3068
3069
3070
3071
3072

DHCP は Dynamic Host Configuration Protocol(動的ホスト設定プロトコル)の事で、その目的は LAN 上の計算機を立ち上げるときにネットワークの接続に必要な情報を使って自律的に設定させることです。 この情報には IP アドレス、ゲートウエイのアドレスに DNS
サーバーのアドレスが含まれます。 IP アドレスやゲートウエイが何であるかを我々は既に議論しています。DBNS サーバーは次の節で解説することにしましょう。

3073
3074

IP アドレスを持ってもいない(何故なら立ち上げだから)計算機がどの様にして IP アドレスを取得する為に DHCP サーバーと接続する為にネットワークが使えるかという点に疑問を感じv1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

147/158

3075
3076
3077
3078

るかもしれません。この問題は立ち上げ持の計算機が LAN に対して broadcast メッセージを流すことで解決されます。broadcast メッセージは LAN 上の特定の計算機に送られるもの
ではありません。その代わりに、broadcast メッセージは LAN に対して送られて、LAN 上の全ての計算機がその伝言を受け取ります。

3079
3080
3081
3082

DHCP 要求伝言が LAN 上に送り込まれると、DHCP サーバーは他の計算機と同時に要求を受け取ります。その他の計算機は伝言の内容を読み、その DHCP 要求を含む伝言を見て、それを無視します。DHCP サーバーは、伝言の内容を読んで、その伝言がそれに対して意味することを理解すると、DHCP 設定情報を送り主に送り返すのです。

13.1.5 DNS
3083
3084
3085
3086

インターネット上の数百万もの計算機の各々がそれらの IP アドレスを使ってアクセスされます。例えば、sagemath.org ウエブサイトを包含するサーバーの IP アドレスは12.208.160.192 です。ウエブブラウザを立ち上げて、http://128.208.160.192/sageと入力すれば、貴方は直接このウエブサイトに接続できます。

3087
3088
3089
3090
3091
3092

莫大な数を覚えることは人間にとっては困難な事ですが、しかしながら、IP アドレス番号を使って関連付けた名前で構成された系がインターネット向けに生成されています。その系の名前が DNS で、Domain Name System のことです。一つ以上の IP アドレスに対応付けられた名前はドメイン名(domain name)と呼ばれ、頭に与えられた計算機のホスト名(とお尻にピリオド)があるドメイン名のことを fully qualified ドメイン名と呼びます。
ドメイン名の例としては：

3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103

gentoo.org
yahoo.com
sourceforge.net
google.com
sagemath.org
wikipedia.com
fully qualified ドメイン名の例は:
kiwi.gentoo.org.
loon.gentoo.org.
wren.gentoo.org.
DNS はインターネット全体に渡って分散した膨大なデータベースとして実装されています。

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

148/158

3104
3105
3106

ドメイン名は、それらを DNS 系に入れる前に、ドメイン名登録機関で登録しておく必要があります。ドメイン名登録会社の例には godaddy.com、 networksolutions.com とregister.com があります。

3107
3108
3109
3110
3111
3112
3113
3114
3115

図 12 の LAN 上の DNS サーバーは三つの機能を持っています。最初の機能はドメイン名を含む
クライアントからのメッセージを受理し、それらの名前に対応する IP アドレスを返すことです。利用者が sagemath.org の様なドメイン名をブラウザの URL バーに入力したときに、ブラウザはまだ SAGE ウエブサイトと接触出来ません。というのも、その IP アドレスを知らないからです。ブラウザが動作しているオペレーティングシステムは、そのために、ドメイン名
を(DHCP を通じて得た DNS サーバーの IP アドレスを使って)DNS サーバーに送りつけます。すると、DNS サーバーは sage.org ドメイン名に関連する一つ以上の IP アドレスを返します。そこで、システムは SAGE サーバーが乗っているサーバーと背食するために、これらの IP アド
レスを使います。

3116
3117
3118
3119
3120
3121
3122

局所 DNS サーバが持つ第二の機能は局所ネットワーク上の計算機に対応する IP アドレスに対してドメイン名を定義することです。もし、インターネット上で遠くにある計算機がその局所ネットワーク上のある計算機の IP アドレスを知りたがっているものの、DNS サーバがその対応を知らないとします。遠隔 DNS サーバが局所権威(authotative)DNS サーバに接触して、その対応がどうなっているかを尋ねます。そして、遠隔 DBS サーバは一定期間、今後、その遠隔ネットワーク上の計算機が対応関係を知る必要がある場合に備えて、この対応関係を覚えておきます。

3123
3124

第三の DNS サーバが持つ機能は IP アドレスを含む伝言を取得し、これらのアドレスに対応するドメイン名に返却することです。

13.1.6 プロセスとポート
3125
3126
3127

ここで、インターネットに関連するより重要な幾つかの技術について議論してきました
が、IP メッセージ(今後、メッセージとして参照します)が計算機に届いたときに何が生じ、ある計算機から送られたメッセージの前に何がメッセージを生成するかを話す時です。

3128
3129
3130

殆ど全ての個人向けの計算機では同時に計算喜寿尾で複数のプログラムを動かせます。ここでは典型的な利用者の計算機上で同時に動作しているプログラムのリストを挙げておきま
しょう：

3131
3132
3133

- ウエブブラウザ- インスタントメッセージクライアント- ワープロv1.23 - 02/17/08
3134
3135
3136

はじめての SAGE（SAGE For Newbies)）

149/158- ファイルダウンロードユーティリティ- 音楽ファイルプレイヤ
- ゲーム

3137
3138
3139
3140
3141
3142

殆どの計算機のオペレーティングシステムで、動作しているプログラムはプロセスと呼ばます。Windows では現時点で動作している全てのプロセスの一覧は<ctrl><alt>と<delete>キーを同時に押すことで起動するタスクマネージャーで見られます。 Linux の様な UNIX 系のシステムでは、動作しているプロセスの一覧は ps -e 命令を実行することで得られます。ここで、私が使っている Linux システム上で動作しているプロセスの一覧を示しておきましょ
う：

3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175

manage@sage:~$ ps -e
PID TTY
TIME CMD
1 ?
00:00:00 init
2 ?
00:00:00 ksoftirqd/0
3 ?
00:00:00 watchdog/0
4 ?
00:00:00 events/0
5 ?
00:00:00 khelper
6 ?
00:00:00 kthread
8 ?
00:00:00 kblockd/0
9 ?
00:00:00 kacpid
10 ?
00:00:00 kacpi_notify
67 ?
00:00:00 kseriod
100 ?
00:00:00 pdflush101 ?
00:00:00 pdflush102 ?
00:00:00 kswapd0
103 ?
00:00:00 aio/01545 ?
00:00:00 scsi_eh_0
1547 ?
00:00:00 scsi_eh_1
1728 ?
00:00:02 kjournald
1796 ?
00:00:00 logd
1914 ?
00:00:01 udevd
2611 ?
00:00:00 shpchpd
2620 ?
00:00:00 kpsmoused
3208 tty2
00:00:00 getty
3209 tty3
00:00:00 getty
3210 tty4
00:00:00 getty
3211 tty5
00:00:00 getty
3212 tty6
00:00:00 getty
3263 ?
00:00:00 dd
3265 ?
00:00:00 klogd
3345 ?
00:00:14 vmware-guestd
3381 ?
00:00:00 sshd
3404 ?
00:00:00 atd

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

150/158

3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194

3414 ?
3959 ?
4140 tty1
4141 tty1
4429 ?
4507 ?
4508 pts/1
4538 tty14541 tty14554 tty14555 tty14573 tty1
4574 tty1
4580 tty14591 tty1
4592 pts/2
4600 pts/2
4611 pts/2
4611 pts/1

3195
3196
3197

もし、貴方がこのリストの下側を見れば，SAGE ノートブックサーバと一書に SAGE が動作している事が分かるでしょう。ps 命令はそれ自身を一覧に含めていますが、その一覧が生成された時点で、それが動作していたからだということに注意してください。

3198
3199
3200
3201
3202

この一覧には四列あります。各プロセスには、プロセスが生成された時点で単一のプロセス
ID(PID)番号が与えられ、これらの番号は PID 列に挙げられています。TTY 列はプロセスが端末に結びつけられているかどうかと、もしも繋がっていれば、どの端末に結び付いているかを示しています。TIME 列は CPU 時間をそのプロセスが時間、分と秒でどれだけ使ったかを示しています。

3203
3204
3205

ネットワークから計算機にメッセージが届いたときに、計算機はどのプロセスがメッセージを受けとるかを判断しなければなりません。TCP/IP プロトコルはこの問題を解く手法で、ソフトウエアに基づく通信ポートを使います。

00:00:00 cron
00:00:00 dhclient3
00:00:00 login
00:00:00 bash
00:00:00 syslogd
00:00:00 sshd
00:00:00 bash
00:00:00 sage
00:00:00 sage-sage
00:00:00 python
00:00:05 sage-ipython
00:00:00 sh
00:00:00 sage
00:00:00 sage-sage
00:00:02 python
00:00:00 sage
00:00:00 sage-sage
00:00:06 python
00:00:00 ps

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

通信ポート

Port 10
Port 9Process 2348

Process 2023

計算機
の外
計算機
206.21.94.132
内部

Port 8Port 7
Port 6
Port 5
Port 4151/158

やってきた
伝言

通信
ケーブル

IP: 206.21.94.132
Port: 5
Data

Port 3
Process 2568

Port 2
Port 1
Port 0

図 13.3: 通信ポート
3206
3207
3208
3209
3210
3211

図 13.3 では、ネットワークに繋がった IP アドレスが 206.21.94.132 の計算機の中と外を示しています。通信ポートはプロセス間に置かれ、動いているプロセスは左側、右側にはネッ
トワーク接続があります。各ポートは最低のポート番号が 0 から最も高いポート番号が65535 で単一の番号が与えられています。ネットワークから届く各伝言は、その中にポート番号を持っており、その番号には系がどのポートが伝言が送ったたかが分かる様になってい
ます。

3212
3213
3214
3215

図 13.3 で、port 5 を行き先に持つ伝言がネットワークから到着しているので、系は port
5 にその伝言を送り込みます。process 2023 は系が port 5 に伝言を送り込んだ時点でそのポートに束縛され、process 2023 は伝言を受け取り、それからそれに含まれる情報を使って何かを実行します。

3216
3217

図 13.4 に IP アドレスが 65.2.8.3 を持つネットワーク上の別の計算機に送られた process
2023 からの伝言を示します。この伝言が目的の計算機に到達したときに、その伝言をそのv1.23 - 02/17/08
3218

152/158

はじめての SAGE（SAGE For Newbies)）

ポート 8 に置けば、port 8 に束縛されたその計算機のプロセスがある筈です。

通信ポート

計算機
206.21.94.132
内部

計算機の外

Port 10
Port 9Process 2348

通信線

Port 8
出て行く
伝言Port 7
Process 2023

Port 6
Port 5
Port 4

IP: 65.22.8.3
Port: 8
Data

Port 3
Process 2568

Port 2
Port 1
Port 0

図 13.4: 出ていった伝言

13.1.7 良く知られたポート, 登録されたポートと動的ポート,
3219
3220
3221
3222
3223

ここで、貴方はポートが何であり、それらに拘束されたプロセスがどうするかが分かっていますが、人がどのプロセスがどのポートに束縛されるべきかをどうやって決定するか不思議に思っているかもしれません。IANA(Internet Assigned Numbers Authority)と呼ばれる組織が、インターネットに関連する様々な手法、その一つが TCP/IP ポート手法ですが、に関して責任を持っています。IANA は 0 - 635535 ポート範囲を次の三つの区画に分けています：

3224

0 - 1023 ->3225

1024 - 49151 -> 登録されたポート

著名なポートv1.23 - 02/17/08
3226

はじめての SAGE（SAGE For Newbies)）

153/158

49152 - 65535 -> 動的、或いは個人的ポート

3227

13.1.7.1 著名なポート (0 - 1023)

3228
3229
3230
3231
3232
3233

IANA が管理している一覧には、どの種類のプログラムが、この範囲内の特定のポート番号に通常、束縛されるかが示されています。例えば、ウエブサーバは port 80 に束縛され、SSH(secure shell)サーバは port 22 に束縛され、FTP(ファイル転送プロトコ
ル:File Transfer Protocol)サーバは port 20 に束縛されて、DNS サーバーは port
53 に束縛されています。ここで、最初の 25 の著名なポートを示しますが、一覧全体はhttp://www.iana.org/assignments/port-numbers から入手できます:

3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259

キーワード
-------#
tcpmuxtcpmux#compressnet
compressnet
compressnet
compressnet
#
#
#
rje
rje
#
#
#
echo
echo
#
#
#
discard

十進数------0/tcp
0/udp
1/tcp
1/udp
2/tcp
2/udp
3/tcp
3/udp
4/tcp
4/udp
5/tcp
5/udp
6/tcp
6/udp
7/tcp
7/udp
8/tcp
8/udp
9/tcp

概要
----------Reserved
Reserved
Jon Postel <postel@isi.edu>
TCP Port Service Multiplexer
TCP Port Service Multiplexer
Mark Lottor <MKL@nisc.sri.com>
Management Utility
Management Utility
Compression Process
Compression Process
Bernie Volz <volz@cisco.com>
Unassigned
Unassigned
Remote Job Entry
Remote Job Entry
Jon Postel <postel@isi.edu>
Unassigned
Unassigned
Echo
Echo
Jon Postel <postel@isi.edu>
Unassigned
Unassigned
Discard

参照文献----------

v1.23 - 02/17/08
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296

discard#discard#[RFC4340]##
systatsystat###daytimedaytime
#
#
#
#
#
#
#
qotd
qotd
#
msp
msp
#
chargenchargen
ftp-data
ftp-data
ftp
ftp
#
ssh
ssh
#

はじめての SAGE（SAGE For Newbies)）
9/udp
9/dccp10/tcp10/udp11/tcp11/udp12/tcp12/udp13/tcp13/udp14/tcp14/udp15/tcp15/udp16/tcp16/udp17/tcp17/udp18/tcp18/udp19/tcp19/udp20/tcp20/udp21/tcp21/udp22/tcp22/udp154/158

Discard
Jon Postel <postel@isi.edu>
Discard SC:DISC
IETF dccp WG, Eddie Kohler <kohler@cs.ucla.edu>,
Unassigned
Unassigned
Active Users
Active Users
Jon Postel <postel@isi.edu>
Unassigned
Unassigned
Daytime (RFC 867)
Daytime (RFC 867)
Jon Postel <postel@isi.edu>
Unassigned
Unassigned
Unassigned [was netstat]
Unassigned
Unassigned
Unassigned
Quote of the Day
Quote of the Day
Jon Postel <postel@isi.edu>
Message Send Protocol
Message Send Protocol
Rina Nethaniel <---none--->Character Generator
Character Generator
File Transfer [Default Data]
File Transfer [Default Data]
File Transfer [Control]
File Transfer [Control]
Jon Postel <postel@isi.edu>
SSH Remote Login Protocol
SSH Remote Login Protocol
Tatu Ylonen <ylo@cs.hut.fi>

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

155/158

3297
3298
3299
3300
3301
3302
3303
3304

telnettelnet
#

3305
3306
3307
3308
3309

ネットワーク上の一つの計算機がネットワーク上の別の計算機上の特定のサービスを利用したいと希望したとき、最初の計算機は伝言を作成し、その伝言の中に希望するサービスのポート番号に置いて、それから伝言を行き先の計算機に送ります。もし、そのポート向けの著名なサービスを行うプロセスがそのポートに束縛されていれば、このプロセスがその伝言を受け取り、要求された作業を実行します。

3310
3311

著名なポート範囲内のポートに束縛されているプロセスについての主要な制約は、それらが特権利用者権限(super user priviledge)で動作していなければならないことです。

3312

13.1.7.2 登録されたポート (1024 - 49151)

3313
3314
3315

登録されたポートは著名なポートと同様に動作していますが、関連付けられたプロセスは
特権利用者権限で動作している必要がありません。登録されたポートの一覧は、著名なポートの一覧を含んでいるのと同じ IANA 文書に含まれています。

3316

13.1.7.3 動的/個人ポート (49152 - 65535)

3317
3318
3319

これらのポートは必要時応じて使われ、それらに関連する特定のプロセス型はありません。
この領域のポートの典型的な利用は、ウエブブラウザ向けにウエブサーバを用いた外部接続
です。

#
smtp
smtp

23/tcp23/udpTelnetTelnetJon Postel <postel@isi.edu>
24/tcpany private mail system
24/udpany private mail system
Rick Adams <rick@UUNET.UU.NET>
25/tcp
Simple Mail Transfer
25/udp
Simple Mail Transfer

13.1.8 SSH (Secure SHell) サービス
3320
3321
3322
3323
3324
3325

著名なポートを経由して利用されるサービスの例として、SSH(Secure Shell)サービスがあり、それは通常 port 22 に束縛されています。SSH サービスはネットワーク上の別の計算機から利用者がログインすることを許可します。遠隔計算機にログインする前に、利用者は利用者名とパスワードを知っていなければなりません。そして、遠隔計算機は(プロセスの形式で)動作し、port 22 に束縛された SSH サービスを持っていなければなりません。SSH は計算機間を、その間を行き来するデータの暗号化によって機密を守った接続が行え

v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

156/158

3326

ます。

3327
3328
3329
3330
3331

UNIX 系のシステムでは、SSH クライアントプログラムは単に SSH と呼ばれ、Windows システム
では、貴方は ssh サービスが動作している計算機にリモートでログインが行える様に
putty.exe と呼ばれるプログラムをダウンロードとインストールを行わなければなりません。この putty.exe プログラムは(
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html)から入手できます。

3332
3333
3334
3335

ssh クライアントプログラムが最初にリモートマシンにログインしようとする時、利用者にこのホストに対する暗号情報を現時点で持っていない事を告げて、続けるかどうかを尋ねます。"yes”と入力することで答えます。すると、このプログラムはこのホストに関する情報を既知のホストの一覧に追加し、その後は二度と質問をしません。

13.1.9 ネットワーク上の計算機間のファイルを複写する為の scp の利
用について
3336
3337
3338
3339

3340

SSH サービスは利用者が計算機にリモートログインを許容するだけではなく、ネットワーク
上の計算機の間のファイルの複写を行う為にも使えます。ファイル複写の為の Linux のクライアントプログラムは scp（Secure Copy）と呼ばれ、そして、人気のある Windows scp クライアントの pscp.exe は putty.exe と同じ url から入手出来ます。

13.2 SAGE の構成 ( まだ )v1.23 - 02/17/08

はじめての SAGE（SAGE For Newbies)）

Standard
PythonEnvironment

157/158

Sage notebook server“Expect”
Screenscraping
pseudo tty
connection

Sage preprocessor(x^2 converted to x**2, etc)

Parts of Sage which are implemented in Python
by the core Sage developers
Parts of Sage which are
implemented withpseudo tty-based
screen scraping connections
to various applications

Parts of Sage which are
implemented withmath-oriented
python modules

scipy“Expect”
Screenscraping
pseudo tty
connection“Expect”
Screenscraping
pseudo tty
connection“Expect”
Screenscraping
pseudo tty
connection

MaximaGap

etc.

図 13.5: SAGE の構成

mathplotlib

etc.

v1.23 - 02/17/08
3341
3342

3343
3344

はじめての SAGE（SAGE For Newbies)）

158/158

13.3 Linux に基づく SAGE 版(まだ...)

13.4 SAGE の VMware 仮想計算機版 ( 大半の Windows 利用者向け )(まだ...)