simplification (Maxima 5.50.0 Manual)

## 75 simplification ¶

### 75.1 Introduction to simplification ¶

ディレクトリ`maxima/share/simplification`は 整理ルールと整理関数を実装するいくつかのスクリプトと整理に関係しないいくつかの関数を含みます。

### 75.2 Package absimp ¶

`absimp`パッケージは `abs`と`signum`関数のために 組み込み整理ルールを拡張する パターンマッチングルールを含みます。 `absimp`は、 組み込み`assume`関数で、また、 偶数や奇数に関して`modedeclare (m, even, n, odd)`のような宣言によって 確立された関係を考慮します。

`absimp`は `abs`と`signum`を使って `unitramp`と`unitstep`関数を定義します。

`load ("absimp")`はこのパッケージをロードします。 `demo (absimp)`はこのパッケージのデモを表示します。

例:

    (%i1) load ("absimp")$
    (%i2) (abs (x))^2;
                                           2
    (%o2)                                 x
    (%i3) diff (abs (x), x);
                                          x
    (%o3)                               ------
                                        abs(x)
    (%i4) cosh (abs (x));
    (%o4)                               cosh(x)

Simplification functions · Rules and patterns · Share packages · Package absimp ·

### 75.3 Package facexp ¶

`facexp`パッケージは、 制御された展開によって式を構造化する能力をユーザーに与えるいくつかの関連関数を含みます。 式が物理的意味を持つ変数を含むとき、この能力は特に役に立ちます。 そんな式の最も簡潔な形式は、それらの変数に関して式を完全に展開し、 その後係数を因数分解することで得られることがしばしばあるからです。 この手続きは標準のMaxima関数を使って実行することは難しくありませんが、 追加の微調整も望まれていて、これらの仕上げは適用するのが更に難しくなることがあります。

関数`facsum`とその関連形式は、 この方法で式の構造を制御するための便利な手段を提供します。 別の関数`collectterms`は、 この形式に既に整理された複数の式を 式全体を再整理することなく、足し合わせるのに使うことができます。 式が非常に大きいとき、この関数は役に立つかもしれません。

`load ("facexp")`はこのパッケージをロードします。 `demo (facexp)`はこのパッケージのデモを見せます。

Expressions · Share packages · Package facexp ·

関数: facsum (expr, arg_1, ..., arg_n) ¶

  引数arg_1, ..., arg_nに依存する exprの形式を返します。 引数は`ratvars`に適した任意の形式か、そんな形式のリストを取り得ます。 もし引数がリストでなければ、 返される形式は、引数に関して完全に展開され、引数の係数は因数分解されます。 これらの係数は、非合理的な意味合いを除いて引数に依存しません。

  引数のいずれかがリストなら、リストすべては1つのリストに結合されて、 引数の係数に対して`factor`をコールする代わりに `facsum`は、 これらの係数に対して自分自身をコールします。 この再帰コールに関しては、上記で新しく構成されたリストが新しい引数リストとして使われます。 この処理は、リストの中に望まれた要素を入れ子にすることで、任意の深さまで繰り返すことができます。

  It is possible that one may wish to `facsum` with respect to more complicated subexpressions, such as `log (x + y)`のような、より複雑な部分式に関して `facsum`したいかも知れません。 そんな引数も許されています。

  時々、ユーザーは 式に関して、先頭演算子によってのみ指定された上記形式いずれかが欲しいかもしれません。 例えば、 すべての`log`に関して`facsum`したかもしれません。 この場合、 この方法で扱われる特定の`log`か、 代わりに式`operator (log)`や`'operator (log)` を引数に含むことができます。 もし 演算子op_1, ..., op_nに関して 式exprを`facsum`したいなら、 `facsum (expr, operator (op_1, ..., op_n))`を評価します。 `operator`形式はリスト引数の中でも可能です。

  更に、 スイッチ`facsum_combine`と`nextlayerfactor`の設定は `facsum`の結果に影響するかもしれません。

  Package facexp · Expressions ·

グローバル変数: nextlayerfactor ¶

  デフォルト値: `false`

  `nextlayerfactor`が`true`の時、 `facsum`の再帰コールが 引数の係数の因数分解された形式の因子に適用されます。

  `false`の時、 `facsum`は、 `facsum`への再帰コールが起こる時はいつでも、全体としてそれぞれの係数に適用されます。

  `facsum`の引数リストに アトム`nextlayerfactor`を入れると、 `nextlayerfactor: true`の効果がありますが、 式の次のレベルだけに関してです。

  `nextlayerfactor`はいつも `true`か`false`にバインドされているので、 `facsum`の引数リストの中に現れる時はいつでも、 シングルクォートで表さなければいけません。

  Package facexp · Expressions ·

グローバル変数: facsum_combine ¶

  デフォルト値: `true`

  引数が多項式の商の時、 `facsum_combine`は `facsum`が返す最終結果の形式を制御します。 もし`facsum_combine`が`false`なら、 形式は既に記述したような完全に展開された和として返されますが、 もし`true`なら、 返される式は、既に記述した形式の多項式の比です。

  有理式の分子と分母両方を`facsum`したいが、 分母が分子の項ずつに掛けられたくない時、 このスイッチの`true`設定は役に立ちます。

  Package facexp · Expressions ·

関数: factorfacsum (expr, arg_1, ... arg_n) ¶

  exprの因子に関して引数として arg_1, ... arg_nを付けて`facsum`をコールすることで得られる exprの形式を返します。 もしexprの因子のいずれかがべきに累乗されるなら、 因子と指数と両方がこの方法で処理されます。

  Package facexp · Expressions ·

関数: collectterms (expr, arg_1, ..., arg_n) ¶

  もしいくつかの式が`facsum`もしくは`factorfacsum`, `factenexpand`, `facexpten`, `factorfacexpten`で整理されていて、それらが一緒に加算されているなら、 関数`collectterms`を使ってそれらを結合することが望まれる場合があります。 `collectterms`は、`nextlayerfactor`を除いてこれらの他の関連した関数に渡すことができる引数すべてを 引数として取ることができます。 `collectterms`の利点は、`facsum`と似た形式を返すことです。 しかし、既に`facsum`で処理された加算形式なのでこの処理を繰り返す必要はありません。 この能力は加算する式が非常に大きい時特に役立ちます。

  Package facexp · Expressions ·

### 75.4 Package functs ¶

Share packages · Package functs ·

関数: rempart (expr, n) ¶

  式exprからパーツnを取り除きます。

  もしnが形式`[l, m]`のリストなら、 パーツlからmまでが取り除かれます。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Expressions ·

関数: wronskian ([f_1, ..., f_n], x) ¶

  変数xに関する式のリスト[f_1, ..., f_n]の Wronskian行列を返します。 Wronskian行列の行列式は、 式のリストのWronskian行列式です。

  `wronskian`を使うには、最初に`load("functs")`してください。例えば:

      (%i1) load("functs")$
      (%i2) wronskian([f(x), g(x)],x);
      (%o2) matrix([f(x),g(x)],['diff(f(x),x,1),'diff(g(x),x,1)])

  Package functs · Differential calculus ·

関数: tracematrix (M) ¶

  行列Mの跡(対角要素の和)を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Matrices ·

関数: rational (`z`) ¶

  分母を有理化するように、 zの分子と分母に分母の複素共役を掛けます。 もし与えられたものがそうであれば、正準有理式(CRE)形式を返し、 そうでないなら、一般形式を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Expressions ·

関数: nonzeroandfreeof (x, expr) ¶

  もし exprがゼロでなく、 `freeof (x, expr)`が`true`を返すなら、 `true`を返します。 そうでなければ、`false`を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Expressions ·

関数: linear (expr, x) ¶

  exprが変数xに関して線形の式の時、 `linear`は`a*x + b`を返します。 ここで、aはゼロでなく、aとbはxに依存しません。 そうでなければ、`linear`はexprを返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Expressions ·

関数: gcdivide (p, q) ¶

  `takegcd`が`true`の時、 `gcdivide`は多項式pとqを最大公約多項式で割り、 結果の比を返します。

  `takegcd`が`false`の時、 `gcdivide`は比`p/q`を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  `ezgcd`, `gcd`, `gcdex`, `poly_gcd`も参照してください。

  例:

      (%i1) load("functs")$

      (%i2) p1:6*x^3+19*x^2+19*x+6;
                              3       2
      (%o2)                6 x  + 19 x  + 19 x + 6
      (%i3) p2:6*x^5+13*x^4+12*x^3+13*x^2+6*x;
                        5       4       3       2
      (%o3)          6 x  + 13 x  + 12 x  + 13 x  + 6 x
      (%i4) gcdivide(p1, p2);
                                   x + 1
      (%o4)                        ------
                                    3
                                   x  + x
      (%i5) takegcd:false;
      (%o5)                         false
      (%i6) gcdivide(p1, p2);
                             3       2
                          6 x  + 19 x  + 19 x + 6
      (%o6)          ----------------------------------
                        5       4       3       2
                     6 x  + 13 x  + 12 x  + 13 x  + 6 x
      (%i7) ratsimp(%);
                                   x + 1
      (%o7)                        ------
                                    3
                                   x  + x

  Package functs · Polynomials ·

関数: arithmetic (a, d, n) ¶

  算術級数`a, a + d, a + 2*d, ..., a + (n - 1)*d`の第n項を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Sums and products ·

関数: geometric (a, r, n) ¶

  幾何級数`a, a*r, a*r^2, ..., a*r^(n - 1)`の第n項を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Sums and products ·

関数: harmonic (a, b, c, n) ¶

  調和級数`a/b, a/(b + c), a/(b + 2*c), ..., a/(b + (n - 1)*c)`の第n項を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Sums and products ·

関数: arithsum (a, d, n) ¶

  算術級数の1からnまでの和を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Sums and products ·

関数: geosum (a, r, n) ¶

  幾何級数の1からnまでの和を返します。 もしnが無限大(`inf`)なら、 rの絶対値が1未満でのみ、和は有限です。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Sums and products ·

関数: gaussprob (x) ¶

  Gaussian確率函数`%e^(-x^2/2) / sqrt(2*%pi)`を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Mathematical functions ·

関数: gd (x) ¶

  Gudermannian函数`2*atan(%e^x)-%pi/2`を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Mathematical functions ·

関数: agd (x) ¶

  逆Gudermannian函数`log (tan (%pi/4 + x/2)))`を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Mathematical functions ·

関数: vers (x) ¶

  正矢(せいし)`1 - cos (x)`を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Mathematical functions ·

関数: covers (x) ¶

  余矢(よし)`1 - sin (x)`を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Mathematical functions ·

関数: exsec (x) ¶

  外正割(exsecant)`sec (x) - 1`を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Mathematical functions ·

関数: hav (x) ¶

  半正矢`(1 - cos(x))/2`を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Mathematical functions ·

関数: combination (n, r) ¶

  一度にr個を取るn個のオブジェクトの組み合わせの数を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Mathematical functions ·

関数: permutation (n, r) ¶

  n個のオブジェクトの集合から選択されたr個のオブジェクトの置換の数を返します。

  この関数を使うには、最初に`load("functs")`を書いてください。

  Package functs · Mathematical functions ·

### 75.5 Package ineq ¶

`ineq`パッケージは不等式の整理規則を含みます。

セッション例:

    (%i1) load("ineq")$
    Warning: Putting rules on '+' or '*' is inefficient, and may not work.
    Warning: Putting rules on '+' or '*' is inefficient, and may not work.
    Warning: Putting rules on '+' or '*' is inefficient, and may not work.
    Warning: Putting rules on '+' or '*' is inefficient, and may not work.
    Warning: Putting rules on '+' or '*' is inefficient, and may not work.
    Warning: Putting rules on '+' or '*' is inefficient, and may not work.
    Warning: Putting rules on '+' or '*' is inefficient, and may not work.
    Warning: Putting rules on '+' or '*' is inefficient, and may not work.
    (%i2) a>=4;  /* a sample inequality */
    (%o2)                               a >= 4
    (%i3) (b>c)+%; /* add a second, strict inequality */
    (%o3)                            b + a > c + 4
    (%i4) 7*(x<y); /* multiply by a positive number */
    (%o4)                              7 x < 7 y
    (%i5) -2*(x>=3*z); /* multiply by a negative number */
    (%o5)                           - 2 x <= - 6 z
    (%i6) (1+a^2)*(1/(1+a^2)<=1); /* Maxima knows that 1+a^2 > 0 */
                                            2
    (%o6)                             1 <= a  + 1
    (%i7) assume(x>0)$ x*(2<3); /* assuming x>0 */
    (%o7)                              2 x < 3 x
    (%i8) a>=b; /* another inequality */
    (%o8)                               a >= b
    (%i9) 3+%; /* add something */
    (%o9)                           a + 3 >= b + 3
    (%i10) %-3; /* subtract it out */
    (%o10)                              a >= b
    (%i11) a>=c-b; /* yet another inequality */
    (%o11)                            a >= c - b
    (%i12) b+%; /* add b to both sides */
    (%o12)                            b + a >= c
    (%i13) %-c; /* subtract c from both sides */
    (%o13)                         - c + b + a >= 0
    (%i14) -%;  /* multiply by -1 */
    (%o14)                          c - b - a <= 0
    (%i15) (z-1)^2>-2*z; /* determining truth of assertion */
                                          2
    (%o15)                         (z - 1)  > - 2 z
    (%i16) expand(%)+2*z; /* expand this and add 2*z to both sides */
                                       2
    (%o16)                            z  + 1 > 0
    (%i17) %,pred;
    (%o17)                               true

不等式の回りで括弧を使うことについて注意してください; ユーザーが`(A > B) + (C = 5)`と入力した時、 結果は`A + C > B + 5`ですが、`A > B + C = 5`は構文エラーであり、 `(A > B + C) = 5`は完全に何か他のものです。

規則定義の完全なリストを見るには、 `disprule (all)`を実行してください。

Maximaが不等式に掛けられる量の符号を決定できない時、 ユーザーは問い合わせを受けるでしょう。

最もありふれた仕様の欠陥を以下に例示します:

    (%i1) eq: a > b;
    (%o1)                              a > b
    (%i2) 2*eq;
    (%o2)                            2 (a > b)
    (%i3) % - eq;
    (%o3)                              a > b

別の問題は0掛ける不等式です; これを0にするデフォルト動作はそのままです。 しかし、 もし`X*some_inequality`とタイプして、 Maximaが`X`の符号を尋ね、 `zero` (または`z`)と答えたなら、 プログラムは`X*some_inequality`を返し、 `X`が0という情報を使いません。 そんな時は、 データベースは、決定の際、`X`を評価する目的ではなく、比較目的のためだけに使われるので、 `ev (%, x: 0)`を実行すべきです。

パッケージがロードされた時、 整理器が、パッケージなしよりたくさんの規則を検証するよう強制されるので、 ユーザーはより遅い応答に気がつくかもしれません。 だから、これらを利用した後、規則を取り除きたいかもしれません。 (あなたが定義したかもしれないものすべてを含み)規則すべてを消すには、 `kill (rules)`してください; もしくは、もっと選択的にそれらのうちのいくつかだけ消すかもしれません; もしくは、特定の規則に`remrule`を使ってください。

もし自分の規則を定義した後、このパッケージをロードするなら、 同じ名前を持つあなたの規則をつぶすでしょう。 このパッケージの規則は以下の通りです: `*rule1`, ..., `*rule8`, `+rule1`, ..., `+rule18`, そして、それを参照するには、 `"+"`に関する最初の規則を限定して取り除くための`remrule ("+", "+rule1")`とか、 二番目の乗法規則の定義を表示するための`disprule ("*rule2")`とか、 規則名を引用符で囲まなければいけません。

Simplification functions · Rules and patterns · Share packages · Package ineq ·

### 75.6 Package rducon ¶

Expressions · Share packages · Package rducon ·

関数: reduce_consts (expr) ¶

  exprの定部分式を構成された定アトムで置き換え、 これら構成された定数すべての定義を等式のリスト`const_eqns`に保存し、 修正されたexprを返します。 exprのそれらのパーツは、関数`constantp`が施された時`true`を返す 定数です。 それゆえ、 `reduce_consts`を呼び出す前に、

      declare ([objects to be given the constant property], constant)$

  をして、自分の式に現れる定数量のデータベースを設定すべきです。

  もしこれらの数式計算の後、Fortran出力を生成する予定があるなら、 最初のコードセクションの1つはすべての定数の計算であるべきです。 このコードセグメントを生成するには、

      map ('fortran, const_eqns)$

  を実行してください。

  `reduce_consts`に影響する`const_eqns` を除いた変数は以下の通りです: `const_prefix` (デフォルト値: `xx`) 定部分式を表すために`reduce_consts`が生成するシンボルすべてに接頭として付けるのに使われる文字列です。

  `const_counter` (デフォルト値: 1)は `reduce_consts`が見つける定部分式それぞれを表すためのユニークなシンボルを生成するのに使われる整数添字です。

  `load ("rducon")`はこの関数をロードします。 `demo (rducon)`はこの関数のデモを見せます。

  Package rducon · Expressions ·

### 75.7 Package scifac ¶

Expressions · Share packages · Package scifac ·

関数: gcfac (expr) ¶

  `gcfac`は 科学者が式をより簡単にしようとする時に適用するのと同じ発見的方法の適用を試みる 因数分解関数です。 `gcfac`は単項式タイプの因数分解に限られます。 和に関しては、`gcfac`は以下を行います:

  1. 整数上で素因数分解します。
  2. 項の複雑さに関わらず、生じる項の最大の冪を係数として因数分解します。
  3. 項の隣同士の対を因数分解する時に、(1)と(2)を使います。
  4. 式がもはや変化しなくなるまで、 これらのテクニックを繰り返し、再帰的に適用します。

  対のすべての可能な再配列の中から最も簡潔な対因数分解された結果を産むものを見つけることの 組み合わせ的に困難な性質のため、 項目(3)は必ずしも、対での因数分解の最善の仕事をしません。

  `load ("scifac")`はこの関数をロードします。 `demo (scifac)`はこの関数のデモを見せます。

  Package scifac · Expressions ·

### 75.8 Package sqdnst ¶

関数: sqrtdenest (expr) ¶

  可能なら、簡単で、数値的で、二項無理数(binomial surds)の`sqrt`をdenestします。

  例えば、

      (%i1) load ("sqdnst")$
      (%i2) sqrt(sqrt(3)/2+1)/sqrt(11*sqrt(2)-12);
                                          sqrt(3)
                                     sqrt(------- + 1)
                                             2
      (%o2)                        ---------------------
                                   sqrt(11 sqrt(2) - 12)
      (%i3) sqrtdenest(%);
                                        sqrt(3)   1
                                        ------- + -
                                           2      2
      (%o3)                            -------------
                                          1/4    3/4
                                       3 2    - 2

  時々、 `(19601-13860 sqrt(2))^(7/4)`に対してのように、 `sqrtdenest`を複数回適用することが役立ちます。

  `load ("sqdnst")`はこの関数をロードします。

  Expressions · Share packages · Package sqdnst ·