Go to the first, previous, next, last section, table of contents.

## 代数的数の表現

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]

この例では, `A0` は `x^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]

Go to the first, previous, next, last section, table of contents.