Macaulay2 の紹介
横田博史
平成 22 年 1 月 27 日 (水)まえがき
この文書は Macaulay2 の入門用に書いたものであり, Macaulay2 の非常に限定された範囲の話題のみを扱っている. Macaulay2 や Macaulay2 を使った
実例は Schenk の本 [4] や Eisenbud 等の本 [2] を参照されたい.
ここで, Schenk の本は Macaulay2 を用いて代数学を学ぶ事を目的とした本である為, 数学のお勉強に重点が置かれているが, Eisenbud 等の本は Macaulay2を使って代数や代数幾何を料理する事を目的とした本である為に, Macaulay2の言語や使い方に重点が置かれている. この傾向の違いを知った上で参照されると良いだろう.
この Macaulay2 では Singular のライブラリが利用されている. その為,

Singular と同様に基礎環を構築して処理を行うといった似た面も持っている.
この Singular に関しては, Greuel-Pﬁster の本 [3] を参照されると良い. こち
らは Singular を使った本格的な可換環の教科書である.
平成 22 年 1 月 27 日 (水)

横田博史

1

目次
第 1 章 Macaulay2 の簡単な紹介

1.1

Macaulay2 の概要 . . . . . . . . . . . . . . . . . . . . . . . . .

1
1

1.2
1.3

Macaulay2 の起動, 入力と終了 . . . . . . . . . . . . . . . . . .
オンラインマニュアル . . . . . . . . . . . . . . . . . . . . . .

2
3

1.4
1.5

その他の支援機能: . . . . . . . . . . . . . . . . . . . . . . . .

444

基本的な与件の型について . . . . . . . . . . . . . . . . . . . .

1.5.1

数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.5.2
1.5.3

基礎的な算術演算子: . . . . . . . . . . . . . . . . . . .

1.5.4
1.5.5
1.5.6

真理値と論理式 . . . . . . . . . . . . . . . . . . . . . .

1.5.7
1.5.8

列, リスト, 配列と行列の定義 . . . . . . . . . . . . . . 12数値函数 . . . . . . . . . . . . . . . . . . . . . . . . . .

689
表象と文字列 . . . . . . . . . . . . . . . . . . . . . . . 11
文字列操作の演算子 . . . . . . . . . . . . . . . . . . . 12列, リストや配列の長さを求める演算子 . . . . . . . . . 14

1.5.9 行列の定義 . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5.10 行列の結合に関連する演算子 . . . . . . . . . . . . . . 16
1.5.11 行列の成分取出に関連する演算子 . . . . . . . . . . . . 17
1.5.12 リストと行列の算術演算 . . . . . . . . . . . . . . . . . 20
1.5.13 多項式環の定義 . . . . . . . . . . . . . . . . . . . . . . 22
1.6

文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

1.7

1.6.1 制御文 . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

1.8
1.9

M2 ファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
ファイル出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

第 2 章 特異点遊戯

2.1

32
Macaulay2 による特異点の計算 . . . . . . . . . . . . . . . . . 32i

第 1 章 Macaulay2 の簡単な紹介

1.1

Macaulay2 の概要

Macaulay2 は可換環向けの数式処理システムである. Macaulay2 は Singularの幾つかのライブラリを用いてる為に Singular と似た点も多くあるが, その一方で, Mathematica 風の構文も見受けられ, Singular とは全く別の面白味のある数式処理システムとなっている.
オブジェクト指向の数式処理システム:

Macaulay2 は Singular と同様にオブジェクト指向の数式処理システムである. この事は, Macaulay2 上の演算子
や函数は対象に束縛されたメソッドであり, 何かの処理を行う為にはその対象を最初に行わなければならない事を意味する. 更に, 同名の演算子や函数であっても対象が違えば処理内容や結果も異なる事がある. 例えば, 多項式やイデアルといった対象の計算を行う場合, その親にあたる環 (基礎環:Base ring)
を先ず生成しなければならならず, 対象が生成された場合でも, たとえば, 積演算を考えると, その対象がスカラであるか行列であるかによって行列の積としての処理を行うか, 成分単位の積となるかといった処理が異なる事を意味する.
フロントエンド:

Macaulay2 は固有のフロントエンドを持たない. 個々の結果はその都度ファイルに残す事も可能だが, Mathematica や Maple の様に終了時にセッションをそのままファイルに簡単に残せないのが初心者にとっては難点であろう. その為, フロントエンドとして利用可能な Emacs や TeXmacsと併用した方が良い. 特に, TeXmacs を利用すれば, レゾリューション等の図式や数式が美しくレンダリングされて表示されるので楽しい.
また, 仮想端末でも 0.9.8 以降から GNU Emacs 風の行編集と履歴の利用が可能となっており, オンラインマニュアルも help 函数以外に Texinto を用いる

infoHelp 函数や Mozilla 等の HTML ブラウザを用いる viewHelp 函数の二つの函数が用意され, 使い勝手がより向上している. 特に, viewHelp 函数によって表示される HTML ブラウザから, 初心者向けの文書「gettimh started」やMacaulay2 のマニュアルや例題といった文書を閲覧することが容易に行える.
動作環境:

Macaulay2 は基本的に UNIX 環境で動作する. Macaulay2 の実行ファイルが存在する環境は, FreeBSD, GNU Linux, MacOSX と MS-Windows1であるが, MS-Windows は Cygwin 環境で動作させることになる. その為,

Cygwin 環境を整える必要があるが, 個人的には, Cygwin で強引に UNIX 環
境を構築するよりも, VMware Player や Sun の VirtualBox といった仮想計
算機環境で KNOPPIX/Math 上の Macaulay2 を利用する事を, より簡便で充実した環境が得られる方法として提案しておく.

Macaulay2 に関する文献:

Macaulay2 の日本語の文献は殆んどないのが現状で, この小冊子を除くと唯一, Macaulay2 の作者の一人である Dan Graysonへのインタビューが「数学のたのしみ No.11, 多項式環の視点：グレブナー基底」(日本評論社,1999 年) の「グレブナエンジンのプログラマ達」に掲載されている程度である.
その一方で, 英語の書籍としては Eisenbud, Grayson, Stillman と Sturmfelsの本 [2] と Schenck の本 [4] の二つがある.
最初の Eisenbud 等の本には Macaulay2 の入門から応用迄が収録されているが, この本はどちらかと言えば, こちらは代数学や代数幾何に詳しい方がMacaulay2 の使い方を調べるのに適した本である.
次の Schenck の本の方は, Macaulay2 を用いた代数幾何学と代数的位相幾何学の入門書であり, これらの事項が手堅く纏められた程良い厚さの良い教科書である. この本は Macaulay2 で一寸した計算をしながら, 代数学のお勉
強をしたい方に向いている.
この冊子は上述の英語の書籍の様な本格的なものではなく, Macaulay2 の持つ独特の雰囲気を紹介する事を目的としている. 従って, Macaulay2 や関連する数学の詳細は上述の本, 或いは, Macaulay2 に付属のオンラインマニュ
アルを参照されたい.

1.2

Macaulay2 の起動, 入力と終了

起動方法: パスが通っていれば xterm 等の仮想端末に M2 と入力することでMacaulay2 が立ち上がる. KNOPPIX/Math を使っていれば, メニュバーの√
左から二番目にある x メニューから Macaulay2 を選択すれば良い. 猶, M2
は前述の様に GNU Emacs 風の編集機能を持ってはいるものの, 履歴を文書で残す機能を持たない為に, GNU Emacs や TeXmacs 等と云った Macaulay2の履歴をきちんとした文書で残すことの出来る外部プログラムと併用する事を勧める.

TeXmacs をフロントエンドとして使う場合: TeXmacs から Macaulay2 を利用する場合, 最初に TeXmacs を立ち上げ, TeXmacs の「挿入」(insert) から「セッション」(session) を選ぶと TeXmacs で利用可能なアプリケーションの一覧が表示されるので, その中から Macaulay2 を選択すると良い. ここで,2

図 1.1 に TeXmacs を Macaulay2 のフロントエンドとして利用した時の処理の様子を示している:

図 1.1: TeXmacs 上で利用

プロンプトについて:

Macaulay2 を起動すると入力を促すプロンプトが表示される. 入力プロンプトは “i1 :” の様に入力行である事を示す文字 “i” と入力番号で構成された文字列, 出力のプロンプトも “o1 : ” の様に出力行である事を示す文字 “o” と入力番号で構成された文字列である.
猶, Macaulay2 では入力行末尾にセミコロン “;” を入れると入力に対する出力の表示が無効になる. それ以外では入力に対する値や与件型の表示をを行う.

Macaulay2 の終了: 仮想端末上で Macaulay2 を起動した場合, quit と入力すれば Macaulay2 を終了する.

1.3

オンラインマニュアル

Macaulay2 は詳細なオンラインマニュアルを標準で持ち, 文書を読む為の函数として, help 函数, infoHelp 函数と viewHelp 函数がある. これらの函数の引数は全て同じで, 1 つの文字列を引数として取り, 表示される文書の形式
が text 形式, texinfo 形式か HTML 形式と云った違いがある程度である. しかし, 使い勝手から言えば, viewHelp 函数を使う事が最も良いだろう.

help 函数: Text 形式の文書を標準出力に表示する函数. help とだけ入力
すると, help 函数の概要が表示されるが, 一気に内容を表示する為に xterm 等

3

の仮想端末では, 文書全体がバッファに収まり切らずに文書の頭が読めなくなる事がある.

infoHelp 函数:

フロントエンドとして Texinfo を用いる函数である. 文書

は texinfo を用いてそのまま表示される為に, Macaulay2 による処理が中断してしまう短所がある.

viewHelp 函数: Firefox 等の HTML ブラウザを立ち上げて文書を表示する函数である. 一旦, HTML ブラウザを立ち上げると, HTML ブラウザはMacaulay2 の制御を離れるので, Macaulay2 とは独立して利用する事が可能である. さて, viewHelp とすると HTML ブラウザが起動され, Macaulay2とそのパッケージに関するオンラインマニュアルの見出しが表示される. 次に “ viewHelp ”help” ” と入力すると, 今度は Macaulay2 の help 函数のマニュアルを表示する. これで help 函数の使い方が判るだろう. この様に

viewHelp ”⟨ 事項 ⟩” で調べたい ⟨ 事項 ⟩ に関連する文書が表示される.

1.4

その他の支援機能:

オンラインマニュアルの他に, Macaulay2 では文字列の一部から対応する
函数名のリストを出力する apropos 函数, 函数の例題を実行する example 函数等がある.

1.5

基本的な与件の型について

Macaulay2 は Singular と同様のオブジェクト指向の数式処理である為に,最初に環 (=基礎環) を定義し, それから, 必要とする基礎環上の対象を構築して行く. つまり, 最初に対象を生成しないことにはメソッドが使えないが, その対象を生成する為には対象を包含する環を定義しなければならない. 但し,
表象, 列, 文字列や数値 (整数, 有理数, 実数), そして true や false で表現される真偽値と云った基本的な与件, 及び, これらの与件で構成されたリスト, 配
列, 行列については処理が行える仕様となっている.

1.5.1

数

Macaulay2 で利用者が基礎環を定義せずに扱える数として, 整数, 有理数と実数がある. ここで実数は Macaulay2 内部では浮動小数点数として表現されている.

Macaulay2 では整数環 Z, 有理数環 Q と実数環 R は最初から Macaulay2 に組込まれた環であり, これらの環を利用者が定義する必要はない. 従って, こ4れらの環に含まれる対象, 則ち, 数は, そのまま入力可能であり, 四則演算を含む算術的演算も可能である. 猶, Macaulay2 では整数環 Z を ZZ, 有理数環

Q を QQ , そして, 実数環 R を RR と表記している.
ここで, 数の入力と計算例を示しておこう:

i1 : 1o1 = 1i2 : 1+2o2 = 3i3 : 2∗3o3 = 6i4 : 3/5
3o4 = −
5o4 : QQ
l5 : 2.9
o5 : 2.9
o5 : RR (of precision 53)
この例で示す様に整数の計算の場合は結果だけが表示されているが, 入力
が有理数と浮動点小数になれば, その計算で用いた与件型 (この場合は属する
環) と「浮動小数点数の精度」を計算結果に続けて表示する. ここで浮動小数
点数は符号部, 指数部と仮数部の三種類の固定長の 2 進数から構成され, 仮数
部の 2 進数の bit 長に 1 を加えたものが「浮動小数点数の精度」と呼ばれる.

Macaulay2 では既定値として, 53(“of precision 53”) となっているが, このことから, 浮動小数点数の仮数部が 52 bit 長, 則ち, 倍精度であることが判る.

5

1.5.2

基礎的な算術演算子:

整数, 有理数や実数に対する基礎的な算術演算子として, 和, 差, 積, 商の四則演算子, 更に, 剰余, 羃乗や階乗がある. 四則演算子や羃の演算子は C と同様の演算子を用いる事が可能であり, これらの演算子は利用者が生成した環に継承される:
基本的な算術演算子
演算子

例

概要

+
*

a+b
a-b
a*b

a と b の和a と b の差
a と b の積///a/ba // ba の b による商a の b による商

%
ˆ
!

a% b
aˆb
a!

剰余 a mod b
羃乗 ab
階乗 a!

i4 : 1+2∗3−4ˆ2/519o4 = −−
5o4 : QQ
i5 : 1+0∗1.9−2/5
o5 = 0.6
o5 : RR
この結果は一見すると Maple の様な数式処理システムに似ているが, Macaulay2
はオブジェクト指向である為に, 基礎環が背後にある. 実際, 2/5 は有理数環

QQ の元, 0.6 が実数環 RR の元となっている事が表示されている.
又, 対象が異なれば同名のメソッドも違う働きをする. この事を演算子/と演算子//の違いで把握しておこう. まず, 整数環 ZZ 上では, 演算子/が有理数を生成する演算子, 演算子//が整数の商を返却する演算子である:

i1 : 4/2
o1 = 26

o1 : QQ
i2 : 5/2
5o2 = −
2o2 : QQ
i3 : 5//2
o3 = 2
この様に, 整数を被演算子とする場合には, これらの演算子の結果は異なっている事に注意されたい. しかし, 有理数環上と実数環上の対象に対し, これらの演算子は同じ結果を返す演算子となる:

i3 : 5/2 // 2/5
1
o3 = −
4o3 : QQ
i4 : 5/2 / 2/5
1
o4 = −
4o4 : QQ
i5 : 5./2 // 2/5.
o5 = .25
o5 : RR (of precision 53)

7

i6 : 5./2 / 2/5.
o6 = .25
o6 : RR (of precision 53)
また, 演算の順序は通常の演算子の順序に応ずるが, ここで, 括弧 () を用いることで, 括弧内の演算を優先させる事が出来る点は C 等の言語と同様である. 逆に括弧 () を用いなければ通常の演算子の優先順位で処理される.

1.5.3

数値函数

Macaulay2 には cos 等の三角函数, exp や log といった指数函数や対数函数が組込まれている. これらの函数は Maple 等の函数とは異なり, 実数環 R 上の函数である:i20 : cos(pi/2)
o20 = 6.12303∗10ˆ−17
o20 : RR
i21 : exp(1)o21 = 2.71828
o21 : RR
i22 : log(1)o22 = 0.
o22 : RR
この例に示す様に, cos(pi/2) と入力しても直ちに評価されて浮動小数点数が結果として返却されている. 更に, これらの数値函数は一般の環上に使える様に拡張されていない為, 例えば, x を変数として含む多項式環 K[x] を定義しても, sin(x) は変数 x に数値が割当てられていない為に誤りとなる. 同様に,
多項式の微分を行う diﬀ 函数の引数として数値函数を引渡しても, sin 函数の引数が数値でない事に加え, 式 sin(x) 自体が多項式でない為に誤りになる.

8

1.5.4

真理値と論理式

Macaulay2 には真理値と基本的な論理式の演算子が定義されおり, 利用者が構築した環に継承される.
真理値:

Macaulay2 に於ける真偽値は true と false がある.

論理積, 論理和と否定の演算子:

真理値に対して基本的な演算を行う演算子

として, 論理積, 論理和と否定がある:
論理演算子
演算子

構文

概要

and
or
not

a and ba or bnot(a)

論理式 a と論理式 b の論理積

not a

論理式 a の否定 (小括弧を外した表記)

論理式 a と論理式 b の論理和
論理式 a の否定

二項演算子 and:

被演算子が全て true であれば true, その他は false を返却.

二項演算子 or:

被演算子が全て false であれば false, その他は true を返却.

単項演算子 not:

被演算子が true なら false, false なら true を返却.

ここで論理式 a and b に含まれる論理式 a が偽の場合, 論理式 b の評価を演算子 and は行わない. 同様に演算子 or も a or b を構成する論理式 a が真の場合, 論理式 b の評価を行わない仕様となっている. その意味では, 演算子

and と演算子 or の定義は二項演算子を Curry 化したものになっており, この様子を函数型言語の Haskell([1] 参照) で定義すれば,

1
2
3and’ :: Bool −> Bool −> Booland’ False x = False
and’ True x = x

456

or’ :: Bool −> Bool −> Boolor’ True x = Trueor’ False x = xとなるだろう. つまり, and’ を例にすると, 第 1 引数が False なら第 2 引数とは無関係に False であり, 第 1 引数が True であれば, 第 2 引数の値となるという定義である.

9

論理式:

Macaulay2 での論理式とは, 評価されることで真理値 {true,false}

をその値として持つ式であり, 論理式を論理演算子 and, or, not で結合した対象も論理式になる. 論理式の例としては, ‘not true’ や ‘true and false’ といった式が挙げられる. ここで, 論理式を対象から生成する演算子として, 「比較の演算子」という二項演算子がある.
比較の演算子:2 つの被演算子の関係を真理値で表現する演算子であり,Macaulay2 では, 被演算子の間に置く中置表現の演算子である. ここで Macaulay2の持つ比較の演算子を次に纏めておこう:
比較の演算子演算子

構文

真となる条件

==
>=

a==b
a>=b

a と b が等しいければ真a が b 以上であれば真

>
<=
<

a>b
a<=b
a<b

a が b より大であれば真a が b 以下であれば真a が b より小であれば真i21 : 3==2
o21 = false
i22 : 3>=2o22 = true
i23 : 3<4o23 = true
比較の演算子を返す演算子:

演算子?は, a ? b とする事で a と b を比較した場合に真を返す比較の演算子を返却する:

i26 : 3 ? 3
o26 = ==
o26 : Keyword
i27 : 3 ? 5

10o27 = <o27 : Keyword

表象と文字列1.5.5

数の他に Macaulay2 では「表象」(Symbol) と「文字列」(String) が扱える.
表象:

アルファベットと数文字と一部の記号で構成され, 必ずアルファベットで開始する文字の羅列である. 但し, Macaulay2 の処理言語で意味を持つ

for 等の文字の羅列は表象にならない. この表象は Macaulay2 で変数や函数名として利用出来る.
文字列:

二重引用符”で括られた文字の列である. 文字列の場合,”以外に用いてはならない文字はなく, 表象とは全くの別物である. 猶, 二重引用符”を文字列中に含める場合は \ を用いる. 例えば, 「\”」の様に表記する.
次に表象と文字列の例を示す.

i20 : xo20 = xo20 : Symbol
i21 : XYZ
o21 = XYZ
o21 : Symboli22 : w1 = ”mike”
o22 = mike
i23 : w2 = ”neko”
o23 = neko
この例で示す様に, 変数に値を割当てる場合, 演算子= を用いる.

11

1.5.6

文字列操作の演算子

文字列に対しては二つの演算子 | と || がある. 共に文字列の結合を行って新しい文字列を生成する演算子であるが, 改行コードが入るか入らないかの違いがある. これらの演算子 | と演算子 || の違いを次に示しておく:

i14 : ”今日はとても”|”良い天気”
o14 = 今日はとても良い天気
i15 : ”今日はとても”||”良い天気”
o15 = 今日はとても良い天気
i16 : ”今日はとても”||””||” 良い天気”
o16 = 今日はとても良い天気

i17 : ”\”三毛” | ”猫 \””o17 = ”三毛猫”
この例で示す様に, 演算子 | の場合は単純に文字列を結合するだけだが, 演
算子 || の場合は二つの文字列を結合するだけではなく, 文字列の間に改行文字が挿入される. これらの演算子は結果の表示等で利用すると良いだろう.
又, 前述の様に文字列中に二重引用符を入れたければ, 二重引用符を「\”」で置換えると良い

1.5.7

列, リスト, 配列と行列の定義

基本与件型を持った対象から構成された対象に, 列 (Sequence) , リスト(List), 配列 (Array) , 行列 (Matrix) がある. 先ず, 列, リストと配列の定義方
法を以下に纏めておく.

12

列, リスト, 配列
対象

例

概要

列

(a1 , · · · , an )対象をコンマ “,” で区切って小括弧で括った事

リスト

a1 , · · · , an
[a1 , · · · , an ]列を中括弧 { } で括った事で得られる対象で得られる対象
配列

列を大括弧 [ ] で括った事で得られる対象

次に列, リスト, 配列と行列の例を示す:

i27 : (1,2,3)o27 = (1, 2, 3)
o27 : Sequencei28 : 1..5o28 = (1, 2, 3, 4, 5)
o28 : Sequencei29 : (1,2.4,5/7)
5o29 = (1, 2.4, −)7o29 : Sequencei30 : {1,2,3,54}
o30 = {1, 2, 3, 54}
o30 : List
i31 : [1,2,3,4,5]o31 = [1, 2, 3, 4, 5]
o31 : Array

13

Macaulay2 では増分が 1 の数列の生成が容易に行える. これは演算子.. を使って ⟨ 開始値 ⟩..⟨ 終値 ⟩ の構文で生成するもので, この時, ⟨ 開始値 ⟩ から開始して増分 1 で ⟨ 終値 ⟩ までの列が生成される. 例えば, (1..5) で (1,2,3,4,5)が生成される. この演算子.. は下付きの添字を表現する演算子 と組合せる事
で x 1, x 2,..,x 10 の様に添字付けられた表象列を x 1..x 10 と入力して容易に生成する事が可能になる:

i1 : 1..4o1 = (1, 2, 3, 4)
o1 : Sequencei2 : 12..19o2 = (12, 13, 14, 15, 16, 17, 18, 19)
o2 : Sequencei3 : x 1 .. x 5
o3 = (x , x , x , x , x )1 2 3 4 5o3 : Sequence

1.5.8

列, リストや配列の長さを求める演算子

列, リスト, 及び配列の成分や長さを求める演算子として演算子# がある:
演算子#
構文

概要

⟨a⟩ # ⟨ 整数 ⟩# ⟨a⟩⟨a⟩ の第 ⟨ 整数 ⟩ + 1 番目の成分⟨a⟩ の長さ列, リスト, 配列の成分は C と同様に 0 から開始するので, 配列 a の左から
第 5 番目の成分を取出したい場合, a#4 と入力する事に注意されたい. 演算
子#の実行例を次に示しておく:

i50 : a=(1..10)
o50 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)14o50 : Sequencei51 : a#9o51 = 10i52 : b=[10,11,12,13,14,15]
o52 = [10, 11, 12, 13, 14, 15]o52 : Arrayi53 : b#2
o53 = 12i54 : c={1,2,3,5}o54 = {1, 2, 3, 5}
o54 : List
i55 : c#2
o55 = 3i56 : #ao56 = 10i57 : #bo57 = 6
i58 : #co58 = 415

行列の定義1.5.9

行列は函数 matrix を用いて定義する:

i32 : A=matrix {{1,2,3,4},{5,4,3,2}}o32 = | 1 2 3 4 || 5432 |24

o32 : Matrix ZZ <−−− ZZ
i33 : B=matrix( {{1,1},{−1,2}} )o32 = | 1 1 || −1 2 |22

o33 : Matrix ZZ <−−− ZZ
ここでの例では A と B の二つの行列を matrix 函数を使って生成している.
これらの例で示す様に, Macaulay2 の行列は線形写像として捉えられている.
行列 A の生成では A=matrix 1,2,3,4,5,4,3,2, 行列 B の生成では B=matrix(

1,1,-1,2 ) と, 行列 A では小括弧 () を外している事に注意されたい. Macaulay2
では一変数函数の場合に限って函数の括弧を省略する事が許容されている.

1.5.10行列の結合に関連する演算子

行列にも文字列の演算子と同名の, 行列の結合に関連する演算子 | と演算子|| がある. ここで, 演算子 | は与えられた二つの行列を水平方向に繋げた行列を生成し, 演算子 || は与えられた二つの行列を上下に結合する. この様に文字列の場合と雰囲気的には似た操作を行う演算子となっている:

o66 = | 1 2 || 32 |
22
o66 : Matrix ZZ <−−− ZZ
i67 : x2=matrix{{0,1},{1,0}}16

o67 = | 0 1 || 10 |
22
o67 : Matrix ZZ <−−− ZZ
i68 : x1|x2
o68 = | 1 2 0 1 || 3210 |2

4

o68 : Matrix ZZ <−−− ZZ
i69 : x1 || x2
o69 = | 1 2 || 32 || 01 || 10 |
4
2
o69 : Matrix ZZ <−−− ZZ

1.5.11行列の成分取出に関連する演算子

演算子 とˆによって, 行列成分や小行列の取出が行える:演算子 と演算ˆの構文
演算子

構文

ˆ

⟨ 行列 ⟩ {⟨ 整数1 ⟩, · · · , ⟨ 整数n ⟩}⟨ 行列 ⟩ ˆ {⟨ 整数1 ⟩, · · · , ⟨ 整数n ⟩}ここで, 行列の列や行を取出す演算子では, 行列を演算子の左側に置き, 演
算子の右側に取出す成分を指示するリストを配置する. ここで, 行列の成分番
号は 1 ではなく 0 から開始する事に注意されたい:

17

i125 : A1=matrix {{1,2,3},{0,1,3},{4,1,9}}o125 = | 1 2 3 || 013 |
| 419 |
3

3

o125 : Matrix ZZ <−−− ZZi126 : A1 {0}o126 = | 1 |
| 0 |
| 4 |
3
1
o126 : Matrix ZZ <−−− ZZ
i127 : A1 {0,2}o127 = | 1 3 || 03 || 49 |
3

2

o127 : Matrix ZZ <−−− ZZ
i128 : A1ˆ{0}o128 = | 1 2 3 |13o128 : Matrix ZZ <−−− ZZi129 : A1ˆ{0,2}o129 = | 1 2 3 || 419 |

18

2
3o130 : Matrix ZZ <−−− ZZ
猶, 演算子ˆは数値に対しては羃演算を行うメソッドでもある為, 演算子ˆの左側が数値や変数の場合は羃演算子として処理される事に注意されたい. 一方で, 演算子 に関してはリストの代りに数値を設定しても挙動に違いはない:

o137 = | 1 2 0 || 713 |
| 019 |
3
3
o137 : Matrix ZZ <−−− ZZi138 : A1ˆ{2}o138 = | 0 1 9 |13o138 : Matrix ZZ <−−− ZZ
i139 : A1ˆ2
o139 = | 15 4 6 || 14 18 30 |
| 7 10 84 |33o139 : Matrix ZZ <−−− ZZi140 : A1 {2}o140 = | 0 |
| 3 |
| 9 |
3
1
o140 : Matrix ZZ <−−− ZZi141 : A1 219

o141 = | 0 |
| 3 |
| 9 |
3
o141 : ZZ

リストと行列の算術演算

1.5.12

リストに対しては MATLAB の様な算術演算も出来なくはない. ここでの算術演算は, 同じ長さで同じ書式のリスト同士のみで可能である:

i26 : a={{1,2,3,4},{5,6}}o26 = {{1, 2, 3, 4}, {5, 6}}
o26 : List
i27 : b={{3,1,2,4},{10,9}}o27 = {{3, 1, 2, 4}, {10, 9}}o27 : List
i28 : 2∗a+b/5
13 21 32 44

69

o28 = {{−−, −−, −−, −−}, {12, −−}}
5 5 5 55o28 : List
この例ではリスト a と b を定義した後に 2*a+b/5 でリストの各成分に対して 2 · a + b/5 の処理を行っている. しかし, MATLAB や Octave と比べ,Macaulay2 はリストの処理に強いとは言えない. その一例として, 積の順番の問題を示しておく:
i30 : b∗2
stdio :30:2: expected pair to have a method for ’∗’
i31 : 2∗b20

o31 = {{6, 2, 4, 8}, {20, 18}}
上の b*2 と 2*b では前者は失敗するものの, 後者では正常に終了している.
結局, 数値の積をリスト上の演算として継承させているが, この時, スカラーとして左側からの作用しか考慮していない為である. この様にリストに対す
る積や羃乗の演算子に関しては注意が必要である.
猶, リストに対しては他の数式処理と同様に, apply 函数を用いて Macaulay2の函数を作用させる事が可能である:

i43 : apply ({1,2,3,4,5}, i−>iˆ2)o43 = {1, 4, 9, 16, 25}
o43 : List
i44 : apply ({1,2,3,4,5}, i−>iˆ2∗sin(i))
o44 = {0.841471, 3.63719, 1.27008, −12.1088, −23.9731}
o44 : List
ここで apply 函数でリストに作用させる函数を Maple の様に演算子–> で定義している事に注意されたい. この函数の定義方法に関しては §1.7 にて詳細を述べる.
次に, 行列に対しては和, 差, 積として羃演算が可能である:
行列の演算子
演算子

例

概要

+
*

A+B
A-B
A-B

行列の和

ˆ

Aˆn

行列の羃 (n ≥ 0)

行列の差
行列の積

但し, 羃ˆは右側の被演算子の型によって意味が異なる事に注意されたい.

21

1.5.13多項式環の定義

多項式環を定義する構文を次に示しておく:
多項式環の定義⟨ 環の名前 ⟩ = ⟨ 係数環 ⟩[変数1 , · · · , 変数n ]ここで, 予め定義されてる係数環には, 前述の様に整数環 ZZ (Z), 有理数環

QQ(Q ) と実数体 RR(R) の三種類の環があり, 他に, 利用者が定義した多項式環も勿論, 係数環として利用可能である. 次に具体的な多項式環の定義例を示そう:

i1 : R=QQ[x,y,z]o1 = Ro1 : PolynomialRing
i2 : R’=ZZ[x,y,z]o2 = R’
o2 : PolynomialRingi3 : poly1=xˆ2+2∗yˆ2+3∗zˆ2−1222o3 = x + 2y + 3z − 1
o3 : R’
この例では環 R の係数環に有理数体 Q(Macaulay2 では QQ と表記), 変数を x, y, z の 3 個を指定している. すると, 項の順序を逆辞書式順序とする多項式環が生成され, 新たに環を生成したり, 環の切替を行わない限り, ここで定義した環 R 上で処理が行われる. 勿論, 環の定義で変数順序の指定も可能である. また, 係数環として, ZZ7 , 即ち, ZZ/7 を持つ環も定義可能である.
猶, 係数環によっては使えない函数が存在するので注意が必要である. 例
えば, 与えられたイデアルの Groebner 基底を求める際に gb 函数を用いるが,この gb は整数環 Z では使えない. 何故なら, 整数環上では係数の割算が出来ない為である.
環を定義すると, 自動的にその生成した環にポインタが移動する. つまり,新しく生成した環で多項式等の対象を生成したり, 操作する事になる.

22

複数の環がある環境で, 既存の別の環に基礎環を切り替える場合, use 函数を用いる. 因に, Singular では setring 函数を用いて基礎環の切替を行う:

i5 : R=ZZ[x,y,z]o5 = Ro5 : PolynomialRing
i6 : R2=QQ[x,y]o6 = R2
o6 : PolynomialRing
i7 : use R
o7 = Ro7 : PolynomialRing
Singular ではポインタが置かれた環上で様々な対象を生成するが, この事は Macaulay2 でも同様である. 但し, Singular と違い,Macaulay2 では環毎に同じ変数名を持つ対象を持たせる事は出来ない:

i1 : R1=QQ[x,y,z];i2 : R2=QQ[x,y,a];i3 : R3=QQ[x,a,b];i4 : use R1;
i5 : f=x+y+z;
i6 : use R2;
i7 : f=x∗y∗aˆ2;
i8 : use R3;
i9 : f=x∗aˆ2+b;23

i10 : use R1;
i11 : f2
o11 = x∗a + b
o11 : R3
この例では, 環 R1, R2 と R3 を定義し, 各々に多項式を変数 f に割当てている. 結局, 変数 f の内容は環毎に保存されない為に変数 f の書換が行われている. この様に Macaulay2 では一つの変数に複数の意味を持たす事が出来ないが, その一方で, 基礎環が異っていても対象の内容をエコーバックで確認する事が可能となる. この様子は, Singular が垣根で小さく区切られた庭
園の様になっているので, 同じ名前の対象を各区画に一つ置く事が出来るが,Macaulay2 の場合は広々とした公園になっているので, 同名の対象を置く事が許容されないとでも例えられるだろうか.
ある対象がどの環に属するものかを調べたければ, 対象の名前を入力し, その返却値で判断する事も可能だが, それとは別に, ring 函数でも出来る. この函数は, 指定した対象が定義された環の名前を返す函数である.
そして, ある環で構築した対象を別の環に送り込む函数が substitute である. この函数 substitute の引数は対象と複写先の環を指定する:

i1 : R0=ZZ[x,y,z,w]
o1 = R0
o1 : PolynomialRing
i2 : poly1=xˆ2+2∗yˆ2+3∗zˆ2−1222o2 = x + 2y + 3z − 1o2 : R0
i3 : R=ZZ[x,y,z]o3 = R24

o3 : PolynomialRing
i4 : poly2=substitute(poly1,R)222o4 = x + 2y + 3z − 1
o4 : Ri5 : poly1222o5 = x + 2y + 3z − 1
o5 : R0
i6 : poly2222o6 = x + 2y + 3z − 1
o6 : R
この例では最初に環 R0= Z[x, y, z, w] を生成し, 環 R0 上の多項式 poly1を定義している. それから環 R=Z[x, y, z] とその環 R 上の多項式 poly2 をsubstitute 函数を用いて環 R0 の多項式 poly1 で定義している.
定義した対象の詳細は describe 函数 で調べる事が可能である:
i1 : R=ZZ/5[x,y]o1 = Ro1 : PolynomialRing
i2 : describe R
ZZ
o2 = −− [x, y]
5i3 : f=(x+2∗y+3)ˆ5
25

5

5

o3 = x + 2y − 2o3 : Ri4 : g=(x,y)−>x∗y+2
o4 = go4 : Function
i5 : describe R
ZZ
o5 = −− [x, y]
5i6 : describe f55o6 = x + 2y − 2
この例では describe 函数を用いて環や多項式の情報を表示させている.

26

1.6

文

Macaulay2 の式は, 対象と演算子を結合することで出来た対象で, Macaulay2の評価によって新たに Macaulay2 の対象を返すものであるが, Macaulay2 の
文は, Macaulay2 の式に加え, a=1 の様に変数に値を割当てる代入文や, 条件
分岐や反復処理の様に, Macaulay2 の対象に対して操作を行い, 新たな対象等を返却するものである.

Macaulay2 では文を小括弧 () を用いてグループ化する事も可能である. 文のグループ化は制御文や函数の定義で用いられる.

1.6.1

制御文

Macaulay2 の制御文には,if 文, for 文や while 文がある.
制御文
制御文

構文

if

if ⟨ 条件式 ⟩ then ⟨ 処理1 ⟩if ⟨ 条件式 ⟩ then ⟨ 処理1 ⟩ else ⟨ 処理2 ⟩forfor ⟨ 制御変数 ⟩ = ⟨ 初期値 ⟩ to ⟨ 終値 ⟩ do ⟨ 処理 ⟩for ⟨ 制御変数 ⟩ = ⟨ 初期値 ⟩ to ⟨ 終値 ⟩ list ⟨ 処理 ⟩while

while ⟨ 条件式 ⟩ do ⟨ 処理 ⟩while ⟨ 条件式 ⟩ list ⟨ 処理 ⟩ここでの条件文は解釈される事で true か false が返却される Macaulay2 の式である. ⟨ 処理 ⟩ は Macaulay2 の複数の文を小括弧 () を使ってグループ化した文である.
先ず,Macaulay2 の if 文は C の if 文と同じ構文である. 次に簡単な例を示しておこう:

i14 : i=random(10);if even i then a1=1 else a1=2
o15 = 2
Macaulay2 の for 文は, do か list でその挙動が異なる. 先ず, do の場合は処理を実行させ, list の場合には処理した結果をリストにして返却する.

i61 : for i from 1 to 5 do print( i∗5)
5
10
15
20
25

27

i62 : for i from 1 to 5 list i∗5o62 = {5, 10, 15, 20, 25}
o62 : List
この点は while も同様である:

i69 : i=1;while i<5 do (i=i+1;print iˆ5)
32
243
1024
3125
i71 : i=1;while i<5 list ( i=i+1; iˆ5)o72 = {32, 243, 1024, 3125}
o72 : List
white や for ループを抜ける函数として break 函数がある. この break 函数
は単体, 或いは一つの引数を持つ. 単体の場合, break は何も返さないが, 引数を指定した場合, break はその引数の値を返す.

i18 : for i from 2 to 100 do if not isPrime i then break io18 = 4i19 : i=1;while i<=100 do (i=i+1;if not isPrime i then break)i20 :どちらも同じ処理を行っているが, while 文の場合は break の引数が無い為に引数の値 (この場合は i の値) が返されていない.

28

函数

1.7

Macaulay2 には函数 (Function) がある. Macaulay2 の函数定義では演算子-¿を用いる:函数定義の構文⟨ 函数名 ⟩=(⟨ 変数1 ⟩, · · · , ⟨ 変数n ⟩)–>(⟨ 文1 ⟩; · · · ⟨ 文n ⟩; )ここで文は a=1 の様な変数の割当や制御文等であり, 複数の文はセミコロン; で区切ったものになる. 全体的な雰囲気は Maple の函数定義に似ている.
具体的な例を次に示しておこう:

i32 : f=(x,y,z) −> xˆ2+y/z
o32 = fo32 : Function
i33 : f (1,2,3)5o33 = −
3o33 : QQ
この例では単純に (x, y, z) → x2 + y/z の変換を行う. Macaulay2 には演算子:=があり, この記号を使って函数内部で変数を割当てると, その変数は函数
内部の局所変数として解釈される:

i4 : f=(x,y,z)−>a:=x+yˆ3;i5 : f (1,2,3)o5 = 9i6 : ao6 = ao6 : Symbol
i7 : g=(x,y,z)−>a=x+yˆ3;29

i8 : g (1,2,3)o8 = 9i9 : ao9 = 9最初の函数 f では演算子:=を用いている為, a は函数内部の値が設定されずに表象のままである. 次の g の例では演算子=を用いている為, a に値が設定されている事に注意されたい.

1.8

M2 ファイル

Macaulay2 で利用可能な函数は m2 ディレクトリに末尾が m2 のテキストファイルに記述されている. Macaulay2 ではこれらの m2 ファイルの読込にload 函数と needs 函数を用いる.
m2 ファイルは Macaulay2 の複数の函数や変数を定義する事が可能である. 記述は基本的に Macaulay2 に入力する書式で構わない. ここで, m2 ファ
イル内部での注釈行は演算子–0 えんさんし@演算子!–を先頭に置いた文字の羅列である. この演算子–は,Macaulay2 に直接入力する場合, 演算子の前にMacaulay2 の通常の入力行を必要とするが, m2 ファイルで用いる場合, その様な制約はない. この m2 ファイルの読込に用いる load 函数と needs 函数の構文を次に示しておく:
load 函数と needs 函数の構文
函数

構文

load
needs

load ”⟨ ファイル名 ⟩”needs ”⟨ ファイル名 ⟩”load 函数と needs 函数は共に指定した m2 ファイルを Macaulay2 に読込む函数であるが, load 函数が単純に指定したファイルを Macaulay2 に読込む函数であるのに対し, needs 函数は指定した m2 ファイルが既に読込まれている
場合には m2 ファイルの読込を行わない函数である.
これらの函数は大域変数 path に設定されたリストに含まれるディレクト
リから指定されたファイルを検索し, このリストに含まれていればファイルの読込を行う. 従って, 大域変数 path に含まれるディレクトリ上にファイルが存在する場合, これらの函数の引数としてはファイル名のみで構わない. しかし, ファイルが大域変数 path に含まれない場合, フルパスでファイルを指定しなければならない.

30

code 函数は Macaulay2 の函数がどの m2 ファイルに収録されたもので,m具体的な函数の定義内容を表示する函数である. この code 函数は m2 ファイ
ルの中身を表示する為, m2 ファイルを記述せずに定義した函数に対しては効
力が無い.

1.9

ファイル出力Macaulay2 からファイルへの書込みでは, 演算子<<を用いる.
この演算子<<によって標準出力とファイルの出力の指定が行える. 左被演
算子を持たない場合, 右被演算子を Maculay2 で解釈した結果を標準出力に出力する. 左側に文字列を置いた場合, 出力先は文字列で指定されたファイルになり. 演算子<<の右被演算子に close が指定される迄, 同じファイルのままとなる. 猶, 演算子<<は原始的な出力函数の為, 単体で用いられた場合はファイルの先頭から書き込みを行う. 又, 演算子<<による出力の影響は普通の函数には及ばない. 例えば, print 函数で表示した結果は<<によってファイルに切り替えられる訳ではない. その為, 綺麗な書式のファイルを生成する事は出来ない. 一時的に結果を残す程度の事しか出来ない.

31

第 2 章 特異点遊戯

2.1

Macaulay2 による特異点の計算

曲線や曲面上のある点が, その点での偏微分が全て 0 になる場合, この点を特異点と呼ぶ. この章では Macaulay2 を使って特異点を探して遊ぶ.
最初に平面曲線 x3 − y 2 = 0 を考えよう. この曲線の X, Y 方向の偏微分は各々, 3x2 と −2y である. 従って, この平面曲線の特異点は原点 (0, 0) になる.
図 2.1 に surf を使って描いたこの曲線のグラフを示す:

図 2.1: x3 − y 2 = 0 のグラフ
このグラフから原点付近が縊れている事が判る.
ここで, この曲線の特異点の計算を Macaulay2 で行う. 先ず, 曲線を多項式

f の零点集合として与え, 多項式とその偏微分から生成されるイデアル I を定義する. すると, この多項式とその偏微分から生成されるイデアルの零点集
合 V (I) が多項式 f で与えられる曲線の特異点集合となる.
ここで多項式環の係数体が代数的に閉じている場合, V (I) を零点集合とす√るイデアルは I の根基イデアル (radical) I に一致する事 (Hilbelt の零点√定理) が知られている. 従って, 特異点を調べたければ, 先ず根基イデアル Iを計算し, その性質を調べれば良いことになる.
√√
ここで, 環 R のイデアル I の根基 I は, 環 R のイデアルで, g ∈ I であれば, ある自然数 n(≥ 1) に対して, g n ∈ I となる性質を持つ. 例えば, イ√
デアル I が多項式 x2 + 2x + 1 で生成されていれば, I の根基 I は x + 1

32

√
I は I ⊂ I を満
す. ここで, 根基の別の表現は, イデアル I を包含する全ての素イデアルの共で生成されるイデアルになる. 更に, イデアル I の根基√

通部分集合でもある.
さて, 実際に x3 − y 2 = 0 を Macaulay2 で料理してみよう:

i1 : R=QQ[x,y];i2 : Ro2 = Ro2 : PolynomialRingo3 : describe(R)o3 = QQ[x..y, Degrees => {2:1}, Heft => {1}, MonomialOrder =>−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−{MonomialSize => 32}, DegreeRank => 1]{GRevLex => {2:1} }{Position => Up }i4 : f=xˆ3−yˆ2;i5 : neko=ideal {f, diﬀ (x, f ), diﬀ (y, f)}322
o5 = ideal (x − y , 3x , −2y)o5 : Ideal of R
i6 : radical nekoo6 = ideal (y, x)
さて, ここまでの処理を内容に沿って解説することにしよう:
環の定義:

最初に多項式 f = x3 − y 2 が生息する環 R を, 有理数体 Q を係数環とする環として定義している. Macaulay2 はオブジェクト指向の考えを取り入れている為, 考察すべき対象が定義可能な環を予め定義しなければなら33

ない. この例では, 環 R を定義したことによって, 漸く, 多項式やイデアルを扱う事が可能となる. 猶, 定義した環は, 環の名前を入力しても真面に表示されないが, describe 函数を用いる事で, より詳細な情報を得る事が可能となる.
多項式の定義:環 R を定義した後に, 漸く多項式 f とその偏微分から生成

されるイデアル neko が定義出来る様になる. ここで, 多項式は多くの数式処理と同様の表記で入力すれば良い.
イデアルの定義:

函数 ideal を用いてイデアルが定義出来る. この ideal 函数の構文を次に纏めておこう:

ideal 函数の構文⟨ イデアル名 ⟩⟨ イデアル名 ⟩⟨ イデアル名 ⟩===ideal (⟨ 多項式1 ⟩, · · · , ⟨ 多項式n ⟩)ideal (⟨ 多項式リスト ⟩)ideal (⟨ 多項式行列 ⟩)猶, 函数 ideal の小括弧 () は最初の構文の様に複数の多項式をコンマで区切る場合を除いて省略可能である.
多項式の微分:ここで考察するイデアルは, 多項式 f と f の変数 x や変数 yによる微分も必要である. 多項式の微分では diﬀ 函数を用いる. この diﬀ 函数の構文も次に纏めておく:

diﬀ 函数の構文
diﬀ (⟨ 変数 ⟩, ⟨ 多項式 ⟩)diﬀ (⟨ 変数 ⟩, ⟨ 行列 ⟩)函数 diﬀ の構文は, Maple, Mathematica や Maxima とは違い, 第 1 引数が変数で, 第 2 引数に微分すべき多項式が続く事に注意されたい. 更に, diﬀ 函数で微分可能な対象は多項式と多項式を成分とする行列に限定される. 即ち,

cos 函数の様な Macaulay2 組込の数値函数の微分が出来ない事を意味する.
イデアルの根基:

ここで, イデアル neko が生成出来たので, 今度はその根基を計算させる. 根基イデアルは radical 函数で計算出来る. この radical 函数の構文も次に纏めておこう:

radical 函数の構文
radical(⟨ イデアル ⟩)radical 函数による計算結果から, x3 − y 2 , 3x2 と −2y で生成されるイデア
ル neko の根基が (y, x) で生成されるイデアルである事が判る. 従って, この根基の零点集合は x = 0, y = 0 のみである. 則ち, (0, 0) がこの曲線の特異点である.
今度は任意の有理数 t に対して, x3 − y 2 + t を考えよう. ここでも最初と同様の方法で根基イデアルを計算する:

34

i6 : R=QQ[x,y,t]o6 = Ro6 : PolynomialRing
i7 : f=x^3-y^2+t;
i8 : neko = ideal { f, diff(x,f), diff(y,f) }3
o8 = ideal (x

2
- y

2
+ t, 3x , -2y)o8 : Ideal of R
i9 : radical nekoo9 = ideal (t, y, x)o9 : Ideal of R
この計算結果から, 根基イデアルが t, y, x で生成されたイデアルとなるので, t が零でなければ x3 − y 2 + t には特異点が存在しない事が分る. 実際, 図

2.2 は surf を用いて t = 1 の場合を可視化したものであるが, 全体的に滑らかな曲線となっている.

図 2.2: t = 1 の場合

35

関連図書

[1] Kees Doets and Jan van Eijck, The Haskell Road to Logic, Maths andProgramming, College Publications, 2004.
[2] Eisenbud et al.(Eds), Computations in Algebraic Geometry with
Macaulay 2, Springer-Verlag,New York-Heiderberg-Berlin,2002.
[3] Gert-Martin Greuel, Gerhard Pﬁster, A Singular Introduction to Commutative Algebra, Springer-Verlag,New York-Heiderberg-Berlin,2000.
[4] Hal Schenck, Computational Algebraic Geometry London Mathematical Society student texts;58,2003.
[5] Macaulay2 のサイト http://www.math.uiuc.edu/Macaulay2/[6] SINGULAR のサイト http://www.singular.uni-kl.de/

36

索引
演算子

函数, 29*, 7+, 7

行列 (Matrix), 13-, 7.., 14配列 (Array), 13

/, 7
=, 11
#, 14

文字列, 11シンボル, 11
表象, 11
リスト (List), 13
列 (Sequence), 13函数

ˆ, 7->, 21A:=, 29<<, 31
and, 10apply, 21Ccode, 31

not, 10or, 10D！, 8

L

describe, 25函数

load, 30
I

M
ideal, 33

matrix, 16

記号N
QQ, 6, 22
RR, 6, 22
ZZ, 6, 22

needs, 30
Rradical, 34

制御文

ring, 24

for, 27S

if, 27
while, 27
大域変数

Usubstitute, 24
use, 23Pきpath, 30
データ型

局所変数, 29
しfalse, 9true, 9

実数, 6
せ

37

整数, 6ほポインタ, 22ゆ
有理数, 6
り
リストの処理, 20

38