[ << ] [ < ] [?] [ > ] [ >> ]         [??] [??] [???] [ ? ]

9.1 代数的数の表現

Asir においては, 代数体という対象は定義されない. 独立した対象として定義されるのは, 代数的数である. 代数体は, 有理数体に, 代数的数を有限個 順次添加した体として仮想的に定義される. 新たな代数的数は, 有理数および これまで定義された代数的数の多項式を係数とする 1 変数多項式 を定義多項式として定義される. 以下, ある定義多項式の根として 定義された代数的数を, root と呼ぶことにする.

[0] A0=newalg(x^2+1);
(#0)
[1] A1=newalg(x^3+A0*x+A0);
(#1)
[2]  [type(A0),ntype(A0)];
[1,2]

この例では, A0x^2+1=0 の根, A1 は, その A0 を係数に含む x^3+A0*x+A0=0 の根として定義されている.

newalg() の引数すなわち定義多項式には次のような制限がある.

  1. 定義多項式は 1 変数多項式でなければならない.
  2. newalg() の引数である定義多項式は, 代数的数を含む式の簡単化のた めに用いられる. この簡単化は, 組み込み函数 srem() に相当する内 部ルーチンを用いて行われる. このため, 定義多項式の主係数は, 有理数に なっている必要がある.
  3. 定義多項式の係数は すでに定義されている root の有理数係数多項式 でなければならない.
  4. 定義多項式は, その係数に含まれる全ての root を有理数に添加した 体上で既約でなければならない.

newalg() が行う引数チェックは, 1 および 2 のみである. 特に, 引数の定義多項式の既約性は全くチェックされない. これは 既約性のチェックが多大な計算量を必要とするためで, この点に関しては, ユーザの責任に任されている.

一旦 newalg() によって定義された代数的数は, 数としての識別子を持ち, また, 数の中では代数的数としての識別子を持つ. (type(), vtype() 参照.) さらに, 有理数と, root の有理式も同様に代数的数となる.

[87] N=(A0^2+A1)/(A1^2-A0-1);
((#1+#0^2)/(#1^2-#0-1))
[88] [type(N),ntype(N)];     
[1,2]

例からわかるように, root#n と表示される. しかし, ユーザはこの形では入力できない. root は 変数に格納して用いるか, あるいは alg(n) により取り出す. また, 効率は落ちるが, 全く同じ引数 (変数は異なっていてもよい) により newalg() を呼べば, 新しい代数的数は定義されずに既に定義された ものが得られる.

[90] alg(0);
(#0)
[91] newalg(t^2+1);
(#0)

root の定義多項式は, defpoly() により取り出せる.

[96] defpoly(A0);     
t#0^2+1
[97] defpoly(A1);
t#1^3+t#0*t#1+t#0

ここで現れた, t#0, t#1 はそれぞれ #0, #1 に 対応する不定元である. これらもユーザが入力することはできない. var() で取り出すか, あるいは algv(n) により取り出す.

[98] var(@);
t#1
[99] algv(0);
t#0
[100] 

[ << ] [ < ] [?] [ > ] [ >> ]

?????12? 14, 2017?texi2html 5.0????????????