Professional Maxima〜あなたはまだマセ○ティカですか〜はしがき本書ははじめて Maxima を使う人を対象に、Maxima の基本的な使い方を解説しています。全三章で構成されており、各章の内容は次の通りです。
まず第 1 章は、主に Maxima の起動、終了の方法と、本書を読み進める上で欠くことのできない事柄について簡潔にまとめています。たった 6 ページしかありませんが、本書の核とも言えるきわめて重要な章です。
言うまでもなく、場当たり的な知識の詰め込みでは学習効果は上がりません。そこで第2 章では、Maxima を使いこなす上で必要となる基礎知識を体系的に解説しています。
最後の第 3 章は、具体的な数学の問題を Maxima を使って解いています。
「Maxima 実
演コーナー」であると同時に、Maxima の機能や性質を把握するための例示にもなっています。
入門書を名乗る多くの書籍を読んだとき、最初の方は内容がスカスカで退屈至極で、最後の方になると今度は中身が濃すぎてほとんど理解できなかった、といった感想を持つことがほとんどです。これは、系統的解説に終始するあまり、知識の量に対しその融合としてもたらされる内容の困難さが指数関数的に増大することを執筆者が十分認識していないことが原因です。そこで本書は、あとで解説する事柄でも無理のない範囲で先んじて取り上げることで、内容の濃淡を少なくし、無理せず退屈せず読み進められるように工夫しました。執筆者の独りよがりとも思える知識のひけらかしや、「実は役に立たない応用例」などは排除していますので、読者を選ばない解説書になっていると思います。
本書には間違いがたくさんあると思いますが、ご利用の際は「利用者責任の原則」でお願いします。

目次
第1章

Maxima へようこそ

1

1.1

Maxima の歴史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1

1.2

インストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2

1.3

起動と終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2

1.4

初めての Maxima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

1.5

オンラインヘルプ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

Maxima の基本

72.1

代入する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7

2.2

リスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

2.3

整数と多項式と有理式 . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

2.4

対数関数（logarithmic function） . . . . . . . . . . . . . . . . . . . . . .

19

第2章

2.5

三角関数（trigonometric function） . . . . . . . . . . . . . . . . . . . . .

22

2.6

繰り返しと条件分岐 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

2.7

ファイル操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

Maxima を俯瞰する

43

3.1

センター試験 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43

3.2

微分積分（極限） . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

50

3.3

微分積分（微分） . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

52

3.4

微分積分（積分） . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

55

3.5

行列（基本演算） . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

57

3.6

行列（生成） . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

3.7

行列（抽出と連結） . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

66

第3章

参考文献

71

索引

72

1

第1章

Maxima へようこそ
Maxima は、多項式や有理式、微分や積分、行列など様々な計算を実行することのできるアプリケーションソフトです。高額な値段で販売されている Mathematica や Maple と同種のソフトウェアですが、Maxima は GNU General Public License（GPL）を採用しており、「無料である」、「ソースコードが公開されている」、「（一定条件の下で）改変や再配布ができる」といった特徴があります。この章はたった 6 ページしかありませんが、この章を読み終えればすぐに Maxima を使い始めることができます。

1.1

Maxima の歴史

Maxima は、1968 年にマサチューセッツ工科大学（MIT）で開発が始まった Macsymaの子孫にあたります。Macsyma は 1982 年に DOE*1 版 と Symbolics 版に袂を分かち、それぞれ独自の進化を遂げていきます。 Symbolics 版は高速・高機能な数式処理ソフトとして販売されましたが、後発の強みからか Mathematica や Maple に市場を奪われる格好となり、現在は機能拡張も行われず細々と販売が続けられている状況です* 2 。一方、DOE
版は、独自にソースコードを所有していた William Frederick Schelter 氏が GNU Common

Lisp 環境へ移植するとともに、DOE と交渉し 1998 年には GPL で公開する許可を得るに至りました。これが Maxima の始まりです。
現在 Maxima は世界中のボランティアによって開発・保守が続けられており、成果物は公式サイト [1] で公開されています。

*1 U.S. Department of Energy（アメリカエネルギー省）*2 一旦、 1992 年に Macsyma Inc. に買収されましたが、 1999 年には Macsyma Inc. が Tenedos LLC に買収され、Symbolics 版 は再び Symbolics が販売するようになり、現在に至っています。ちなみに、Windows
版 Macsyma 2.4 の値段は 500 ドルです（2007 年 1 月現在）。なお、Macsyma の更に詳しい歴史については、例えば文献 [2] をご覧ください。

第1章

2

1.2

Maxima へようこそ

インストールMaxima は、Mac OS X を含む（おそらく）全ての UNIX 系 OS と Windows へインス
トールすることができます。Windows の場合は公式サイトで配布されているバイナリ・パッケージをインストールするのが簡単です。万一インストールに躓いたり、あるいはインストール前に手順を知っておきたいなどの場合はウェブページ [5] をご覧ください。

Mac OS X の場合、ソースコードからインストールすることも簡単に出来ますが、 Intel
Mac であればウェブページ [3] にバイナリ・パッケージを用意してあります。解凍して「アプリケーション」フォルダに入れるだけでインストールが完了します。PowerPC Macを使っている場合など、ソースコードからインストールしたい場合はウェブページ [4] などを参考にして下さい。
なお、Maxima はプログラミング言語 Lisp（List Processor もしくは List Processing

Language）で作成されていますが、ソースコードからインストールする場合は、様々なLisp の中から好みのものを選ぶことができるかもしれません。無料の Lisp としては、移植性の高さが売りの CLISP、動作速度が売りの CMUCL、SBCL、Maxima と同じ GPL を採用している GCL 等が有名です。また、有料のものでは Franz Inc. の Allegro CL が有名
です。

1.3

起動と終了

Maxima を起動するには、Windows の場合は「スタートメニュー」から Maxima を探し出し、「Command line Maxima」クリックします。また、UNIX 系 OS の場合は、ター
ミナル・アプリケーション*3 で maxima コマンドを実行してください。

yMaxima 5.14.0 http://maxima.sourceforge.netyUsing Lisp GNU Common Lisp (GCL) GCL 2.6.8 (aka GCL)
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
This is a development version of Maxima. The function bug_report()
provides bug reporting information.
(%i1)
y

y

Maxima を起動すると、入力行 (%i1) が現れますので、この後に続けて Maximaに実行させたい命令を入力します。試しに、 x4 − y4 を因数分解させてみましょう。
*3 コマンドプロンプトや kterm、 Terminal.app などのことをターミナル・アプリケーションと呼ぶことにします。

1.4 初めての Maxima

3

factor(xˆ4 - yˆ4);*4 と入力し、 Enter キーを押してみてください*5 。
(%i1) factor(xˆ4 - yˆ4); Enter22- (y - x) (y + x) (y + x )(%o1)

計算結果 −(y − x)(y + x)(y2 + x2 ) が出力されました。この例のように、Maxima は計算結果を一種のアスキーアートで出力します。不定積分

Z

√

1

x2 + 1

dx の場合は(%i2) ’integrate(1/sqrt(xˆ2 + 1), x);*6/[
1
I ------------ dx]
2/ sqrt(x + 1)(%o2)

と表示されます。美しさに欠ける反面、動作が軽快であるとか、テキスト文書にコピー・
ペースト出来るなどの実用的なメリットもあります。
一種の GUI フロントエンドである TeXmacs や Emacs Lisp である imaxima を使うと、出力結果を美しく表示することができます。
M AXIMA I NPUT /O UTPUT(%i1) factor(xˆ4 - yˆ4);−(y − x)(y + x) y2 + x2(%o1)

以下、本書では（説明のし易さを考慮し、）この「美しい方の出力」で Maxima の出力結果を表現することにします。

Maxima を終了するには quit(); を実行します。また、無限ループに入ってしまった
場合など、Maxima を強制終了したい場合は Ctrl + C キーを押します*7 。

1.4

初めての Maxima

Maxima はセミコロン（;）またはドル記号（$）までを 1 つの命令と見なします。普通はセミコロン（;）を用いますが、出力結果を表示させたくない場合（出力する必要がな
い場合）はドル記号（$）を用います。

*4 factor [fǽkt@r] 因数、約数、因数分解する。

*5 本書では、 Enter キーを押すことを強調する場合のみ、記号*6 integrate [ı́nt@grèit] 積分する（*7 環境によってはEnter を用いることにしています。

differentiate）。 sqrt = square root 平方根。

Ctrl + G で計算を中断することができるようです。

第1章

4

Maxima へようこそ

M AXIMA I NPUT /O UTPUT(%i1) diff(cos(x), x);*8− sin x(%o1)(%i2) diff(cos(x), x)$(%i3)

入力 (%i2) に対する出力行 (%o2) が表示されていないことに注目してください。
既に見ているように、Maxima では入出力に対し自動的に番号が振られて行きます。その番号を用いて、過去の入出力を参照することができます。
M AXIMA I NPUT /O UTPUT(%i3) factor(xˆ2 - yˆ2);
(%o3)
(%i4)

expand(%o3);*9−(y − x)(y + x)x2 − y2(%o4)

この例では、因数分解を実行した後、その結果 −(y − x)(y + x) を展開して元の式 x2 − y2に戻ることを確認しています。番号を付けずにパーセント記号（%）を用いると、直前の出力結果を参照することができます。従って、先の例は、
M AXIMA I NPUT /O UTPUT(%i3) factor(xˆ2 - yˆ2);(%o3)(%i4) expand(%);−(y − x)(y + x)(%o4)

x2 − y2と実行したことと同値です。
なお、Maxima はフリーフォーマットです。演算子、括弧等の間に半角スペースを入れたり、命令文が長い場合、途中で改行するなどして、見やすい書式で命令を記述することができます。

*8 diff = differential [dı̀f@rÉnS(@)l] 微分、差（*9 expand [ikspǽnd, eks-] 展開する。

integral）。

1.5 オンラインヘルプ

5メパーセント記号（%）は入出力参照の他、組み込み定数を表す場合にも用いられ

モ

ます。
命令

%e
%gamma
%i
%phi
%pi

1.5

意

味

!n
1
自然対数の底（Napier の数）：e = lim 1 +; 2.71828
n→∞
n
 n

X 1

Euler の定数：γ = lim − log n ; 0.57721
n→∞
k
k=1

虚数単位：i√1+ 5
黄金比：φ =
; 1.618032
円周率：π ; 3.14159

オンラインヘルプ

Maxima には非常に詳細なリファレンス・マニュアル maxima toc.html 等が付属していますが、Maxima の画面からもその内容を見ることが出来ます。書式?? 文字列 Enterにより実行すると、「文字列」を含む関数・変数の一覧が表示されます。ダブル・クエス
チョンマーク（??）の後ろに半角スペースを入れることに注意しましょう。また、一般の Maxima への命令と違いセミコロン（;）もドル記号（$）も不要です。試しに、文字列

prime を検索してみましょう。
M AXIMA I NPUT /O UTPUT(%i1) ?? prime Enter0: mod_big_prime :(maxima.info)Definitions for zeilberger.
1: next_prime :Definitions for Number Theory.
2: prev_prime :Definitions for Number Theory.
3: primep :Definitions for Number Theory.
4: primep_number_of_tests :Definitions for Number Theory.
Enter space-separated numbers, ‘all’ or ‘none’:
文字列 prime を含む関数・変数が 5 個ヒットしました。最後の行

Enter space-separated numbers, ‘all’ or ‘none’:

第1章

6

Maxima へようこそに注目してください。つまり、スペースで区切られた複数の番号（例えば「0 3 4」）を入力するか、all、もしくは none を入力せよ、と言って Maxima は入力待ち状態になっています。ここで、all を入力すると 0 から 4 までの全ての説明が出力され、none を入力すると何も出力せずにオンラインヘルプが終了します。試しに、3 を入力してみましょう。関数 primep*10 の解説が表示されるはずです。
M AXIMA I NPUT /O UTPUTEnter space-separated numbers, ‘all’ or ‘none’: 3 Enter- Function: primep (<n>)
Primality test. If ‘primep (n)’ returns ‘false’, <n> is
a composite number and if it returns ‘true’, <n> is aprime number with very high probability.
（後略）

(%o1)

false

出力の後半部分は省略しましたが、primep が素数テスト関数であること、そして、引数が合成数なら false を返し、高い確率で素数なら true を返すことなど、詳細な解説が出力されます。
以降の章で分からない命令があったら、迷わず「?? 文字列」を実行してください。
必ず必要な情報が見つかるはずです。なお、関数や変数の名前が分かっている場合は、「? factor」のようにシングル・クエスチョンマーク「? 名前」で調べることができます。

*10 primep = prime + probability: prime [práim] 素の。probability [prÀb@bı́l@ti] 確率、見込み。

7

第2章

Maxima の基本
Maxima には千を超える関数や変数が組み込まれています。その全てを使いこなした
いと考えるのはごく自然な発想ですが、実は、専門外の関数というのはあまり使う機会がありません。一生使わないかもしれません。
そこで、この章では、専門によらず利用される関数や変数のうち、Maxima を操作する
上での「いろは」とも言える基本的なものについて、実行例とともに体系的に解説していくことにします。

2.1

代入する

Maxima では変数や文字列への代入にコロン（:）を用います。
M AXIMA I NPUT /O UTPUT(%i1) x: 5;
(%o1)

5

(%i2) xˆ2;
(%o2)

25

逆に、代入されている値を消去するには関数 remvalue*1 を用います*2 。
M AXIMA I NPUT /O UTPUT(%i3) a: x;
(%o3)

5

(%i4) remvalue(x);
(%o4)

[x]

(%i5) xˆ2;
*1 remvalue = remove value*2 変数そのものを削除する関数 kill で代用しても良いでしょう。

第 2 章 Maxima の基本

8
x2

(%o5)
(%i6) aˆ2;

25

(%o6)

全ての変数（に代入された値）を消去するには remvalue(all) を実行します。ある変数に一時的に値等を代入したい場合は、関数 ev*3 を用いるのが簡単です。次の例は、多項式 x2 + x − 1 内の変数 x に x = 5 を代入しています。変数 x や a が変化していないことに注目してください。
M AXIMA I NPUT /O UTPUT(%i7) a: xˆ2 + x - 1;(%o7)(%i8) ev(a, x: 5);

x2 + x − 1
29

(%o8)
(%i9) x;x(%o9)(%i10) a;x2 + x − 1(%o10)

次のように ev() は省略することが出来ます。
M AXIMA I NPUT /O UTPUT(%i11) a, x: 5;29(%o11)(%i12) a, x: 10;

109(%o12)

関数 ev（もしくはそれを省略した命令）は非常に高機能で、本書でも今後様々な場面で登場するでしょう。これに対し、代入専用の関数 ratsubst*4 も用意されています。「式」
内の「変数」に「代入したいもの」を代入するには、

ratsubst(代入したいもの, 変数, 式);
により実行します。

*3 ev = evaluate [ivǽljuèit] 評価する。

*4 ratsubst = rational + substitute: subst = substitute [s2́bst@t(j)ù:t] 代入する、置換する。

2.1 代入する

9

M AXIMA I NPUT /O UTPUT(%i13) ratsubst(5, x, a);29(%o13)

関数 ratsubst は非常に強力で、例えば、式 cos2 x − cos x の cos2 x に 1 − sin2 x を代入することなども出来ます。
M AXIMA I NPUT /O UTPUT(%i14) cos(x)ˆ3 + cos(x)ˆ2;
cos3 x + cos2 x(%o14)(%i15) ratsubst(1 - sin(x)ˆ2, cos(x)ˆ2, %);(%o15)− sin2 x + cos x (1 − sin2 x) + 1

変数に様々な値を代入して式の値を調べたい場合は、式を関数として定義しておくと良いでしょう。Maxima では記号 := で関数を定義します。
M AXIMA I NPUT /O UTPUT(%i16) f(x):= 3*x + 1;(%o16)

f (x) := 3 x + 1(%i17) f(1);(%o17)

4(%i18) f(2);(%o18)

7

多変数関数を定義するには、変数をカンマ（,）で区切って f(x, y, z) のようにします。また、変数の個数が可変の（一定でない）関数を定義する場合は、f([x]) のように*5 。定義した関数 f(x) を引数をリストにします（29 ページおよび 34 ページの例を参照）

消去する場合は関数 remfunction*6 を用います*7 。
M AXIMA I NPUT /O UTPUT(%i19) f(x);(%o19)

3x+1(%i20) remfunction(f);(%o20)[f](%i21) f(x);*5 変数の個数は length(x) 調べられます。また、各変数へは x[1]、x[2] 等でアクセスします。

*6 remfunction = remove function: function [f2́N(k)S(@)n] 関数。

*7 関数 remvalue の場合と同様 kill コマンドで代用しても良いでしょう。

第 2 章 Maxima の基本

10
f (x)

(%o21)

ここで、引数が f(x) ではなく f であることに注意しましょう。
何らかの計算結果を関数として定義したいこともあるでしょう。例えば、対数関数 log xの導関数を f (x) と置く場合を考えてみます。直前の結果を参照するパーセント記号（%）*8 を用いて、と二重単引用符（’’）
M AXIMA I NPUT /O UTPUT(%i22) diff(log(x), x);1x(%o22)(%i23) f(x):= ’’%;

f (x) :=(%o23)

1xとする方法もありますが*9 、関数 define*10 を使う方が鮮やかです。
M AXIMA I NPUT /O UTPUT(%i24) define(f(x), diff(log(x), x));1(%o24)
f (x) :=
x
なお、二重単引用符（’’）は「評価せよ」という命令で、単引用符（’）は逆に「評価するな」という命令です。
複数の処理を関数として定義する場合、局所変数（ローカル変数）を利用したくなるかもしれません。そのような場合は関数 block を利用すると良いでしょう。これについては、後で実例を挙げます（17、29、34 ページを参照）
。

2.2

リスト

Maxima は、四角括弧（[]）内に要素をカンマで区切って並べたものをリストと認識します。
M AXIMA I NPUT /O UTPUT(%i1) listp(L);
(%o1)

false

(%i2) L: [11, 12, 13, 14, 15];*8 二重引用符（"）ではないことに注意。

*9 環境によっては二重単引用符（’’）は不要なようです。

*10 define [difáin] 定義する。

2.2 リスト

11[11, 12, 13, 14, 15](%o2)(%i3) listp(L);

true

(%o3)

ここで、関数 listp は、引数がリストか否かによって true/false を返す関数です。
リストの各要素は 1 番から順に番号が振られ、L[1]、L[2]、L[3] のようにして取り出すことができます。また、リストの長さは関数 length で調べることができます。
M AXIMA I NPUT /O UTPUT(%i4) L[1]+L[2];
23

(%o4)
(%i5) length(L);

5

(%o5)
(%i6) L[length(L)];

15

(%o6)

なお、最後の要素を取り出すためには専用の関数 last が用意されています。
M AXIMA I NPUT /O UTPUT(%i7) last(L);
15

(%o7)

リストに要素を追加するには、先頭に追加する関数 cons*11 もしくは末尾に追加する関数 endcons*12 を用います。
M AXIMA I NPUT /O UTPUT(%i8) cons(a, L);(%o8)[a, 11, 12, 13, 14, 15](%i9) endcons(b, %);(%o9)[a, 11, 12, 13, 14, 15, b]

逆に要素を削除するには関数 delete を用います。関数 delete は書式

delete(削除する要素, リスト);もしくは*11 cons = construct [ 動 k@nstr2́kt, 名 kÁnstr2kt] 構成する。
*12 endcons = end + construct

第 2 章 Maxima の基本

12delete(削除する要素, リスト, 削除する個数);により実行します。
「削除する個数」を指定しない場合、該当する全ての要素が削除され、指定した場合は、先頭から指定個数のみが削除されます。
M AXIMA I NPUT /O UTPUT(%i10) [a, 1, b, 1, c, 1, d, 1, e, 1];[a, 1, b, 1, c, 1, d, 1, e, 1](%o10)(%i11) delete(1, %o10, 1);[a, b, 1, c, 1, d, 1, e, 1](%o11)(%i12) delete(1, %o10, 2);[a, b, c, 1, d, 1, e, 1](%o12)(%i13) delete(1, %o10);[a, b, c, d, e](%o13)

存 在 し な い 要 素 を 削 除 し よ う と し て も エ ラ ー に な る こ と は あ り ま せ ん が 、関 数

member(要素, リスト) を使えば、「リスト」に「要素」が属しているか否か調べることができます。
M AXIMA I NPUT /O UTPUT(%i14) member(1, [1, 2, 3, 4, 5]);true(%o14)(%i15) member(1.0, [1, 2, 3, 4, 5]);false(%o15)(%i16) member("1", [1, 2, 3, 4, 5]);false(%o16)

リスト [1, 2, 3, 4, 5] を考えるとき、整数 1 は当然このリストに属していますが、小数 1.0 や文字列としての 1 は属していないので、上記のような結果になっています。
リスト同士の連結には関数 append*13 を用います。関数 append は書式

append(リスト1, リスト2, リスト3, .....);
により実行します*14 。

*13 append [@pénd] 付け加える。

*14 2 つのリストを交互に連結する関数 join もあります。例えば、(%o10) のリストは join([a,b,c,d,e],[1,1,1,1,1]) で得られます。

2.3 整数と多項式と有理式

13

M AXIMA I NPUT /O UTPUT(%i17) append([a,b,c], [1,2,3], [x,y,z]);[a, b, c, 1, 2, 3, x, y, z](%o17)

あるリストから部分リストを取り出すには関数 rest を用います。関数 rest は書式

rest(リスト, 整数);
で実行します*15 。rest(リスト, 自然数) を実行した場合は先頭から、rest(リスト, −自然数) を実行した場合は末尾からそれぞれ「自然数」個を取り除いたリストを出力します。
M AXIMA I NPUT /O UTPUT(%i18) rest(%o17, 3);[1, 2, 3, x, y, z](%o18)(%i19) rest(%o17, -3);

[a, b, c, 1, 2, 3](%o19)

2.3

整数と多項式と有理式

整数と多項式は同じような性質を持っているため、Maxima にはどちらにも適用できる関数がたくさんあります。例えば、商と余りを求める関数 quotient、remainder およびその両方を同時に求める関数 divide などです。
M AXIMA I NPUT /O UTPUT(%i1) quotient(92, 7);
(%o1)

13

(%i2) remainder(92, 7);1(%o2)(%i3) divide(92, 7);(%o3)[13, 1](%i4) quotient(xˆ3 + xˆ2, xˆ2 + 1);
(%o4)

x+1

(%i5) remainder(xˆ3 + xˆ2, xˆ2 + 1);(%o5)−x − 1(%i6) divide(xˆ3 + xˆ2, xˆ2 + 1);*15 「整数」を省略した場合は 1 が指定されたものと見なされます。

第 2 章 Maxima の基本

14
(%o6)

[x + 1, −x − 1]

改めて説明するまでもなく、前半は 92 を 7 で割ったときの商 13 と余り 1 を求める計算で、後半は x3 + x2 を x2 + 1 で割ったときの商 x + 1 と余り −x − 1 を求める計算です。
また、関数 factor は整数、多項式、有理式に共通に用いることができ、素因数分解及び因数分解を出力します*16 。
M AXIMA I NPUT /O UTPUT(%i7) factor(300);(%o7)(%i8) factor(xˆ3 + yˆ3);(%o8)

22 × 3 × 52
(y + x) y2 − x y + x2(%i9) 1/(aˆ2 - 1) - bˆ2/(aˆ2 - 1);
b2
1
− 2
(%o9)
2
a −1 a −1(%i10) factor(%);(b − 1)(b + 1)(%o10)−(a − 1)(a + 1)

なお、多項式や有理式に関数 factor を適用した場合、整数因数については標準では素因数分解しません。素因数分解したい場合は変数 factorflag に true を代入します。
M AXIMA I NPUT /O UTPUT(%i11) factor(9*xˆ2 + 72*x + 144);(%o11)

9 (x + 4)2(%i12) factor(9*xˆ2 + 72*x + 144), factorflag: true;(%o12)

32 (x + 4)2

また、変数 dontfactor に変数リストを代入すると、その変数については因数分解しなくなります。つまり、因数分解「しない」変数を指定することができます。上の多項式の場合、
M AXIMA I NPUT /O UTPUT(%i13) factor(9*xˆ2 + 72*x + 144), dontfactor: [x];(%o13)
9 x2 + 8 x + 16(%i14) factor(9*xˆ2 + 72*x + 144), dontfactor: [x], factorflag: true;(%o14)
32 x2 + 8 x + 16
*16 より正確には「（素）因数分解を求めようと努力した結果が出力される」と表現すべきでしょう。

2.3 整数と多項式と有理式

15のように、ちょうど係数の最大公約数で括った形になります。一般には、多変数の多項式や有理式に適用することが多いでしょう。
M AXIMA I NPUT /O UTPUT(%i15) factor(%o9), dontfactor: [a];(b − 1)(b + 1)(%o15)−
a2 − 1(%i16) factor(%o9), dontfactor: [b];b2 − 1(%o16)−(a − 1)(a + 1)(%i17) factor(%o9), dontfactor: [a, b];b2 − 1(%o17)− 2
a −1(%i18) f: expand((x + 1)ˆ2 * (y + 1)ˆ2 * (z + 1)ˆ2);(%o18) x2 y2 z2 + 2 x y2 z2 + y2 z2 + 2 x2 y z2 + 4 x y z2 + 2 y z2 + x2 z2 + 2 x z2 + z2
+ 2 x2 y2 z + 4 x y2 z + 2 y2 z + 4 x2 y z + 8 x y z + 4 y z + 2 x2 z
+ 4 x z + 2 z + x2 y2 + 2 x y2 + y2 + 2 x2 y + 4 x y + 2 y + x2 + 2 x + 1(%i19) factor(f), dontfactor: [];(%o19)(x + 1)2 (y + 1)2 (z + 1)2(%i20) factor(f), dontfactor: [x];(%o20)
x2 + 2 x + 1 (y + 1)2 (z + 1)2(%i21) factor(f), dontfactor: [y];(%o21)(x + 1)2 y2 + 2 y + 1 (z + 1)2(%i22) factor(f), dontfactor: [z];(%o22)

(x + 1)2 (y + 1)2 z2 + 2 z + 1(%i23) factor(f), dontfactor: [x, y];(%o23)
x2 + 2 x + 1 y2 + 2 y + 1 (z + 1)2(%i24) factor(f), dontfactor: [x, y, z];




(%o24)
x2 + 2 x + 1 y2 + 2 y + 1 z2 + 2 z + 1
次に、主に多項式を扱う際に不可欠な関数を解説します。多変数多項式を 1 つの変数で整理したい場合は、関数 factorout もしくは ratsimp を使います。
M AXIMA I NPUT /O UTPUT(%i25) f: expand((aˆ2 - bˆ2)*xˆ2 - 2*(a + b)*x + 1);(%o25)−b2 x2 + a2 x2 − 2 b x − 2 a x + 1(%i26) factorout(f, a, b);(%o26)−(b − a)(b + a) x2 − 2 (b + a) x + 1

第 2 章 Maxima の基本

16(%i27) factorout(f, a, b), dontfactor: [a, b];(%o27)
a2 − b2 x2 − 2 (b + a) x + 1(%i28) ratsimp(f, x);(%o28)


a2 − b2 x2 + (−2 b − 2 a) x + 1

関数 factorout は指定した変数（上例の場合は a と b）を係数とする多項式として整理する関数です。一方、関数 ratsimp は、展開、通分、約分によって、有理式を簡易化する関数です。
係数を取得するには、関数 ratcoef を用います。
M AXIMA I NPUT /O UTPUT(%i29) ratcoef(f, x, 0);1(%o29)(%i30) ratcoef(f, x, 1);(%o30)(%i31) ratcoef(f, x, 2);(%o31)(%i32) ratcoef(f, x, 3);−2 b − 2 aa2 − b20(%o32)

次数を取得するには関数 hipow を用いますが、少々注意が必要です。例えば、以下の実行結果はいずれも期待した値ではありません。
M AXIMA I NPUT /O UTPUT(%i33) hipow((x + 1)ˆ5, x);(%o33)

1(%i34) hipow(1/(x - 1) - xˆ3/(x - 1), x);(%o34)

3(%i35) hipow(expand((x + 1)ˆ5), x + 1);(%o35)

0

そこで、関数 hipow の基本書式を関数 rat*17 を合成した形

hipow(rat(式), 変数);*17 関数 rat は有理式を簡易化する関数ですが、 四則演算と整数冪の場合しか簡易化を行わない点が関数

ratsimp との機能的な違いです。また、関数 rat は主に Maxima が内部で利用するための関数で、出力結果の内部表現が ratsimp によるものと異なります。

2.3 整数と多項式と有理式

17で覚えておくと良いでしょう。第 2 引数は x + 1 や 2 x のような「式」ではなく、単独の「変数」とします。
M AXIMA I NPUT /O UTPUT(%i36) hipow(rat((x + 1)ˆ5), x);5(%o36)(%i37) hipow(rat(1/(x - 1) - xˆ3/(x - 1)), x);2(%o37)

失敗例の 3 番目 (%i35) は x の次数を調べればよいので、第 2 引数を x + 1 などとするのはナンセンスですが、多変数多項式の場合には x + y や x y の次数を取得したくなるかもしれません。このような場合に備えて、独自に次数を取得する関数を定義しておくと良いでしょう。例えば、以下を初期設定ファイル maxima-init.mac に書いておけば、次数を求める関数 degree が使えるようになります。

1d e g r e e ( f , x ) := b l o c k ( [ q , i , j ] ,2

q: f ,

3f o r i : 0 w h i l e ( q # 0 ) do ( j : i , q : q u o t i e n t ( q , x ) ) ,4

return ( j )5);関数 degree の実行例として、(x + 1)4 − (x − 1)4 における x の次数と x2 + y2 における

x + y の次数を計算してみると次のようになります。
M AXIMA I NPUT /O UTPUT(%i38) degree((x + 1)ˆ4 - (x - 1)ˆ4, x);3(%o38)(%i39) display(expand(part(%i38, 1)));(%o39)

expand((x + 1)4 − (x − 1)4 ) = 8 x3 + 8 x
done(%i40) degree(xˆ2 + yˆ2, x + y);(%o40)

2(%i41) display(divide(part(%i40, 1), (x + y)ˆ%));(%o41)

divide(y2 + x2 , (y + x)2 ) = [1, −2 x y]
done(%i39) と (%i41) は検算です。ここで、part は式の一部を抽出する関数で、display

第 2 章 Maxima の基本

18
は「命令 = 結果」の形で出力する関数です。

有理式に関数 ratsimp を適用すると、全ての分数を十把一絡げに通分し、可能なら約分も実行しますが、式が複雑な場合、分母が同じもの同士を個別に考察したいことがあります。これを実現するのが、関数 combine です。
M AXIMA I NPUT /O UTPUT(%i42) f: aˆ2/x - 1/x + aˆ2/xˆ2 - 1/xˆ2;
a2 1 a21(%o42)− + 2− 2xx xx(%i43) ratsimp(f);
a2 − 1 + a2 − 1(%o43)x2(%i44) combine(f);a2 − 1 a2 − 1(%o44)+xx2
分数式の分母と分子はそれぞれ関数 ratdenom*18 および ratnum*19 で取得できます。
名称から想像できるように、内部で関数 rat を実行し、結果として得られた分母と分子を帰す関数です*20 。
M AXIMA I NPUT /O UTPUT(%i45) ratdenom(f);x2(%o45)(%i46) ratnum(f);(%o46)


a2 − 1 + a2 − 1

通分された分数式を分解したい場合は関数 ratexpand（もしくは expand）を適用します。
M AXIMA I NPUT /O UTPUT(%i47) ratexpand(%o43);(%o47)

a2 1 a21− + 2− 2xx xx関数 partfrac を用いれば、部分分数への分解もできます。

*18 ratdenom = rational + denominator: denominator [diÁm@nèit@(r)] 分母（

numerator）。
denominator）。
*20 何らかの事情で約分される前の分母・分子を知りたい場合は、関数名に rat が付かない expand や combine
等を使って上手く整理した後、関数 denom および num を用います。
*19 ratnum = rational + numerator: numerator [n(j)ú:m@rèit@(r)] 分子（

2.4 対数関数（logarithmic function）

19

M AXIMA I NPUT /O UTPUT(%i48) 1/(xˆ2 - 1);
1x2 − 1(%o48)(%i49) partfrac(%);(%o49)(%i50) 1/(xˆ3 + 1);

1
1−
2 (x − 1) 2 (x + 1)
1x3 + 1(%o50)(%i51) partfrac(%);

1
x−2
−

3 (x + 1) 3 x2 − x + 1(%o51)

2.4

対数関数（logarithmic function）

微分・積分では自然対数は底 e を省略して log x と書きますが、Maxima でも log(x)は自然対数を表します。
M AXIMA I NPUT /O UTPUT(%i1) log(%e);
1

(%o1)

底が 2 や 10 の対数を扱いたい場合は、適宜 log2(x):= log(x)/log(2) のように関数を定義して用いることになるでしょう*21 。
対数には縮約形と展開形の 2 種類の標準的な表示方法があります。
縮約形

展開形

log x yxlog
ylog xalog x + log y
log x − log ya log xどちらの表示方法が望ましいかは解決すべき問題に依りますから、縮約形と展開形との間の相互変換の方法を知っておく必要があります。
始めに、縮約形を展開形に変換する方法を解説します。縮約→展開変換には関数

radcan*22 を用います。

*21 底が 10 の対数 log10 については、 log10.mac を読み込むことで利用できるようになります。
*22 radcan = radical + canonical form: radical [rǽdikl] 根号。 canonical [l@nÁnikl] 標準的な。

第 2 章 Maxima の基本

20
M AXIMA I NPUT /O UTPUT(%i2) log(xˆa);(%o2)

a log x(%i3) radcan(log(x*y));(%o3)

log x + log y(%i4) radcan(log(x/y));(%o4)

log x − log y

最初の log xa だけ radcan は不要ですが、これはデフォルトで変数 logexpand*23 にtrue が代入されているためです。super を代入すると残りの 2 例も radcan が不要にな
ります*24 。
M AXIMA I NPUT /O UTPUT(%i5) logexpand: super;
(%o5)

super

(%i6) log(x*y);(%o6)

log y + log x(%i7) log(x/y);(%o7)

log x − log y

しかし、一般にはこのような変形が自動的に実行されるのは望ましいことではありませんから、むしろ false を代入して、勝手に展開形に変形されないように設定しておくことをお勧めします*25 。
次 に 、展 開 形 を 縮 約 形 に 変 換 す る 方 法 を 解 説 し ま す 。展 開 → 縮 約 変 換 に は 関 数

logcontract*26 を用います。
M AXIMA I NPUT /O UTPUT(%i8) logcontract(log(x) + log(y));(%o8)

log x y(%i9) logcontract(log(x) - log(y));
x
(%o9)
log
y
(%i10) logcontract(2*log(x));*23 logexpand = logarithm + expand*24 変数 logexpand に super を代入してあっても、例えば log(x2 − 1) のように因数分解が必要な場合はradcan を実行しない限り展開形にはなりません。

*25 マニュアルには「変数 logexpand に all を代入すると、 log x y は展開されるが log x/y は展開されない」とありますが、 Maxima-5.14.0 では super を代入した場合と同じ結果になってしまうようです。

*26 logcontract = logarithm + contract: contract [ 名 kÁntrækt, 動 k@ntrǽkt] 縮小する、縮約する。

2.4 対数関数（logarithmic function）

21
log x2(%o10)(%i11) logcontract(n*log(x));

n log x(%o11)(%i12) logcontract(1/2*log(x));

log x
2

(%o12)

1log x は縮約されませんでしたが、これは、係数が「整数、もしく
2は整数という性質が割り当てられた変数」の場合に限り縮約するように関数 logcontract
最後の 2 つ、n log x とが実装されているためです。試しに、変数 n に「整数という性質」を割り当てて、関数

logcontract を適用してみると、
M AXIMA I NPUT /O UTPUT(%i13) declare(n, integer);done(%o13)(%i14) logcontract(n*log(x));

log xn(%o14)

ちゃんと縮約されました。なお、現在割り当てられている性質を確認するには、関数

properties を用い、割り当てを解除するには関数 kill を用います*27 。
M AXIMA I NPUT /O UTPUT(%i15) properties(n);(%o15)[database info, kind(n, integer)](%i16) kill(n);(%o16)

done(%i17) properties(n);(%o17)[](%i18) logcontract(n*log(x));(%o18)

n log x関数 logcontract によって縮約する係数の条件は、変数 logconcoeffp*28 によって

1
log x が縮約されるようにするには、まず、「有2
理数、もしくは有理数という性質が割り当てられた変数」に対して true を返す関数を定変更できます。先ほど縮約されなかった義します。
*27 関数 kill は性質だけでなく、変数そのものを削除してしまう命令です。
*28 logconcoeffp = logarithm + contract + coefficient + probability

第 2 章 Maxima の基本

22
M AXIMA I NPUT /O UTPUT(%i19) rationalp(r):= ratnump(r) or featurep(r, rational);
rationalp(r) := ratnump(r) or featurep(r, rational)(%o19)(%i20) rationalp(2);true(%o20)(%i21) rationalp(1/2);

true(%o21)

ここで定義した関数 rationalp を変数 logconcoeffp に代入すると、「有理数、もしくは有理数という性質が割り当てられた変数」を係数とする対数が縮約されるようになります。
M AXIMA I NPUT /O UTPUT(%i22) logconcoeffp: ’rationalp;
rationalp(%o22)(%i23) logcontract(1/2*log(x));
log(%o23)√x(%i24) logcontract(1/3*log(x));
log x1/3(%o24)

元に戻すには変数 logconcoeffp に false を代入します*29 。

2.5三角関数（trigonometric function）

Maxima には三角関数 sin、cos、tan とその逆三角関数 asin、acos、atan が組み込π
まれており、当然のことながら、sin の値などを知っています。
3
M AXIMA I NPUT /O UTPUT(%i1) sin(%pi/3);

√

3
2

(%o1)
(%i2) asin(1);

π
2

(%o2)
(%i3)

cos(acos(x));

(%o3)

x

(%i4) acos(cos(x));*29 「整数、もしくは整数という性質が割り当てられた変数」に対して true を返す関数 integerp(n) orfeaturep(n, integer) を 変数 logconcoeffp に代入したことと同等です。

2.5 三角関数（trigonometric function）

23
x

(%o4)

数学的には、arccos(cos x) = x が成り立つのは（主値の取り方によりますが、普通は）

0 ≦ x ≦ π の場合に限りますから、(%o4) は少々注意が必要です。勝手にこのような簡易化が行われては困る場合には、変数 triginverses*30 を true または false に設定します（デフォルトは all）。
M AXIMA I NPUT /O UTPUT(%i5) triginverses: true;
true

(%o5)
(%i6) cos(acos(x));

x

(%o6)
(%i7) acos(cos(x));

acos(cos x)(%o7)

変数 triginverses に false を代入すると、cos(acos(x)) も簡易化されなくなります。

Maxima は、現在ではほとんど使われなくなった割三角関数 sec、csc、cot を出力することがありますので、これらの定義を覚えておきましょう*31 ：sec θ =1,cos θ

csc θ =1,sin θ

cot θ =

1tan θ

さて、三角関数の重要な公式を挙げよ、と言われて真っ先に思い浮かべるのは加法定理
ではないでしょうか。それを実行する関数が trigexpand*32 です。
M AXIMA I NPUT /O UTPUT(%i8) trigexpand(tan(x + y));tan y + tan x
1 − tan x tan y(%i9) trigexpand(sin(x + %pi/3));√sin x
3 cos x
(%o9)
+
2
2
(%o8)

なお、次の例を見れば分かるように、関数 trigexpand は（標準では）一段階しか展開しませんので、必要に応じて繰り返し適用します。
= trigonometric + inverse: trigonometric [trı̀g(@)n@métrik] function 三 角 関 数 。inverse[inv´@:(r)s, ı́nv@:(r)s] 逆（の）、反対（の）。
*31 sec : secant （正割）
、csc : cosecant （余割）、cot : cotangent （余接）*32 trigexpand = trigonometric + expand: trigonometric [trı̀g(@)n@métrik] function 三 角 関 数 。expand[ikspǽnd, eks-] 展開する。

*30 triginverses

第 2 章 Maxima の基本

24
M AXIMA I NPUT /O UTPUT(%i10) trigexpand(cos(2*x + %pi/3));√
cos 2 x
3 sin 2 x(%o10)−
22(%i11) trigexpand(%);
cos2 x − sin2 x √− 3 cos x sin x(%o11)
2
実は、trigexpand は変数としても用いられ、true に設定すると、一気に展開されます。
M AXIMA I NPUT /O UTPUT(%i12) trigexpand(cos(2*x + %pi/3)), trigexpand: true;cos2 x − sin2 x √− 3 cos x sin x(%o12)
2πなど）の展開を抑止する変数 trigexpandplus と積（3 θ な4ど）の展開を抑止する変数 trigexpandtimes があります。
この他、加法・減法（θ ±展開の逆変換に相当する関数が trigreduce*33 で、次数を下げる方向に変形します。
M AXIMA I NPUT /O UTPUT(%i13) trigreduce(sin(x)ˆ3);
3 sin x − sin 3 x(%o13)
4
また、三角関数の式を簡易化する trigrat*34 もよく使います。関数 trigrat は、初期π
位相が 0 になるように（例えば、sin(x + ) は
6√

3 sin x + cos xに）変形し、かつ、次数2を下げる方向に変形することで、与えられた式を可能な限り線形和の形に帰着させます。
まるで trigexpand と trigreduce の間の子のような関数です。
M AXIMA I NPUT /O UTPUT(%i14) trigrat(sin(2*x + %pi/6)ˆ2);√
3 sin 4 x − cos 4 x + 2(%o14)
2


比較のため、同じ式 sin2 2 x +しょう。

πに trigexpand と trigreduce を適用してみま
6*33 trigreduce = trigonometric + reduce: reduce [rid(j)ú:s] 縮小する。

*34 trigrat = trigonometric + rational: rational [rǽS@nl] 有理の。

2.5 三角関数（trigonometric function）

25

M AXIMA I NPUT /O UTPUT(%i15) trigexpand(sin(2*x + %pi/6)ˆ2);
√
2
 3 sin 2 x cos 2 x (%o15)+
22(%i16) trigexpand(%);!2
cos2 x − sin2 x √+ 3 cos x sin x(%o16)
2(%i17) trigreduce(sin(2*x + %pi/6)ˆ2); π 
1 − cos 2 2 x +6(%o17)
2(%i18) trigreduce(%);
π
1 − cos 4 x +3(%o18)
2関数 trigrat は、tan x をで元に戻ります。

sin xに変形するときにも利用できます。関数 trigreducecos x

M AXIMA I NPUT /O UTPUT(%i19) trigrat(tan(x));
sin x
cos x

(%o19)(%i20) trigreduce(%);

tan x(%o20)

ただし、tann x 等に trigrat を適用してしまうと、すぐには tann x には戻ってこれません（戻る必要はないかもしれませんが）。
M AXIMA I NPUT /O UTPUT(%i21) trigrat(tan(x)ˆ3);(%o21)−

sin 3 x − 3 sin x
cos 3 x + 3 cos x(%i22) trigreduce(%);(%o22)

3 sin xsin 3 x−cos 3 x + 3 cos x cos 3 x + 3 cos x

一端展開して、関数 trigsimp*35 で簡単にしてから、trigreduce を実行すると元に戻ります。

*35 trigsimp = trigonometric + simplify: simplify [sı́mpl@fài] 簡単にする。

第 2 章 Maxima の基本

26
M AXIMA I NPUT /O UTPUT(%i23) trigexpand(%);
3 sin x3 cos2 x sin x − sin3 x(%o23)−
2−3 cos x sin x + cos3 x + 3 cos x −3 cos x sin2 x + cos3 x + 3 cos x(%i24) trigsimp(%);
sin3 x(%o24)
cos3 x(%i25) trigreduce(%);(%o25)

tan3 x内部でどのような処理が行われるか考えながら計算させなければならない、Maxima は
なんと教育的なソフトウェアでしょう。なお、関数 trigsimp は、関係式 sin2 x+cos2 x = 1を用いて式を簡単にする関数です。
最後に、半角の公式を利用する方法を解説しておきます。Maxima に半角の公式を使って式変形させるためには、関数 trigexpand や trigreduce を実行する際に、変数

halfangles*36 を true に設定します（デフォルトは false）。
M AXIMA I NPUT /O UTPUT(%i26) trigexpand(sin(x/2)ˆ2), halfangles: true;
1 − cos x(%o26)
2(%i27) trigreduce(cos(x/2)ˆ2), halfangles: true;cos x + 1(%o27)
2
なお、変数 halfangles をグローバルに true に設定しておけば、以降の計算全てに亘って半角の公式が適用されますが、それはあまりお勧めできません。次の例を見てくだ
さい。
M AXIMA I NPUT /O UTPUT(%i28) trigreduce(sin(x/2)), halfangles: true;√
1 − cos x(%o28)√
2√
1 − cos xxですね。Maxima は ± を付けてくれません。更に悩まし
正しくは sin = ±√22

い次の例はどうでしょう。

*36 halfangles = half angle: angle [ǽNgl] 角、角度。

2.5 三角関数（trigonometric function）

27

M AXIMA I NPUT /O UTPUT(%i29) trigexpand(tan(x/2)), halfangles: true;
1 − cos x(%o29)
sin x(%i30) trigreduce(tan(x/2)), halfangles: true;(1 − cos x) csc x(%o30)
ここで、csc x =Maxima は等式1でしたから、(%o29) と (%o30) は全く同じ式です。つまり
sin x
tan

x 1 − cos x
=
2
sin x

[2.1]

が成立すると主張していますが、この式に x = 0 を代入しようとしてみると.....、何となく

x
sin
x
x
2
の分母・分子に sin を掛けることで導けます。
不自然ですね。式 [2.1] は tan =
x
2 cos
2
2
x
1 − cos x
x
sin2
sin
x
1 − cos x
2
2
2
tan =
=
=
=
x
x
x
sin x
2 cos
sin x
sin · cos2222
つまり、0 になるかもしれない sin

きです*37 。このとき、

xxを掛けたことが問題で、本来は cos を掛けるべ
2
2

x
x
x
sin x
sin
sin · cos
sin x
x
2
2
2
2
=
=
=
tan =
x
x
1 + cos x
2 cos
1 + cos x
cos2
2
2
2
となります。

*37 cos x/2 = 0 のときは tan x/2 が定義されないので、 cos x/2 , 0 と考えて良い。

[2.2]

第 2 章 Maxima の基本

28
メ

三 角 関 数 用 に 用 意 さ れ て い る Maxima の 関 数（trigexpand、trigreduce、モ

trigsimp 等）や変数（trigexpand、triginverses 等）は双曲線関数にも適用
できます。
双曲線関数

Maxima の命令x−x

双曲線正弦関数sinh x =e −e2

双曲線余弦関数cosh x =e x + e−x2cosh(x)双曲線正接関数tanh x =sinh xcosh xtanh(x)

双曲線余割関数csch x =1
sinh xcsch(x)

双曲線正割関数sech x =1
cosh xsech(x)双曲線余接関数coth x =1tanh xtanh(x)sinh(x)

これらの逆関数は、順に asinh、acosh、atanh、acsch、asech、acoth です。

2.6

繰り返しと条件分岐

ほとんどのプログラミング言語では for 文によって繰り返し処理が実装されていますが、その for 文の説明に使われる定番の例題として、「1 から 10 までの自然数の総和を求めるプログラムを作成せよ」というのがあります。もちろん、公式

10 × (10 + 1)を使う
2のは反則ですが、残念ながら（？）Maxima にはそのような計算を実行するための関数

sum*38 が組み込まれています。関数 sum は
sum(式, 変数, 開始値, 終了値);
により実行します。今の問題の場合、
M AXIMA I NPUT /O UTPUT(%i1) sum(i, i, 1, 10);(%o1)

*38 sum = summation [s2méiS(@)n] 合計、総和。

55

2.6 繰り返しと条件分岐29のように簡単に求まってしまいます。逆数の和

11 1 1+ + + ···+
だって簡単です。
1 2 3
10

M AXIMA I NPUT /O UTPUT(%i2) sum(1/i, i, 1, 10);
7381
2520

(%o2)

これでは何の練習にもなりませんので、このような関数の存在は忘れてください。
さて、Maxima における for 文の書式はfor 変数 in リスト do 処理;
もしくはfor 変数: 開始値 オプション 終了条件 do 処理;です*39 。便宜上前者を「リスト書式」、後者を「汎用書式」と呼ぶことにします。なお、複数の処理を実行したい場合は「do (処理1, 処理2, . . .)」のように、丸括弧内にカンマで区切って処理を並べます。
リスト書式では、「リスト」の要素が先頭から順に「変数」に代入され、「処理」が実行されます。次の例の場合、変数 i が順に e、v、o、l と変化しながら、処理「s: concat(i, s)」が実行されます。ここで、concat は要素を連結する関数です。
M AXIMA I NPUT /O UTPUT(%i3) s: "";(%o3)(%i4) for i in ["E", "V", "O", "L"] do s: concat(i, s);
done

(%o4)
(%i5) s;

LOVE

(%o5)

(%i3) で用意した空の変数 s にリストの要素 E、V、O、L がこの順に連結していきますから、s は内部で E、VE、OVE、LOVE と変化しています。もう一つ簡単な例を挙げてみます。
M AXIMA I NPUT /O UTPUT(%i6) f([x]):= block([s], s: 0, for i in x do s: s + i, return(s))$(%i7) f(7);*39 「変数:開始値」の代わりに「変数 from 開始値」を使うこともできます。

第 2 章 Maxima の基本

30
(%o7)

7

(%i8) f(7, 2);
(%o8)

9

(%i9) f(7, 2, 10);
(%o9)

19

これは、引数の総和を求める関数です。引数をリスト x として受け取り、リスト x の各要素が順に変数 i に代入されて、処理「s: s + i」が実行される仕組みです。CSV（Comma Separated Values）形式のファイルを読み込んでデータを利用する場合などにはこのリスト書式が有効でしょう。
一方、汎用書式は（文字通り）様々な用途に使います。まず、もっとも素朴な例として、最初に挙げた「1 から 10 までの総和」を求めるプログラムを作ってみましょう。
M AXIMA I NPUT /O UTPUT(%i10) s: 0;(%o10)

0(%i11) for i: 1 thru 10 do s: s + i;*40(%o11)

done(%i12) s;(%o12)

55「オプション」は省略し、「終了条件」に変数の終了値「thru 10」を設定しました。なお、「オプション」を省略すると変数を 1 ずつ増やす設定「step 1」になります*41 。すな
わち、(%i11) は「for i: 1 step 1 thru 10 do s: s + i;」と同値です。終了条件には終了値を設定する thru の他、while と unless が利用できます。このプログラムの場合、「step 1」を「while i <= 10」や「unless i > 10」に書き代えることができます。
M AXIMA I NPUT /O UTPUT(%i13) s: 0$ for i: 1 while i <= 10 do s: s + i$ s;(%o15)

55(%i16) s: 0$ for i: 1 unless i > 10 do s: s + i$ s;(%o18)*40 thru（米略式） = through [Tru:, Trú:]55*41 実は変数の開始値も省略可能で、 省略した場合、 1 が開始値になります。

2.6 繰り返しと条件分岐

31

別のプログラム例を挙げましょう。余りを求める関数 remainder*42 を利用して、「100!
が 5 で何回割れるか」求めてみます。
M AXIMA I NPUT /O UTPUT(%i19) for i: 0 while remainder(100!, 5ˆi) = 0 do ans: i$ ans;
24(%o20)

このプログラムは、100! が 5i で割り切れなくなったときに for ループを抜け、そのと
きの i の値を出力しています。なお、変数 i は for ループを抜けた段階で初期化されてしまうため*43 、別の（グローバル）変数 ans に代入しておき、最後にその値を出力するという手順を踏んでいます。念のため実行結果 24 が求める値であることを確認しておきま
しょう。
M AXIMA I NPUT /O UTPUT(%i21) remainder(100!, 5ˆ24);0(%o21)(%i22) remainder(100!, 5ˆ25);

238418579101562500(%o22)

確かに 100! は 524 では割り切れ、かつ 525 では割り切れませんでした*44 。
ここで取り上げた 2 例はいずれも変数を 1 ずつ増やせば良かったため「オプション」は不要でしたが、「オプション」には step による増減設定の他、next による漸化式設定も可能です。例えば、変数を 0, 2, 4, 6, . . . と偶数のみをとるように変化させるためには、「for i: 0 step 2 .....」あるいは「for i: 0 next i + 2 .....」とすればよいでしょう。もっとも「通なプログラマ」なら「オプション」など使わないかもしれません。
本節のもう一つのテーマである条件分岐に話を移しましょう。条件分岐には if 文を使います。Maxima における if 文の書式は（他の多くのプログラミング言語とほぼ同じで
すが）if 分岐条件 then 真の場合の処理 else 偽の場合の処理;です。for 文の場合と同様 (処理1, 処理2, . . .) のようにして、複数の処理を実行することも可能です。分岐条件には表 2.2 にまとめた真偽を返す関数の他、次の演算子および関数が利用できます。

*42 remainder [riméind@(r)] 余り。

*43 すなわち、変数 i はローカル変数です。

*44 このことは、 100 までの自然数の中に、 5 の倍数が 20 個あり、 25 の倍数が 4 個あり、 125 の倍数が 0 個あることから暗算でも確認できます。

第 2 章 Maxima の基本

32
表 2.1

分岐条件に用いられる演算子等真となる条件記号

左辺が右辺より小さい<

中置子

左辺が右辺以下<=

中置子

左辺と右辺が等しい=

中置子

左辺と右辺が等しくない#

中置子

左辺が右辺以上>=

中置子

左辺が右辺より大きい>

中置子

左辺と右辺の両方真

and

中置子

左辺と右辺の一方真

or

中置子

偽

not

前置子

2 つの変数が等しい

equal

2 変数関数

notequal

2 変数関数2 つの変数が等しくない

タイプ

if 文を用いた例として、小数第 1 位を四捨五入する関数 round を作ってみます*45 。ガウス記号 [x] に相当する関数 fix*46 を利用します。ガウス記号 [x] とは、実数 x を超えな
い最大の整数のことです。言い換えると、正の数に対しては切り捨て、負の数に対しては繰り下げる関数です。
M AXIMA I NPUT /O UTPUT(%i23) fix(7.9);(%o23)

7(%i24) fix(-7.1);(%o24)−8

従って、四捨五入する関数は
M AXIMA I NPUT /O UTPUT(%i25) round(x):= if x >= 0 then fix(x + 0.5) else -fix(-x + 0.5)$と定義すればよいはずです*47 。
*45 実は、 Lisp には「四捨五入に近い命令」 round が組み込まれていて、 Maxima からは ?round で実行できます。オンラインヘルプの場合と異なり、? と round の間に半角スペースが入らないことに注目してください。
*46 ガウス記号に相当する関数 は fix の他 entier もあります。
*47 「0.5 を加えて切り捨てる」のは四捨五入を実現する際の常套手段です。

2.6 繰り返しと条件分岐

33
表 2.2 真偽を返す関数（主なもの）

関数

真となる条件

numberp

数値（%e、%i、%pi、sqrt などを除く）

constantp

定数（%e、%i、%pi、sqrt などを含む）

integerp

整数

ratnump

有理数

floatnump

多倍長でない小数bfloatp

多倍長小数

evenp

偶数

oddp

奇数

primep素数（34155071728321 より大きい数については確率的判定）

matrixp

行列

listp

リスト

setp

集合

emptyp

リストや集合が空

member

リストや集合に属する

M AXIMA I NPUT /O UTPUT(%i26) round(7.4);(%o26)

7(%i27) round(7.5);(%o27)

8(%i28) round(-7.4);(%o28)(%i29) round(-7.5);(%o29)−7−8

なお、改めて述べるまでもないことですが、ここで作成した関数 round はあくまでサンプルです。
「実際に使える関数」にするためには、関数 fix が数値（numberp(x) が trueとなる x）以外では機能しない点に注意し、実現すべき機能を十分に検討する必要があります。例えば、純粋に（分数と多倍長小数を除く）小数と整数だけに適用したいのであれ
ば、次のように修正することになるでしょう。

第 2 章 Maxima の基本

34
M AXIMA I NPUT /O UTPUT(%i30) round(x):= if integerp(x) or floatnump(x)then (if x >= 0 then fix(x + 0.5) else -fix(-x + 0.5)) else false$*48
一方、無理数√

2 や円周率 π も四捨五入したいのであれば、関数 constantp で定数でない場合を除外した上で、関数 float を併用することになるでしょう。
もう一例 if 文を使ったサンプルを挙げておきます。Maxima は数式処理ソフトですから、有理数（√1など）も無理数（ 2 など）も超越数（π など）も正しく処理しますが、時3には近似値を知りたくなることもあります。これらを標準の小数（による近似値）に変換するには関数 float を用いますが、より精度の高い多倍長小数（による近似値）に変換す
るには関数 bfloat を用い、精度は変数 fpprec に設定します（デフォルトは 16）。
M AXIMA I NPUT /O UTPUT(%i31) bfloat(%pi);
3.141592653589793b0(%o31)(%i32) bfloat(%pi), fpprec:50;(%o32)

3.1415926535897932384626433832795028841971693993751b0

最初の実行例は 16 桁の精度で、一方 2 番目の実行例は 50 桁の精度で円周率 π の近似値を出力しています。if 文を使ったサンプルとして、「数」と「精度」を引数にとる関数

evalf*49 を定義してみます。
1e v a l f ( [ x ] ) := b l o c k ( [ f p p r e c ] ,2i f l e n g t h ( x ) = 1 t hen

3bfloat (x [1])else

4

( fpprec : x [ 2 ] , b f l o a t ( x [ 1 ] ) )56);
関数 evalf は書式 evalf(数, 精度) で用いますが、精度を省略すると、現在設定されている値（変更していない場合はデフォルトの 16）が使われます。試しに Napier の数 eの近似値を出力してみましょう。
M AXIMA I NPUT /O UTPUT(%i33) evalf(%e);*48 else

false は省略可能です。

*49 evalf = evaluate + floating point: Maple で使われている関数名を拝借しました。

2.6 繰り返しと条件分岐

352.718281828459045b0(%o33)(%i34) evalf(%e, 50);(%o34)

2.7182818284590452353602874713526624977572470937b0

最後に、表 2.1 の演算子及び関数について 2 点ほど補足しておきます。まず、表 2.2 の関数と違い、表 2.1 の演算子や関数はそれそのものが true/false を返すわけではわけではありません。if の条件文として用いる場合は不要ですが、明示的に true/false を出力するためには、関数 maybe（もしくは is）に食わせることになります。
M AXIMA I NPUT /O UTPUT(%i35) 3 < %e;3<e(%o35)(%i36) maybe(%);

false(%o36)(%i37) 3 >= %pi;3≧π(%o37)(%i38) maybe(not 3 >= %pi);

true(%o38)

もう 1 点は、表 2.1 の中の =/# と equal/notequal の違いです。前者は Maxima の内部表現としての同異であるのに対し、後者は数学的な同異です。以下、いくつか具体例を挙げておきます。まず、等式
次のような結果になります。

p

3+2

√

2=1+

√
2 が成立するか Maxima に聞いてみると

M AXIMA I NPUT /O UTPUT(%i39) maybe(sqrt(3 + 2*sqrt(2)) = 1 + sqrt(2));(%o39)

false(%i40) maybe(equal(sqrt(3 + 2*sqrt(2)), 1 + sqrt(2)));(%o40)

true

また、多項式 x2 + 2 x + 1 = (x + 1)2 や有理式 1 +1 x+1=の場合も同様です。
xx

M AXIMA I NPUT /O UTPUT(%i41) maybe(xˆ2 + 2*x + 1 = (x + 1)ˆ2);(%o41)

false(%i42) maybe(equal(xˆ2 + 2*x + 1, (x + 1)ˆ2));(%o42)true

第 2 章 Maxima の基本

36(%i43) maybe(1 + 1/x = (x + 1)/x);false(%o43)(%i44) maybe(equal(1 + 1/x, (x + 1)/x));true(%o44)

関数 assume によって同一視した場合、equal では true になりますが、= では falseになります。
M AXIMA I NPUT /O UTPUT(%i45) assume(equal(a, b));[equal(a, b)](%o45)(%i46) maybe(a = b);

false(%o46)(%i47) maybe(equal(a, b));true(%o47)

2.7

ファイル操作

Maxima でファイルを読み込むには、基本的に関数 load もしくは batch のいずれかを使います*50 。関数 load が黙って読み込むのに対して、関数 batch は記述された内容を逐一実行し、結果を画面に出力していきます。簡単な実験のため、1 行目に 3*4 + 5;、2 行
目に 2ˆ10 - 1; と記述したファイル test.mac を作成し、ホームフォルダ C:¥Documents

and Settings¥User Name に入れてください*51 。
1

3*4 + 5 ;2

2ˆ10 − 1 ;3

このファイル test.mac を Maxima に読み込んでみます。UNIX 系 OS の場合はもちろんWindows でもフォルダの区切り記号には円（¥）ではなく、半角スラッシュ（/）を使わなければならないことに注意が必要です。
M AXIMA I NPUT /O UTPUT(%i1) load("C:/Documents and Settings/User Name/test.mac");(%o1)

C:/Documents and Settings/User Name/test.mac*50 この他にもいくつかの関数があります。

*51 Windows 向けの記述ですが、 Mac OS X などの場合もほぼ同じですので、適宜読み替えてください。

2.7 ファイル操作37(%i2) batch("C:/Documents and Settings/User Name/test.mac");batching #pC:/Documents and Settings/User Name/test.mac(%i3)

5 + 3 4*52

(%o3)

17

(%i4)

10

(%o4)

2 −1
1023

関数 batch を実行した場合と違い、関数 load を実行した場合は、内部でいくつ命令を実行しても、それらがカウントされないことにも注目すべきでしょう。
さて、読み込むファイル名をフルパスで入力しなければならないのは苦痛です。実は、カレントフォルダ及び変数 file_search_maxima もしくは maxima_userdir に設定されているフォルダに入っているファイルについてはファイル名のみで読み込むことができます*53 。カレントフォルダは多くの場合ホームフォルダですが、念のため確認しておきましょう。外部コマンドを実行するための関数 system を使い、UNIX 系 OS の場合は pwd
コマンドを、Windows の場合は cd コマンドを実行します。
M AXIMA I NPUT /O UTPUT(%i5) system("cd");
C:¥Documents and Settings¥User Name
(%o5)

0

カレントフォルダが（案の定）C:¥Documents and Settings¥User Name と分かりましたから、先ほどの test.mac はファイル名のみで読み込めるはずです。試してみましょう。
M AXIMA I NPUT /O UTPUT(%i6) batch("test.mac");batching #pC:/Documents and Settings/User Name/test.mac
(%i7)

5+34

(%o7)

17

(%i8)

10

(%o8)

2 −1
1023

変数 file_search_maxima には公式パッケージをファイル名のみで読み込めるように、はじめからたくさんのフォルダが設定されていますが、そのフォルダリストは 変数

file_search_maxima を実行することで確認できます。
*52 3 と 4 の間にかけ算記号 × は付かないようです。

*53 この他、変数 file_search_lisp に設定されているフォルダに入っている場合もパスは不要です。

第 2 章 Maxima の基本

38
M AXIMA I NPUT /O UTPUT(%i9) file_search_maxima;(%o9) [C:/Documents and Settings/User Name/maxima/###.{mac,mc},
C:/PROGRA˜1/MAXIMA˜1/share/maxima/5.14.0/share/###.{mac,mc},
C:/PROGRA˜1/MAXIMA˜1/share/maxima/5.14.0/share/{affine,algebra,algebra/charsets,algebra/solver,calculus,combinatorics,contrib,contrib/boolsimp,contrib/descriptive,contrib/diffequations,contrib/diffequations/tests,contrib/distrib,contrib/dynamics,contrib/ezunits,contrib/format,contrib/gentran,contrib/gentran/test,contrib/Grobner,contrib/lurkmathml,contrib/maximaMat
hML,contrib/mcclim,contrib/numericalio,contrib/pdiff,contrib/
prim,contrib/rand,contrib/sarag,contrib/simplex,contrib/simpl
ex/Tests,contrib/solve_rec,contrib/state,contrib/stats,contrib/stringproc,contrib/unit,contrib/Zeilberger,diffequations,lb
fgs,linearalgebra,integequations,integration,macro,matrix,mis
c,numeric,orthopoly,physics,simplification,sym,tensor,tensor/
tests,trigonometry,utils,vector}/###.{mac,mc}]
この変数 file_search_maxima に「ファイルの在処」を追加すれば、ファイル名のみで読み込めるようになります。例として、フォルダ C:¥Temp を追加してみましょう。フォ
ルダリストへの追加には関数 append を用います。
M AXIMA I NPUT /O UTPUT(%i10) file_search_maxima: append(file_search_maxima,["C:/Temp/###.{mac,lisp}"]);(%o10) [C:/Documents and Settings/User Name/maxima/###.{mac,mc},（中略）,utils,vector}/###.{mac,mc},
C:/Temp/###.{mac,lisp}]
これでフォルダ C:¥Temp に入っているファイルもファイル名のみで読み込めるようになったはずです。なお、上記のように設定すると、パス名だけでなく、拡張子も（それが.mac もしくは .lisp であれば）省略可能になります。先ほどの test.mac を C:¥Temp に移動して、実験してみてください。
M AXIMA I NPUT /O UTPUT(%i11) file_search("test");2.7 ファイル操作

39
C:/Temp/test.mac(%o11)

変数 maxima_userdir に設定されたフォルダに入っているファイルもファイル名のみで読み込むことができますが、この変数は Maxima 起動後に変更すべきものではありません。必要なら環境変数 MAXIMA USERDIR に設定してください。
以上でファイルの読み込みについては Maxima を自在に操れるようになりましたが、常に利用したい関数や設定がある場合、再起動の度に読み込み直さなければならないのは不便でしょう。そういった場合は初期設定ファイルを利用します。Maxima はホームフォル
ダに置かれた maxima-init.mac という名前のファイルを初期設定ファイルと認識し、起動時に自動的に読み込みます*54 。
次に、Maxima による計算結果等をファイルに保存する方法について解説します。ファイルへ保存する（保存したくなる）情報は、変数や関数、入力行や出力行といった Maxima
が保持している情報（保持しておくべき情報）と標準出力の内容の 2 種類に分けることができます。Maxima が保持している情報をファイルへ保存するには関数 stringout もし
くは save を用います。
関数 stringout の書式とその意味を表にまとめると、次のようになります。
書式保存されるもの

stringout("ファイル名", ○, □, △, .....);○、□、△、.....

stringout("ファイル名", [番号1, 番号2]);(%i 番号1)〜(%i 番号2)

stringout("ファイル名", input);

全ての入力

stringout("ファイル名", functions);

全ての（ユーザ）関数

stringout("ファイル名", values);

全ての（ユーザ）変数

3 番目 stringout("ファイル名", input) は、とりあえず全ての入力行をファイルに保存しておき、適宜エディタで取捨選択して再利用する、といって用途に使います。出力
行を保存したい場合などは 1 番目の書式を使います。
M AXIMA I NPUT /O UTPUT(%i12) stringout("test.out", %o5, f(x), a);(%o12)

C:/Documents and Settings/User Name/test.out

この場合、ファイル test.out には 3 つの要素、出力行 (%o5)、関数 f(x)、変数 a が記録されます。なお、関数 f(x) や変数 a に何も代入されていない場合は、文字列「f(x);」および「a;」が記録されます。つまり、記録されるのは画面上で f(x); や a; を実行し*54 何らかの事情で読み込まれない場合は、 Maxima の src フォルダに入れておけばよいでしょう。

第 2 章 Maxima の基本

40た結果です*55 。

なお、標準状態では関数 stringout は上書きモードで実行されますから、同じファイル名を指定すると、先に保存してある内容は消去されてしまいます。追記モードに変更す
るには、変数 file_output_append に true を代入します。
一方、関数 save は関数 stringout の高機能版とも言える関数で、入力行だけでなく出力行も含めて全てを丸ごとファイルに保存することなどができます。ただし、保存されたデータは（テキスト形式ではありますが）独自フォーマットであり、エディタで開いてもその内容を正確に把握するのは困難です（雰囲気は分かりますが）。従って、関数 save
は、作業を一旦中断しあとで続きから実行したい、といった用途に利用することになるでしょう。ファイルを読み込む関数 loadfile と実行内容を振り返る関数 playback を併用します。
M AXIMA I NPUT /O UTPUT（延々と続く作業）(%i13) save("today.out", all);(%o13)

today.out

ファイル today.out には (%o13) までの作業全てが保存されます。ここで、一旦 Maxima
を終了して、Maxima を再起動します。
M AXIMA I NPUT /O UTPUT(%i1) loadfile("today.out");(%o1)

today.out(%i14) playback();（today.out に保存されていた (%i1) から (%o13) までが、ずら〜っと表示されます）(%o14)

done

標準出力の内容をファイルに保存するには、関数 with_stdout を用います。次の例を見てください。
M AXIMA I NPUT /O UTPUT(%i15) load("mactex-utilities.lisp")$*56 。
(%i16) tex(diff(log(x), x));$$\frac{1}{x}$$*55 フォーマットは異なるかもしれません。

*56 デフォルトでは plain TEX 流の出力になってしまうため、 mactex-utilities.lisp を load しています。

2.7 ファイル操作

41
false

(%o16)

関数 tex は引数（式やラベル）を LATEX コマンドで表現したものを標準出力（画面）に、そして戻り値「false」を出力行にそれぞれで出力します。このような場合、先の関数

stringout を用いると、「ファイル」には文字列「false」が保存され、関数 with_stdoutを用いると、「$$\frac{1}{x}$$」が保存されます。
命

令

保存されるもの

stringout("ファイル名", tex(diff(log(x), x)));false

with_stdout("ファイル名", tex(diff(log(x), x)));$$\frac{1}{x}$$

引数に入力行番号を与える場合は、with stdout("test.out", ’’%i16); のように頭に二重単引用符を付けます。なお、複数の引数をカンマで繋いで列挙すれば、一度に複数の内容を「ファイル」に保存することも出来ます。
関数 tex の他、関数 display、disp、print などにより出力される文字列をファイルに保存したい場合も関数 with_stdout を用います。
また、関数 writefile と closefile と組み合わせて利用すれば、作業状況を「画面に表示されたそのままの状態で」保存することができます。
M AXIMA I NPUT /O UTPUT(%i17) writefile("work.out");
Starts dribbling to work.out (2317/12/24, 0:0:0).
(%o17)

false
保存される範囲（いろいろな作業）(%i18) closefile();Finished dribbling to work.out.
(%o18)

false

このとき、ファイル work.out には「Starts ...」から「closefile();」までが記録されます。上記「いろいろな作業」の部分で関数 playback(); を実行すれば、画面に表示されたものを全て丸ごとそのままの形で普通のテキストデータとして保存することができます。なお、関数 writefile は常にファイルを上書きします。追記する場合は代わりに関
数 appendfile を用います。

43

第3章

Maxima を俯瞰する
この章では基本的な数学の問題を Maxima を使って解いてみることによって、Maxima
を概観します。どのような問題を「基本的」と呼ぶかは主観に依存しますが、なるべく多くの人にとって「基本的」であることを目指し、センター試験、微分積分、行列の問題を取り上げています。

3.1

センター試験

本節の例題は全てセンター試験からの引用です。ただし、問題の全文ではなく部分的な引用です。また、空欄は

アイ

ア

の代わりに

とするなど簡素化しました。

【例題】 2 次方程式 x2 − 3 x − 1 = 0 の解が α、β で、α > β とするとき、

α=

ア ,

β=

イ

である。また、m < α < m + 1 を満たす整数 m の値は m =ウn < β < n + 1 を満たす整数 n の値は n =エである。次に、α +

1
=
α

オ

であり、α3 +1=
α3【解答】 前半は単純に 2 次方程式を解くだけです。
M AXIMA I NPUT /O UTPUT(%i1) xˆ2 - 3*x - 1 = 0;(%o1)

x2 − 3 x − 1 = 0カである。 （平成 18 年度）

第3章

44

Maxima を俯瞰する(%i2) s: solve(%, x);*1
√
√



13 − 3
13 + 3  x = −
, x=
(%o2)
2
2
(%i3) float(s);*2[x = −0.30277563773199, x = 3.302775637731995]

(%o3)

√
√
13 + 313 − 3
従って、「ア」は、「イ」は −、「ウ」は 3、「エ」は −1 と求まりました。
2
2√
13 + 3（リスト s の 2 番目の要素）を用いて後半部分を計算します。
ここで求めた α =2
M AXIMA I NPUT /O UTPUT(%i4) ratsimp(s[2] + 1/s[2], algebraic: true);
x2 + 1 √
= 13
(%o4)
x
(%i5) ratsimp(s[2]ˆ3 + 1/s[2]ˆ3, algebraic: true);√
x6 + 1= 10 13
(%o5)
x3
より、
「オ」は

√
√
13、
「カ」は 10 13 と求まりました。なお、上の計算で、有理式を簡単にする関数 ratsimp*3 を使っていますが、その際、有理化を実行するために変数 algebraic*4に true を代入しています。
【例題】 p、q、r を実数とし、x についての整式 A、B を

A = x3 + p x2 + q x + r,

B = x2 − 3 x + 2とする。

(a) A を B で割ったときの商が x − 1 であった。このとき、 p =

ア

p+

ウ

(c) A を B で割ったとき、その商と余りが等しくなった。このとき、q + r =エ(b) A を B で割ったときの余りが x で割り切れた。このとき、r =

イ

である。

である。
である。
【解答】 (a)（平成 15 年度）

A を B で割ったときの商を求めます。

*1 solve [sÁlv, sÓ:lv] 解く。

*2 float [flóut]: floating point 浮動小数点。

*3 ratsimp = rationally simplify: rational [rǽS@nli] 有理的に。 simplify [sı́mpl@fài] 簡単にする。

*4 algebraic [æ̀lÃ@béiik] 代数的な。

3.1 センター試験

45

M AXIMA I NPUT /O UTPUT(%i1) A: xˆ3 + p*xˆ2 + q*x + r;
x3 + p x2 + q x + r(%o1)(%i2) B: xˆ2 - 3*x + 2;

x2 − 3 x + 2(%o2)(%i3) quotient(A, B);*5

x+ p+3(%o3)
これが x − 1 に一致することから、
M AXIMA I NPUT /O UTPUT(%i4) solve(% = x - 1, p);[p = −4](%o4)
より、「ア」は −4 と求まりました。

(b)

A を B で割ったときの余りを求めます。

M AXIMA I NPUT /O UTPUT(%i5) remainder(A, B, x);*6(q + 3 p + 7) x + r − 2 p − 6(%o5)

これが x で割り切れるのは定数項が 0 の場合ですから、
M AXIMA I NPUT /O UTPUT(%i6) solve(coeff(%, x, 0) = 0, [r, p]);[[r = 2 %r4 + 6, p = %r4]](%o6)

より、「イ」は 2、「ウ」は 6 と求まりました。

(c)

上で求めた商と余りを再利用すれば十分ですが、 Maxima には商と余りを同時に求める関数 divide*7 がありますので、改めて A を B で割ったときの商と余りを求め、それらが一致するような p、q、r を求めることにします。
M AXIMA I NPUT /O UTPUT(%i7) divide(A, B, x);(%o7)[x + p + 3, (q + 3 p + 7) x + r − 2 p − 6]

*5 quotient [kwóuS(@)nt] 商。

*6 remainder [riméind@(r)] 余り。

*7 divide [diváid] 割る（

multiply）。

第3章

46

Maxima を俯瞰する(%i8) %[2] - %[1];(%o8)(q + 3 p + 7) x − x + r − 3 p − 9(%i9) solve([coeff(%, x, 0) = 0, coeff(%, x, 1) = 0], [p, q, r]);(%o9)[[p = %r6, q = −3 %r6 − 6, r = 3%r6 + 9]](%i10) %[1][2] + %[1][3];r+q=3(%o10)
よって、「エ」は 3 と求まりました。

【例題】 数列 {an } の初項から第 n 項までの和 S n =

n
X

ak が

k=1

S n = −n2 + 24 n (n = 1, 2, 3, · · · )で与えられるものとする。このとき a1 =となる自然数 n の範囲は n ≧ウア 、a 2 =イである。また、an < 0

であり、
40
X
k=1

|ak | =エとなる。

（平成 17 年度）【解答】 まず、和 S n と一般項 an の関係

an =

(

S1
S n − S n−1(n = 1)(n > 1)を使って、一般項 an を求めてしまいます。
M AXIMA I NPUT /O UTPUT(%i1) S[n]:= -nˆ2 + 24*n;(%o1)(%i2) a[n]:= S[n] - S[n-1];(%o2)

S n := −n2 + 24 n
an := S n − S n−1

和 S n の式に形式的に n = 0 を代入すると、S 0 = 0 となりますから、(%o2) は n = 1 の場合も成り立ちます。従って、
M AXIMA I NPUT /O UTPUT(%i3) a[1];3.1 センター試験

47
23

(%o3)
(%i4) a[2];

21

(%o4)

より、「ア」は 23、「イ」は 21 と求まりました。また、
M AXIMA I NPUT /O UTPUT(%i5) sum(abs(a[n]), n, 1, 40);*8
928

(%o5)

より、
「エ」は 928 と求まりました。なお、「ウ」は「エ」を求めるための布石と思われま
すから、もはや解く必要はありませんが、例えば次のようにすれば求められます。
M AXIMA I NPUT /O UTPUT(%i6) expand(a[n]);25 − 2n(%o6)(%i7) for n: 1 while(a[n] >= 0) do display(a[n]);a1 = 23
a2 = 21a3 = 19（中略）

a11 = 3a12 = 1
done

(%o7)

(%o6) より an が単調減少と分かりますから、初項から順に an が正である限り出力し続けてみました。これにより、an < 0 となるのが第 13 項以降、つまり、「ウ」が 13 と求まりました。
【例題】 次の資料は 2 科目の小テストに関する 5 人の生徒の得点を記録したものである。2 科目の小テストの得点をそれぞれ変量 x、y とする。
生徒番号

1

2

3

4

5

x

3

4

5

4

4

y

7

9

10

8

6

*8 sum = summation [s2méiS(@)n] 合計、総和。 abs = absolute [ǽbs@l(j)ù:t] value 絶対値。

第3章

48
(1) 変量 x の分散を小数で求めると、 アとなる。

(2) 変量 y を使って新しい変量 t を t = y −イ

Maxima を俯瞰するで定めると、変量 t の平均は 0 になる。

(3) 変量 x と変量 y の相関係数を r とし、その 2 乗を r2 で表すと、r2 =なる。
【解答】 (1)ウと（平成 18 年度）

まず平均 x̄ =めることになります。

5
5
1 X
1 X
xi を求め、それを用いて分散 σ x =(xi − x̄)2 を求
5 i=1
5 i=1

M AXIMA I NPUT /O UTPUT(%i1) x: [3, 4, 5, 4, 4];(%o1)[3, 4, 5, 4, 4](%i2) sum(x[i], i, 1, 5)/5;
(%o2)

4

(%i3) sum((x[i] - 4)ˆ2, i, 1, 5)/5;
2
(%o3)
5
(%i4) float(%);
(%o4)

0.4

より、
「ア」は 0.4 と求まりました。

(2)

変量 t の平均が 0 になるのですから、「イ」に当てはまるのは変量 y の平均です。なお、あとの問題で必要になりそうですから、分散も計算しておきます。
M AXIMA I NPUT /O UTPUT(%i5) y: [7, 9, 10, 8, 6];(%o5)[7, 9, 10, 8, 6](%i6) sum(y[i], i, 1, 5)/5;
(%o6)

8

(%i7) sum((y[i] - 8)ˆ2, i, 1, 5)/5;
(%o7)

2

より、
「イ」は 8 と求まりました。

(3)

求める値は相関係数の 2 乗ですから、共分散の 2 乗を x、y の分散の積ばよいでしょう。

2× 2 で割れ5

3.1 センター試験

49

M AXIMA I NPUT /O UTPUT(%i8) sum((x[i] - 4)*(y[i] - 8), i, 1, 5)/5;
3
(%o8)
5
(%i9) %ˆ2/(2/5*2);
9
(%o9)
20
従って、
「ウ」は

9
と求まりました。
20√

4{(1 − sin θ) + i cos θ}と(1 − sin θ) − i cos θする。ただし、0◦ < θ < 90◦ とする。また、arg z は複素数 z の偏角を表すものとし、【例題】 複素数 z0 、z1 を z0 = ( 3 + i)(cos θ + i sin θ)、z1 =偏角は −180◦ 以上 180◦ 未満とする。

(1) |z0 | =ア、arg z0 =イ◦+ θ である。

(2) z1 の分母と分子に (1 − sin θ) + i cos θ をかけて計算すると z1 =i cos θ) となる。よって、|z1 | = エ 、arg z1 =
◦
z1
z1
である。
(3)
= カ 、arg = キz0z0【解答】 (1)複素数 w =オ◦ウ(− sin θ ++ θ である。
（平成 15 年度）√
3 + i の絶対値と偏角を求めます。

M AXIMA I NPUT /O UTPUT(%i1) w: sqrt(3) + %i;
i+

(%o1)

√
3

(%i2) polarform(%);
iπ

2e 6

(%o2)

ここで、polarform*9 は極形式に変形する関数ですが、高校で学ぶ r (cos θ + i sin θ) ではなく、指数形 r ei θ で出力します：

r ei θ = r (cos θ + i sin θ)ππと同値ですから、|w| = 2、arg w = 30◦ が得られた+ i sin
66
ことになります。よって、「ア」は 2、「イ」は 30 と求まりました。なお、Maxima には絶

従って、(%o2) は 2 cos

対値を求める関数 abs と偏角を求める関数 carg もありますので、これらを利用しても良いでしょう。
*9 polarform = polar [póul@(r)] form 極形式。

第3章

50

Maxima を俯瞰する

M AXIMA I NPUT /O UTPUT(%i3) abs(w);2(%o3)(%i4) carg(w);

π
6

(%o4)

(2)

親切に変形手順が記されていますが、Maxima には無用の長物です。
M AXIMA I NPUT /O UTPUT(%i5) z[1]: 4*(1 - sin(x) + %i*cos(x))/(1 - sin(x) - %i*cos(x));
4 (− sin x + i cos x + 1)(%o5)
− sin x − i cos x + 1(%i6) trigrat(%);*10
4 i cos x − 4 sin x(%o6)

より、「ウ」は 4 と求まりました。また、− sin θ + i cos θ = i (cos θ + i sin θ) と変形できますから、「エ」は 4、「オ」は 90 と求まりました。

|z1 | 4z1
z1=
= = 2、arg = arg z1 − arg z0 =z0
|z0 | 2z0(90◦ + θ) − (30◦ + θ) = 60◦ と求める問題ですが、折角ですので Maxima に解かせてみま(3)

絶対値および偏角の基本的な性質からしょう。

M AXIMA I NPUT /O UTPUT(%i7) z[0]: w*(cos(x) + %i*sin(x));√(%o7)(i + 3)(i sin x + cos x)(%i8) trigsimp(z[1]/z[0]);*11
(%o8)

√

3i + 1(%i9) polarform(%);
iπ

2e 3

(%o9)

より、
「カ」は 2、「キ」は 60 と求まりました。

3.2

微分積分（極限）

極限（値）を計算するには関数 limit を用います。関数 limit は書式*10 trigrat = trigonometric + rational: trigonometric [trı̀g(@)n@métrik] function 三角関数。 rational [rǽS@nl] 有理の。

*11 trigsimp = trigonometric + simplify: simplify [sı́mpl@fài] 簡単にする。

3.2 微分積分（極限）51limit(関数, 変数, 近づける値)

またはlimit(関数, 変数, 近づける値, 近づける方向)
により実行します。2 番目の書式は（もちろん）右極限と左極限を求めるためのものです
が、右極限の場合は plus を、左極限の場合は minus をそれぞれ「近づける方向」に設定します。この他、Maxima では我々が普段使っている無限大 ∞ 等の記号の代わりに、次のような表記が使われます。

表記

意味

inf

∞

minf

−∞

und

定義されない（もしくは不明）

ind

不定だが有界infinity

複素無限大

M AXIMA I NPUT /O UTPUT(%i1) limit(%eˆx, x, inf);
inf

(%o1)
(%i2) limit(%eˆx, x, minf);

0

(%o2)
(%i3) limit(sin(x)/x, x, 0);

1

(%o3)
(%i4) limit((-1)ˆx, x, inf);

ind

(%o4)
(%i5) limit((-2)ˆx, x, inf);

infinity(%o5)(%i6) limit(1/x, x, 0);

und

(%o6)

sin x
= 1、 lim (−1) x = 定義されない、
x→∞
x→0 x

上から順に lim e x = ∞、 lim e x = 0、lim
x→∞

x→−∞

lim (−2) = 定義されない、lim
x

x→∞

1

x→0 x

= 発散（定義されない）を計算したものです。なお、微分積分（実関数）では負の数を底とする指数関数は定義しないので、(%i4) や (%i5) のような計算を実行させることには問題があることに注意しましょう。次に、右極限と左極限の例を計算してみましょう。

第3章

52

Maxima を俯瞰する

M AXIMA I NPUT /O UTPUT(%i7) limit(1/x, x, 0, plus);
inf

(%o7)
(%i8) limit(1/x, x, 0, minus);

minf

(%o8)
それぞれ、 lim

1x→+0 x3.3= ∞、 lim

1x→−0 x= −∞ を計算したものです。

微分積分（微分）

微分を計算するには関数 diff を用います。関数 diff は書式

diff(関数, 変数)またはdiff(関数, 変数1, 回数1, 変数2, 回数2, .....)
!′


log x
12
2 x ′
*
により実行します 。手始めに積の微分 x 2 と商の微分 2を計算させてみま
x +1

しょう。

M AXIMA I NPUT /O UTPUT(%i1) diff(xˆ2*2ˆx, x);x2 2 x log 2 + 2 x 2 x(%o1)(%i2) diff(log(x)/(xˆ2 + 1), x);
2 x log x
1
− 2
(%o2)
2
x (x + 1) (x + 1)2
次は、関数

√

x の 10 階導関数と 2 変数関数 sin(2 x + 3 y) を変数 x と y でそれぞれ 1 回ずつ微分する例です。
M AXIMA I NPUT /O UTPUT(%i3) diff(sqrt(x), x, 10);34459425
1024 x19/2(%i4) diff(sin(2*x + 3*y), x, 1, y, 1);
(%o3)

(%o4)

−

−6 sin(3 y + 2 x)

*12 変数を省略して diff(関数) を実行すると、全微分を出力します。

3.3 微分積分（微分）53ここで、(%o4) は、関数 sin(2 x + 3 y) を x で微分し、その結果 2 cos(2 x + 3 y) を y で微分したものになっています。つまり、関数 diff が求めているのは、指定された変数以外を定数と見なして微分する「偏微分」です。この事実はもっと単純な例で実験してみれば明らかになります。
M AXIMA I NPUT /O UTPUT(%i5) diff(xˆ2 + x*y + yˆ2, x);
y+2x

(%o5)

変数 y を x の関数として微分したい場合、すなわち「陰関数微分」を求めたい場合は、
変数 y 代わりに明示的に f (x) を使うか、関数 depends を用いて y が x の関数であることを Maxima に教えてあげます*13 。
M AXIMA I NPUT /O UTPUT(%i6) diff(xˆ2 + x*f(x) + f(x)ˆ2, x);
d
d
(%o6)
2 f (x)f (x) + x
f (x) + f (x) + 2 xdxdx(%i7) depends(y, x);[y(x)](%o7)(%i8) diff(xˆ2 + x*y + yˆ2, x);
dy
dy
+x
+y+2x
(%o8)
2y
dx
dx
試しに、次の例題を解いてみましょう。
【例題】 方程式 xy = y x によって定まる陰関数 y の導関数を求めよ。
【解答】 既に depends(y,x) を実行してありますから、微分して、です。

dyについて解くだけdx

M AXIMA I NPUT /O UTPUT(%i9) diff(xˆy = yˆx, x);
(%o9)

 dy

 x



dy y
dx

x
y
= y 
++ log y
x log x
dx x
 y

!

(%i10) solve(%, diff(y, x));*13 変数 derivabbrev に true を代入すると、

ddyf (x) やの代わりに f (x) x や yx のような出力に切り替dx
dx

えることができます。元に戻すには false を代入します。

第3章

54

Maxima を俯瞰する

dyx y x+1 log y − xy y2=− 2 xdx
x y − xy+1 y log x(%o10)(%o10) が求める答えです。
定義した依存関係を解除するには関数 remove を使います。
M AXIMA I NPUT /O UTPUT(%i11) properties(y);[dependency](%o11)(%i12) remove(y, dependency);
done(%o12)(%i13) properties(y);[](%o13)(%i14) diff(xˆy = yˆx, x);xy−1 y = y x log y(%o14)

変数 y に割り当てられていた性質 dependency が、関数 remove の実行によって削除されたことが分かります。

Maxima には Taylor 展開（Maclaurin 展開）を求める関数 taylor も存在します。関数
taylor は書式
taylor(関数, 変数, 中心, 階数)により実行します。言わずもがなですが、「中心」が 0 の場合を Maclaurin 展開と呼ぶの1xでした。関数 √ の x = 1 を中心とした Taylor 展開と関数 arctan x の Maclaurin 展開を求めてみましょう。
M AXIMA I NPUT /O UTPUT(%i15) taylor(1/sqrt(x), x, 1, 4);
x − 1 3 (x − 1)2 5 (x − 1)3 35 (x − 1)4(%o15)/T/
1−
+
−
+
+···
2
8
16
128
(%i16) taylor(atan(x), x, 0, 20);x3 x5 x7 x9 x11 x13 x15 x17 x19(%o16)/T/ x −
+
−
+
−
+
−
+
−
+···
3
5
7
9
11
13
15
17
19

3.4 微分積分（積分）

3.4

55

微分積分（積分）

積分を計算するには関数 integrate を用います。関数 integrate は不定積分か定積分かに応じてそれぞれ書式

integrate(関数, 変数)

あるいはにより実行します。試しに、不定積分てみましょう。

Z

integrate(関数, 変数, 下端, 上端)

log x dx および定積分2

Z 1

arctan x dx を計算し0

M AXIMA I NPUT /O UTPUT(%i1) integrate(log(x)ˆ2, x);


(%o1)
x log2 x − 2 log x + 2(%i2) integrate(atan(x), x, 0, 1);
2 log 2 − π
(%o2)
−
4
不定積分

Z

log2 x dx の結果 (%o1) に積分定数 C が付いていないので、このままコピー

ペーストすると試験では減点されますので注意しましょう。積分定数が付かないと気が済まない場合は微分方程式として解を求めます。
M AXIMA I NPUT /O UTPUT(%i3) diff(f(x), x) = log(x)ˆ2;df (x) = log2 x(%o3)dx(%i4) ode2(%, f(x), x);


(%o4)
f (x) = x log2 x − 2 log x + 2 + C
積分定数はさして重要ではありませんが、次の実行結果は明らかに間違いです。
M AXIMA I NPUT /O UTPUT(%i5) integrate(1/x, x);
(%o5)

log x

第3章

56

Maxima を俯瞰するZ

1
dx = log |x| + C ですから Maxima は絶対値を忘れていることになりまx
す*14 。絶対値を付けさせるには変数 logabs*15 に true を代入しておきます。
正しくは、

M AXIMA I NPUT /O UTPUT(%i6) logabs: true;
true

(%o6)
(%i7) integrate(1/x, x);(%o7)

log abs x

ただ、式が複雑になると絶対値が煩わしくなりますので、元に戻しておきます。
M AXIMA I NPUT /O UTPUT(%i8) logabs: false;
false

(%o8)

なお、原始関数を求められなかった場合、Maxima はそのままの式を出力します。
M AXIMA I NPUT /O UTPUT(%i9) integrate(sin(x)/x, x);
(%o9)

Z

sin x
dx
x

広義積分も運が良ければ計算できます。
M AXIMA I NPUT /O UTPUT(%i10) integrate(1/xˆ2, x, 1, inf);(%o10)

1(%i11) integrate(1/xˆ3, x, -1, minf);1(%o11)
2(%i12) integrate(1/sqrt(x), x, 0, 1);(%o12)

2(%i13) integrate(1/xˆ2, x, 0, 1);
Integral is divergent– an error. Quitting. To debug this try debugmode(true);*14 絶対値が付かないのはバグではなく仕様です。

*15 logabs = logarithm + absolute value: logarithm [lÓ(:)ě@rı̀D(@)m, lÁ(:)ě@rı̀D(@)m] 対数。 absolute value 絶対値。

3.5 行列（基本演算）

57(%i13) のように発散する場合はエラーになりますが、一応発散することは教えてくれ
ます。

3.5

行列（基本演算）行列を定義するには関数 matrix*16 を用います。関数 matrix は書式

matrix([成分11, 成分12, .....], [成分21, 成分22, .....], .....);
により実行します。また、行列演算には次の記号を用います。
記号

役

割

+

足し算

-

引き算

*

スカラー倍（もしくは成分同士のかけ算）.

行列としてのかけ算/

成分同士のかけ算

ˆ

成分ごとの累乗

ˆˆ

行列としての累乗

ˆˆ-1

逆行列（関数 invert でも求まる）

いくつか単純な計算例を実行してみましょう。
M AXIMA I NPUT /O UTPUT(%i1) A: matrix([2, -1], [-3, 2]);
!
2 −1
(%o1)
−3 2
(%i2) B: matrix([3, 0], [-2, 1]);
!
3 0
(%o2)
−2 1
(%i3) A - B;
!
−1 −1
(%o3)
−1 1
(%i4) A.B;
!
8
−1
(%o4)
−13 2
(%i5) 2*B;
!
6 0
(%o5)
−4 2
(%i6) Aˆˆ-1;*16 matrix [méitriks, mǽitriks] 行列。

第3章

58
2
3

(%o6)

1
2

Maxima を俯瞰する!

(%i7) A.% = %.A;
(%o7)

1
0

!
!
0
1 0
=
1
0 1

最後の (%o7) は、逆行列との積が単位行列になることを確認しているところです。
続いて、次の例題を解いてみます。


0

【例題】 行列 M = 0
0
1 0

0 1 と可換な行列を求めよ。
0 0【解答】 求める行列を X とするとき、具体的に M X = X M を計算してみます。
M AXIMA I NPUT /O UTPUT(%i8) M: matrix([0, 1, 0], [0, 0, 1], [0, 0, 0]);0 1 0
0 0 1
(%o8)


0 0 0
(%i9) X: matrix([a, b, e], [d, e, f], [g, h, i]);a b c 


(%o9)
d e f 
g h i(%i10) M.X = X.M; d e f  0 a b

 

(%o10)
g h i  = 0 d e
0 0 0
0 g h
(%o10) の成分を比較すると、d = g = h = 0 かつ a = e = i かつ b = f が得られますかa b c
ら、求める行列は 0 a b（a、b、c は任意の数）となります。


0 0 a

当然のことながら Maxima では行列の基本的な量である行列式や階数、固有値や固有ベ

クトル、固有多項式も求めることができます。主なものを表 3.1 にまとめました。これらを利用して、代表的な例題を解いてみましょう。

3.5 行列（基本演算）59
表 3.1 行列に関する関数（主なもの）

関

数

役

determinant

行列式

rank

階数

charpoly

割

固有多項式（特性多項式）

eigenvalues

固有値

eigenvectors

固有ベクトルtranspose

転置行列

adjoint

余因子行列

triangularize

上三角化

echelon

階段行列化

mattrace

トレース（load ("nchrpl"); が必要）


1
 x
【例題】 行列 M = 
 x
x

x x
1 x
x 1
x x


x

x
 が逆行列を持たないような x の値を全て求めよ。
x
1【解答】 行列式が 0 になる x の値を求めればよいですね。
M AXIMA I NPUT /O UTPUT(%i11) M: matrix([1,x,x,x], [x,1,x,x], [x,x,1,x], [x,x,x,1]);1 x x x x 1 x x(%o11)
 x x 1 x
x x x 1(%i12) factor(determinant(M));*17(%o12)(%i13) solve(% = 0, x);*18−(x − 1)3 (3 x + 1)(%o13)*17 determinant [dit´@:(r)m@n@nt] 行列式。

"

1
x=− , x=1
3

*18 solve(%, x); のように =0 は省略できます。

#

第3章

60

Maxima を俯瞰する

本問の場合行列式が単純な式に因数分解できましたから、関数 solve を使うまでもな
く、(%o12) からすぐに x = 1, −


1

【例題】 行列 M = 2

1

1を導く方が自然かもしれません。
3−3 0 

−2 1  を対称行列と交代行列の和に表せ*19 。
0 −2【解答】 なにやら難しそうな問題ですが、実は S = M + t M と T = M − t M がそれぞれ対称行列と交代行列になりますから、M =1
1
S + T が答えです。従って、
22

M AXIMA I NPUT /O UTPUT(%i14) M: matrix([1, -3, 0], [2, -2, 1], [1, 0, -2]);1 −3 0 2 −2 1 (%o14)

1 0 −2(%i15) S: M + transpose(M);*20
 2 −1 1 (%o15)
−1 −4 1 
1
1 −4(%i16) T: M - transpose(M);0 −5 −1
1 
(%o16)
5 0
1 −1 0(%i17) ’(M = 1/2 * S + 1/2 * T);
T S(%o17)
M= +2 2(%i18) ev(%);*21
 1 −3 0  1 −3 0 2 −2 1  = 2 −2 1 (%o18) 

1 0 −2
1 0 −21 −3より、2 −2

1 0



 2
0 
1


1  = −1
 2 
1
−2



0
−1 1 
1
−4 1  + 5
 2 
1 −4
1


−5 −1

01  と求まりました。なお、最後−1 0の (%i17) と (%i18) は本来不要なものですが、まず (%i17) で行列 M 、S 、T を計算せずに出力しておき、(%i18) で計算を実行させることで、入力ミスがないかを含め検算しました。
*19 一般に、 t A = A および t A = −A を満たす行列をそれぞれ対称行列、交代行列と呼ぶのでした。

*20 transpose [trænspóuz]: transposed matirx 転置行列。

*21 ev = evaluate [ivǽljuèit] 評価する。

3.5 行列（基本演算）

61【例題】 ベクトル空間 R4 内において、v1 = (3, 0, −1, 1)、v2 = (1, −2, 3, 2)、v3 =(2, 0, −1, 2)、v4 = (2, −2, 3, 1) とするとき、これらのうち 1 次独立なものの最大個数を求めよ。また、そのようなベクトルを 1 組求め、それらの 1 次結合で残りのベク
トルを表せ。
【解答】 最大個数については階数を計算するだけです。
M AXIMA I NPUT /O UTPUT(%i19) v[1]: [3, 0, -1, 1];(%o19)(%i20) v[2]: [1, -2, 3, 2];(%o20)(%i21) v[3]: [2, 0, -1, 2];(%o21)(%i22) v[4]: [2, -2, 3, 1];(%o22)[3, 0, −1, 1][1, −2, 3, 2][2, 0, −1, 2][2, −2, 3, 1](%i23) A: matrix(v[1], v[2], v[3], v[4]);3 0 −1 11 −2 3 2(%o23)
2 0 −1 2
2 −2 3 1(%i24) rank(A);*22(%o24)

3

従って、最大個数は 3 と分かりました。
続いて後半部分ですが、独立なベクトルが 3 個あるはずですから、4 個のベクトルから適当に 3 個選んでそれらの 1 次独立性を調べます。
M AXIMA I NPUT /O UTPUT(%i25) rank(matrix(v[1], v[2], v[3]));(%o25)

3

一発で求まりましたが、実はどの 3 個を選んでも 1 次独立です。そこで、v4 = a v1 +b v2 + c v3 を満たす実数 a、b、c を求めます。
M AXIMA I NPUT /O UTPUT(%i26) a*v[1] + b*v[2]+c*v[3]-v[4];*22 rank [rǽNk] 階数。

第3章

62
(%o26)

Maxima を俯瞰する[2 c + b + 3 a − 2, 2 − 2 b, −c + 3 b − a − 3, 2 c + 2 b + a − 1](%i27) solve(%, [a, b, c]);Dependent equations eliminated: (4)*23(%o27)[[a = 1, b = 1, c = −1]] 2 −1
【例題】 行列 M = −2 0

1
1


−2

4  の全ての固有値 λ と、固有空間 V(λ) の次元を求

0

めよ。

【解答】 固有値を求める関数 eigenvalues*24 を使えば前半は一発です。
M AXIMA I NPUT /O UTPUT(%i28) M: matrix([2, -1, -2], [-2, 0, 4], [1, 1, 0]); 2 −1 −2
4 
(%o28)
−2 01
10(%i29) eigenvalues(M);(%o29)[[−2, 2], [1, 2]]

最初のリスト [−2, 2] が固有値で、2 番目のリスト [1, 2] はそれぞれの固有値に対する重複度です。従って、求める固有値が −2 と 2 であることと、固有空間 V(−2) の次元が 1 であることが分かりました。固有空間 V(2) の次元については、行列の次数から行列 M − 2 Eの階数を引いたものに一致しますから、
M AXIMA I NPUT /O UTPUT(%i30) 3 - rank(M - 2 * ident(3));(%o30)

1より dim V(2) = 1 が得られました。なお、関数 ident*25 は単位行列を生成する関数で、

1 0
ident(3) を実行すると 3 次の単位行列 0 1

0 0


0

0 が生成されます。

1*23 「a、b、c の値は最初の 3 式だけで求まり、4 番目の式は一次従属なので不要でした。
」という意味のメッ

セージです。このメッセージが煩わしければ変数 linsolvewarn に false を代入しておきます。

*24 eigenvalues = eigenvalue [áig@nvæ̀lju:] 固有値。

*25 ident = identity: identity matrix 単位行列。

3.6 行列（生成）

3.6

63

行列（生成）

次数の高い行列を定義する場合、成分を一つ一つ入力するのは苦痛です。そこで、関数

ident のように、行列の作成（生成）を容易にしてくれる関数をまとめておきます。
関数 diagmatrix(n, x) を実行すると、対角成分に要素 x を並べた n 次正方行列を生成することができます。従って、diagmatrix(n, x) は x*ident(n) と同じです。
M AXIMA I NPUT /O UTPUT(%i1) diagmatrix(4, x) = x * ident(4);  x 0 0 0  x 0 0
0 x 0 0 0 x 0 = 
(%o1)
0 0 x 0 0 0 x
0 0 0 x
0 0 0


0

0

0
x

関数 zeromatrix(m, n) を実行すると、m 行 n 列の零行列を生成することができます。
M AXIMA I NPUT /O UTPUT(%i2) zeromatrix(1, 5);(%o2)(%i3) zeromatrix(2, 5);
(%o3)



0 0

0 0

0



0 0
0 0

0 0
0 0

0
0

!

行列の成分がある一定の規則で並んでいる場合は、ラムダ関数（もしくは 2 次元配列）を利用した行列生成関数 genmatrix*26 が有効です。関数 genmatrix は書式

genmatrix(配列関数, 行2, 列2, 行1, 列1)により実行します*27 。このとき、「配列関数」の第 1 成分を「行1」から「行2」まで変化させ、第 2 成分を「列1」から「列2」まで変化させた行列が生成されます。従って、生成される行列の行数は「行2 − 行1 + 1」
、列数は「列2 − 列1 + 1」となります。
M AXIMA I NPUT /O UTPUT(%i4) a: lambda([i, j], x[i, j]);(%o4)

lambda([i, j], xi, j )(%i5) genmatrix(a, 4, 4, 1, 1);*26 genmatrix = generate matrix*27 列1 を省略すると 列1= 行1 と見なされ、列1 と行1 を同時に省略すると、両方とも 1 と見なされます。

従って、genmatrix(配列関数, 行, 列, 1, 1) は genmatrix(配列関数, 行, 列) と略記できます。

第3章

64

 x1,1 x1,2 x2,1 x2,2
 x3,1 x3,2
x4,1 x4,2
genmatrix(a, 4, 4, 2, 1); x2,1 x2,2
 x3,1 x3,2

x4,1 x4,2
genmatrix(a, 4, 4, 3, 1);x3,1 x3,2
x4,1 x4,2
genmatrix(a, 4, 4, 4, 1);
x4,1 x4,2

(%o5)
(%i6)
(%o6)
(%i7)
(%o7)
(%i8)
(%o8)

x1,3
x2,3
x3,3
x4,3


x1,4 

x2,4 
x3,4 
x4,4

x2,3
x3,3
x4,3


x2,4 
x3,4 

x4,4

x3,3
x4,3

x3,4
x4,4

!

x4,3

x4,4



Maxima を俯瞰する

列については、上記 4 通りとも全て 4 − 1 + 1 = 4 列であること、一方、行については、

終了番号が常に 4 であるのに対し、開始番号が 1、2、3、4 と変化していることに注目す

ると、関数 genmatrix の意味がよく分かると思います。この関数 genmatrix を利用して、いくつか有名な関数を生成してみましょう。
M AXIMA I NPUT /O UTPUT(%i9) a: lambda([i, j], x[j]ˆi);
lambda [i, j], x j i(%o9)(%i10) genmatrix(a, 3, 4, 0, 1);

1
 1
 x
x
2
 1
(%o10)
 x1 2 x2 2
 3
x1
x2 3
(%i11) factor(determinant(%));(%o11)

1
x3
x3 2
x3 3


1 

x4 
2
x4 
x4 3(x2 − x1 )(x3 − x1 )(x3 − x2 )(x4 − x1 )(x4 − x2 )(x4 − x3 )フ ァ ン デ ル モ ン ド

所謂 Vandermonde*28 行列とその行列式です。巡回行列も作ってみましょう。
M AXIMA I NPUT /O UTPUT(%i12) kill(all);(%o12)

done(%i13) L:[a, b, c, d, e];(%o13)[a, b, c, d, e]*28 Alexandre-Théophile Vandermonde (1735.2.28 - 1796.1.1) パリのバイオリニストにして化学者。 数学については、1771 年と 1772 年に計 4 本の論文を著していますが、この行列及び行列式についての記述はない
そうです。

3.6 行列（生成）65(%i14) x: lambda([i, j], L[mod(j - i, 5) + 1]);(%o14)
lambda [i, j], L mod ( j−i, 5)+1(%i15) genmatrix(x, 5, 5, 1, 1);a b e ad e(%o15)
 c d
b c

c
b
a
e
d

d
c
b
a
e


e 

d

c 
b
a

ここで、関数 mod は余りを返す関数ですが、割られる数が負であっても正の余りを返す
点が関数 remainder との違いです。対角行列も簡単です。
M AXIMA I NPUT /O UTPUT(%i16) a: lambda([i, j], if i=j then [1, 2, 3, 4][i] else 0);(%o16)

lambda ([i, j], if i = j then [1, 2, 3, 4]i else 0)(%i17) genmatrix(a, 4, 4, 1, 1);
1 00 2(%o17)
0 0

0 0

0
0
3
0


0

0

0
4

少しずらすと冪零行列の代表格とも言える行列を生成することができます。
M AXIMA I NPUT /O UTPUT(%i18) genmatrix(a, 5, 4, 2, 1);
0 2
0 0(%o18)
0 0

0 0

0
3
0
0


0

0

4
0

疑似乱数を発生させる関数 random を用いれば、全ての成分がランダムな整数であるような行列も簡単に生成できます。
M AXIMA I NPUT /O UTPUT(%i19) a: lambda([i, j], random(100));(%o19)

lambda ([i, j], random (100))(%i20) genmatrix(a, 3, 3, 1, 1); 6 85 1525 88 45(%o20)

18 38 45(%i21) genmatrix(a, 3, 3, 1, 1);

第3章

66

Maxima を俯瞰する17 91 3  3 3 51
91 58 34(%o21)

あるいは、各成分に関数を適用する関数 matrixmap を用いる方法でも良いかもしれま
せん。
M AXIMA I NPUT /O UTPUT(%i22) matrixmap(random, zeromatrix(3, 3) + 100);16 27 34(%o22)
 6 39 61
26 8 52(%i23) matrixmap(random, zeromatrix(3, 3) + 100);
50 12 52(%o23)
 1 73 25
42 9 79100 100 100
すなわち、行列 100 100 100 を作って、その各成分に関数 random を適用します。

100 100 100

なお、random(n) を実行すると 0 以上 n 未満の疑似乱数が出力されますが、引数 n が自然数か小数かに対応して、出力される数も自然数または小数になります。

3.7

行列（抽出と連結）指定した行列から行および列を抽出するには、それぞれ関数 row および col を用います。
M AXIMA I NPUT /O UTPUT(%i1) A: matrix([1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]); 1 2 3 4  5 6 7 8 


(%o1)
 9 10 11 12

13 14 15 16(%i2) row(A, 1);
1 2 3 4(%o2)(%i3) row(A, 2);



(%o3)
(%i4) row(A, 3);(%o4)(%i5) row(A, 4);



5 6

7


8


9 10 11 12

3.7 行列（抽出と連結）(%o5)(%i6) col(A, 1);(%o6)(%i7) col(A, 2);(%o7)(%i8) col(A, 3);(%o8)(%i9) col(A, 4);67
13 14 15 16 
 1  5  
 9 13
 
 2  6  
1014
 
 3  7  
11
15
 
 4  8  
12
16

(%o9)

部分行列を抽出するには関数 submatrix を用います。関数 submatrix は書式

submatrix(行1, 行2, ..., 行列, 列1, 列2, ...)
により実行します。すなわち、「行列」の左側に削除したい行番号を列挙し、右側に削除
したい列番号を列挙します。
M AXIMA I NPUT /O UTPUT(%i10) display(A);(%o10)(%i11) submatrix(1, A);(%o11)(%i12) submatrix(A, 4);(%o12)


 1 2 3 4  5 6 7 8 
A = 
 9 10 11 12
13 14 15 16 5 6 7 8  9 10 11 12
13 14 15 16 1 2 3  5 6 7  9 10 11

13 14 15

第3章

68

Maxima を俯瞰する(%i13) submatrix(1, A, 4);(%o13)(%i14)(%o14)(%i15)(%o15)


 5 6 7  9 10 11
13 14 15submatrix(1, 2, A, 4);!
9 10 1113 14 15submatrix(1, 2, A, 2, 4);
!
9 11
13 15

行列にリストや行列を連結するには、行として連結する場合は関数 addrow を、列として連結するには関数 addcol を用います。
M AXIMA I NPUT /O UTPUT(%i16) A: zeromatrix(2, 2) + 1;
!

1
1

1
1


1

1
a


1

1

b

(%o16)(%i17) addrow(A, [a, b]);(%o17)(%i18) addcol(A, [a, b]);1(%o18)
1(%i19) B: zeromatrix(2, 2) + x;(%o19)

1 a
1 b

!

!

x
x

x
x


1
1

 x

x


1

1

x
x1
1xx(%i20) addrow(A, B);(%o20)(%i21) addcol(A, B);(%o21)

1
1

x
x

!

(%i22) zeromatrix(2, 2);!
0 0(%o22)
0 0(%i23) addrow(addcol(A, %), addcol(%, B));

3.7 行列（抽出と連結）(%o23)

69

1
1

0

0

1 0
1 0
0 x
0 x


0

0

x
x

71

参考文献
[1] Maxima 公式サイト：http://maxima.sourceforge.net[2] Macsyma の歴史 : http://www.answers.com/topic/macsyma[3] Intel Mac 用 Maxima バイナリ :http://www.muskmelon.jp/macosx/[4] Maxima をソースからインストールする手順 :http://www.cymric.jp/maxima/maxima-leopard.html[5] Maxima を Windows XP へインストールする手順 :http://www.cymric.jp/maxima/maxima-winxp.html

索引A
abs = absolute [ǽbs@l(j)ù:t] value 絶対値。

adjoint = adjoint [ǽ(d)ÃÒint] matrix 随伴行列。ただし、Maxima では余因子行列を返す関数。 59
algebraic [æ̀lÃ@béiik] 代数的な。
44

append [@pénd] 付け加える。
B
bfloatgenmatrix = generate matrix

63

H
halfangles = half angle: angle [ǽNgl] 角、角度。
hipow

26
16

I
ident = identity: identity matrix 単位行列。

62

integrate [ı́nt@grèit] 積分する（

3

47

12

34

differentiate）。

invert [ 動 inv´@:(r)t, 名 形 ı́nv@:(r)t] 逆数にする。 57
Ccharpoly = characteristic polynomial [pÀlinóumi@l] 固
有多項式。

59

cons = construct [ 動 k@nstr2́kt, 名 kÁnstr2kt] 構成する。
11Ddefine [difáin] 定義する。
dependency
depends

1054
53

determinant [dit´@:(r)m@n@nt] 行列式。

59

diff = differential [dı̀f@rÉnS(@)l] 微分、差（
integral）。
divide [diváid] 割る（
dontfactor

4
multiply）。

45
14

E
eigenvalues = eigenvalue [áig@nvæ̀lju:] 固有値。 59,
62
eigenvectors = eigenvector [áig@nvèkt@(r)] 固有ベク
トル。

endcons = end + construct
ev = evaluate [ivǽljuèit] 評価する。

59
11
8, 60

expand [ikspǽnd, eks-] 展開する。

4

F
factor [fǽkt@r] 因数、約数、因数分解する。
file searchfloat [flóut]: floating point 浮動小数点。
fpprec
G

3
38
44
34

L
logabs = logarithm + absolute value: logarithm[lÓ(:)ě@rı̀D(@)m, lÁ(:)ě@rı̀D(@)m] 対数。
absolute value 絶対値。
56
logconcoeffp = logarithm + contract + coefficient +probability
21
logcontract = logarithm + contract: contract[ 名 kÁntrækt, 動 k@ntrǽkt] 縮小する、縮約
20logexpand = logarithm + expand
20
する。

M
matrix [méitriks, mǽitriks] 行列。

57

mattrace = matrix + trace トレース
59
member: 第 1 引数が第 2 引数に属しているか否かを調べる関数。
12P
polarform = polar [póul@(r)] form 極形式。

49

primep = prime + probability: prime [práim] 素の。
probability [prÀb@bı́l@ti] 確率、見込み。
Q
quotient [kwóuS(@)nt] 商。

6

45

R
radcan = radical + canonical form: radical [rǽdikl] 根号。canonical [l@nÁnikl] 標準的な。
19
random65
rank [rǽNk] 階数。
59, 61

ratdenom = rational + denominator: denominator[diÁm@nèit@(r)] 分母（ numerator）。 18
ratnum = rational + numerator: numerator[n(j)ú:m@rèit@(r)] 分子（ denominator）。
18
ratsimp = rationally simplify: rational [rǽS@nli] 有理

キ
行列

–式
交代–
巡回–
対称–

的に。simplify [sı́mpl@fài] 簡単にする。 44

単位–ratsubst = rational + substitute: rational [rǽS@nl] 有理

零–の。subst = substitute [s2́bst@t(j)ù:t] 代入す

極形式

る、置換する。

極限

remainder [riméind@(r)] 余り。
remfunction = remove function: function[f2́N(k)S(@)n] 関数。
remvalue = remove value

831, 45
9
7

S
solve [sÁlv, sÓ:lv] 解く。

44

sqrt = square root 平方根。

3

sum = summation [s2méiS(@)n] 合計、総和。 28, 47
system
37

局所変数
コ
固有

–空間
–値

54

thru（米略式）= through [Tru:, Trú:]30transpose [trænspóuz]: transposed matirx 転置行列。
59, 60trigexpand = trigonometric + expand: expand[ikspǽnd, eks-] 展開する。
triginverses = trigonometric + inverse: inverse23[inv´@:(r)s, ı́nv@:(r)s] 逆（の）、反対（の）。
23
trigonometric [trı̀g(@)n@métrik]: trigonometricfunction 三角関数
22trigrat = trigonometric + rational: rational [rǽS@nl] 有理の。

24, 50trigreduce = trigonometric + reduce: reduce[rid(j)ú:s] 縮小する。
trigsimp = trigonometric + simplify: simplify

24[sı́mpl@fài] 簡単にする。

25, 50V
Vandermonde: ファンデルモンド

64

イ
一般項

46

カ
関数
陰–
三角–
対数–

53
22
19

62
62

シ
初期設定ファイル（maxima-init.mac）

17, 39セ
積分

T
Taylor

57
59
60
64
60
62
63
49
50
10

–定数
絶対値

55
55
49

ソ
相関係数
双曲線関数

48
28

ヒ
微分

52

フ
複素数
部分分数
分散

49
18
48

ヘ
平均
偏角

48
49

ホ
方程式

43

ユ
有理化

44