[1] まず、座標の数が少ない場合、
GroebnerBasis[{exp1,...,expn},{},{消去したい変数}]
で、簡単に座標変数、三角関数を一気の消去することができた。
[2]座標関数、三角関数が多いとき、三角関数をまず、消去する。
これは、この種の問題共通のやり方でできる。
[3] 座標変数については、いくつかの多項式から適当な組み合わせを選び、一つずつ消していく。
[4] この際、変数の次数が高いと、GroebnerBasis[{expr1,expr2},{},{x1}]
の実行速度が遅くなる。よって、因数分解を行い、すべての組み合わせについて、(あるいは適当な組み合わせについて)、
GroebnerBasis[{expr1,expr2},{},{x1}]
を実行する。
ここで、たとえばn=8の場合をみると、exprは消去対象の変数について四次式以下である。だから、毎回GroenberBasisを毎回呼び出して実行するのは不効率。
[5]そこで、以下のようなパッケージを作成した。(myGroeb.m)
(a) 四次式以下の多項式の組み合わせについて、あらかじめ
GroebnerBasis[{n次式、m次式},{},{変数}]
を実行しておいて、公式集を作っておく.たとえば,el55は五次式の多項式同士の消去の公式(この計算に一晩かかったが,パッケージに一旦組み込んでしまえば、一瞬のうちに変数の消去をしてくれる。
(b)myGroeb[e1_, e2_, val_]は、すでにe1,e2がこれ以上因数分解できないと仮定して、el12などの公式を援用して変数を消去する。
(c)myFactor[g_]は、多項式の因数分解
ただし、g = A^2 B^3 Cと因数分解されるとき、{A,B,C}というように冪をのぞいて答えを返す。
(c)myGroebAll[e1_, e2_, val_]は、e1,e2をmyFactorで分解した後、すべての組み合わせについて、myGroebを用いて、変数の消去を行い、これらの積を返す。
たとえば、e1 = a1 a2 a3 .. , e2 = b1 b2 b3 ...だったらmyGroeb[ai,bj,変数]を実行して、この積をもとめていく。
これを用いることにより、これまで一晩かかってもできないような計算が数時間(運が良ければ30分)で結果を得ることができた。
===================================