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

## 代数的数の演算

前節で, 代数的数の表現, 定義について述べた. ここでは, 代数的数を用いた 演算について述べる. 代数的数に関しては, 組み込み函数として提供されている 機能はごく少数で, 大部分はユーザ定義函数により実現されている. ファイル は, ``sp'` で, ``gr'` と同様 Asir の標準ライブラリディレクトリ におかれている.

    [0] load("gr")$
    [1] load("sp")$

あるいは, 常に用いるならば, ``$HOME/.asirrc'` に書いておくのもよい.

`root` は その他の数と同様, 四則演算が可能となる. しかし, 定義多 項式による簡単化は自動的には行われないので, ユーザの判断で適宜行わ なければならない. 特に, 分母が 0 になる場合に致命的なエラーとなるため, 実際に分母を持つ代数的数を生成する場合には細心の注意が必要となる.

代数的数の, 定義多項式による簡単化は, `simpalg()` で行う.

    [49] T=A0^2+1;
    (#0^2+1)
    [50] simpalg(T);
    0

`simpalg()` は有理式の形をした代数的数を, 多項式の形に簡単化する.

    [39] A0=newalg(x^2+1);
    (#0)
    [40] T=(A0^2+A0+1)/(A0+3);
    ((#0^2+#0+1)/(#0+3))
    [41] simpalg(T);
    (3/10*#0+1/10)
    [42] T=1/(A0^2+1);
    ((1)/(#0^2+1))
    [43] simpalg(T);
    div : division by 0
    stopped in invalgp at line 258 in file "/usr/local/lib/asir/sp"
    258                     return 1/A;
    (debug)

この例では, 分母が 0 の代数的数を簡単化しようとして 0 による除算が生じ たため, ユーザ定義函数である `simpalg()` の中でデバッガが呼ばれた ことを示す. `simpalg()` は, 代数的数を係数とする多項式の 各係数を簡単化できる.

    [43] simpalg(1/A0*x+1/(A0+1));
    (-#0)*x+(-1/2*#0+1/2)

代数的数を係数とする多項式の基本演算は, 適宜 `simpalg()` を呼ぶことを 除けば通常の場合と同様であるが, 因数分解などで頻繁に用いられるノルムの 計算などにおいては, `root` を不定元に置き換える必要が出てくる. この場合, `algptorat()` を用いる.

    [83] A0=newalg(x^2+1);
    (#0)
    [84] A1=newalg(x^3+A0*x+A0);
    (#1)
    [85] T=(2*A0+A1*A0+A1^2)*x+(1+A1)/(2+A0);
    (#1^2+#0*#1+2*#0)*x+((#1+1)/(#0+2))
    [86] S=algptorat(T);
    (((t#0+2)*t#1^2+(t#0^2+2*t#0)*t#1+2*t#0^2+4*t#0)*x+t#1+1)/(t#0+2)
    [87] algptorat(coef(T,1));
    t#1^2+t#0*t#1+2*t#0

このように, `algptorat()` は, 多項式, 数に含まれる `root` を, 対応する不定元, すなわち `#n` に対する `t#n` に置き換える. 既に述べたように, この不定元はユーザが入力することはできない. これは, ユーザの入力した不定元と, `root` に対応する不定元が一致 しないようにするためである.

逆に, `root` に対応する不定元を, 対応する `root` に置き換える ためには `rattoalgp()` を用いる.

    [88] rattoalgp(S,[alg(0)]);
    (((#0+2)/(#0+2))*t#1^2+((#0^2+2*#0)/(#0+2))*t#1+((2*#0^2+4*#0)/(#0+2)))*x
    +((1)/(#0+2))*t#1+((1)/(#0+2))
    [89] rattoalgp(S,[alg(0),alg(1)]);
    (((#0^3+6*#0^2+12*#0+8)*#1^2+(#0^4+6*#0^3+12*#0^2+8*#0)*#1+2*#0^4+12*#0^3
    +24*#0^2+16*#0)/(#0^3+6*#0^2+12*#0+8))*x+(((#0+2)*#1+#0+2)/(#0^2+4*#0+4))
    [90] rattoalgp(S,[alg(1),alg(0)]);
    (((#0+2)*#1^2+(#0^2+2*#0)*#1+2*#0^2+4*#0)/(#0+2))*x+((#1+1)/(#0+2))
    [91] simpalg(@89);
    (#1^2+#0*#1+2*#0)*x+((-1/5*#0+2/5)*#1-1/5*#0+2/5)
    [92] simpalg(@90);
    (#1^2+#0*#1+2*#0)*x+((-1/5*#0+2/5)*#1-1/5*#0+2/5)

`rattoalgp()` は, 置換の対象となる `root` のリストを第 2 引数 にとり, 左から順に, 対応する不定元を置き換えて行く. この例は, 置換する順序を換えると簡単化を行わないことにより結果が一見異なるが, 簡単化により実は一致することを示している. `algptorat()`, `rattoalgp()` は, ユーザが独自の簡単化を行いたい場合などにも 用いることができる.

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