すするすするる

主にグレブナ基底の話です。

単項式、多項式、イデアル

単項式、多項式イデアル

方程式とか、中学や高校でならう変数と基本は同じです。 未知数を  x で置いて計算できます。



単項式


単項式を集めることで式が構成されると考えます。 単項式=最小構成、ブロックのようなものをイメージすると良いかもしれません。

単項式を構成する要素(ルール)は3つです。

  • 変数
  • 係数
  • 掛け算(次数)

要素を一つずつみていきます。

  • 変数
    • 有限個の変数
    • よくみる変数は  x,y,z
    • 他には  x_1,x_2,\ldots,x_n
  • 係数
  • 掛け算
    • 掛け算で次数ができる
    • 次数は非負

どれも見たこと聞いたことがある内容だと思います。 教科書や参考書では、これらを明確に定義することが多いです。

ざっくりした理解で良ければ、余り意識する必要はないかもしれません。

単項式の例

一応、単項式の例を挙げます。係数は有理数、変数は  x,y,z です。

2x, 2/3x, 4xy, 4/5x2 y, 7/9x4 y8 z3


【蛇足】プログラムから考える(単項式)

プログラムから考えるなら、単項式は以下のような制約をもつとします。

  • 変数を使える
  • 整数(or 実数)を使える
  • 使える演算子は, * だけ

ここでは、forとかifはとりあえず忘れましょう。使える制御文とか演算は、掛け算のみだと考えます。

当然ですが、これだけでは何もできません。 ただ、「ルールが明確に定められる。」という発想は、いろんな書物を読むうえで重要なように思います。

Asir での記述

Asirで変数を定義するには、最初が大文字であることが求められます。 一般的な言語では、最初の文字が数字だったりは不可能なのですが、Asirではさらに小文字もダメです。 関数と差別するための仕様らしいです。

後々のために、変数のリスを定義しておくと便利です。

VL = [x1,x2,x3]; // 変数のリスト

T1 = x1 * x2 * x3; // 単項式
T2 = 2*x1^2*x2;

end# // ファイル読み込み用


多項式


いわゆる式です。方程式とかを思い浮かべると良いかもしれません。

構成する要素(ルール)は2つです。

  • 単項式
  • 足し算

つまり、単項式を足し算でつなぎ合わせたものが多項式と考えます。 ブロックを足し合わせて作できるのが多項式と考えられます。

ここで初めて、和と積が扱えるようになります。 和と積が扱えると、よく知った四則演算に近くなるため、イメージしやすいと思います。

ただし、和と積=四則演算、と短絡的に考えるのは良くないです。 あくまでも、和と積が使えると考えましょう。 後々、グレブナ基底に近づくほど「割り算」の特殊さに触れることになります。

多項式の例

今回も係数は有理数で、変数は  x,y です。

3x + y, x2 y + 4y, 4/5 x6 y + 4


プログラムから考える(多項式

プログラムから考えるなら、多項式は以下のように考えられます。

  • 単項式というオブジェクトが使える
  • 使える演算子は + だけ

単項式が内部で、積しか使えないオブジェクトだとすると、単項式と和しか使えないのが多項式。 積は単項式オブジェクトの内部としては存在するが、演算子として使えないと考えます。

と、書くと面倒に見えますね。 普通の方程式とかを想定していただければ大丈夫でしょう。 ただ、要素をよく観察すると、単項式を足し算で集めたものが多項式になっていて、積は単項式の一部になっているように見えます。

Asir 出の記述(多項式

Asirでは単項式と同じく、特に準備はありません。

VL = [x1,x2,x3]; // 変数のリスト

T1 = x1 * x2 * x3; // 単項式
T2 = 2*x1^2*x2;

F1 = 3*T1 + T2;    // 多項式
F2 = 3*x1*x2*x3 + 2*x1^2*x2;

end# // ファイル読み込み用


イデアル


すごく簡素な説明でイデアルは、

多項式どうしを、和、積してできるすべての式がイデアルです。 例えば a,bがあったとして、 a,bとなんでもいい何かを足し掛けしてできるすべてがイデアルです。

これは、同じイデアルに含まれる要素が、同じ特性を持つということです。

例えば、3の倍数を考えます。 イデアルは「3の倍数」になるので、「3の倍数」という性質が変わらないということは、 3で割った余り はどの要素も同じ値になります。

もっと理想的なものを考えると、すべて 3 の和と積でできる集合を考えます。 6とか、18とかですね。 これは、3で割ると、余りは必ず0となります。 つまり、「3で割ると余りは0」という同じ性質を、6や18は共有しているということです。 このように、同じ特性をまとめることができるということですね。

もう少し拡張して、方程式で考えます。 例えば、[tex: x2 + 2x + 1] だけを和と積した集合を考えます。 これは、因数分解すると [tex: (x+1)2] ということで、 x=1が解になります。 もし、この式だけを足し掛けした集合があるなら、必ず x=1を解に持つことが想像できますでしょうか。 つまり、「同じ解をもつ」という集合になりますね。

このように、イデアルとして考えることで、性質をより見やすく、まとめやすくしている、と思われます。


プログラムとして考える

プログラムとして考えるなら、次のような構造を持つと考えれます。

  • 多項式というオブジェクトが使える
  • 使える演算子は,+と*の両方
  • 他に、係数や定数といった数が使える

だんだん扱える範囲が広くなってきました。 なんとなくですが、ものすごく様々な多項式を書くことが可能であるように思っていただければ良いと思います。

多項式オブジェクトAとBがあるとします。ただし、メソッドやメンバなどは A!=B であるとします。 AとBだけで作るなら、メソッドはAかBのどちらかが必ず使えます。 それは、AとBを使っている限り守られるはずです。

つまり、イデアルでまとめられるなら、使えるメソッドが限定できる。と考えられます。 似たようなシステムとして、JAVAなんかは近いかもしれません。 JAVAオブジェクトは、すべてのオブジェクトがObjectクラスからできているので、同じメソッド「toString」を持ちます。 これによって、文字列への変換は非常に楽になってますね。

「同じ性質であるものをまとめる」ことが有効であることが納得していただければ嬉しいです。

VL = [x1,x2,x3]; // 変数のリスト

T1 = x1 * x2 * x3; // 単項式
T2 = 2*x1^2*x2;

F1 = 3*T1 + T2;    // 多項式
F2 = 3*x1*x2*x3 + 2*x1^2*x2;

I1 = F1*F1 + F1*F2 + F1; // イデアル
I2 = F1 + F2;

end# // ファイル読み込み用

メモ?雑記

ひょっとして、JAVAのObjectはイデアルなのではないだろうか? つまり、同イデアルの性質として、同じメソッドを持つ。 同じメソッドを持つオブジェクトなら、同じイデアルを生成する。

考えは似ているかもしれないが、式にできないと計算できないので、そのままは使えないですね。 説明としては、プログラムに詳しい人ならわかりやすいのかもしれないです。


2017/06/25 作成 2017/10/31 はてブロ移行に伴い更新