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


デフォルト簡単化

本節では、あらゆる計算結果に自動的に適用される、 「デフォルト簡単化規則群」を解説します。 例えば、変数 x をスタックに 2回入力して + を押せば、 Calc のデフォルト簡単化機能は、自動的に x + x2 x に変えます。

m O コマンドはデフォルト簡単化を停止して、 =a v などの明確な「簡単化」コマンドを与えない限り、 x + x がその形のまま残るようにします。 代数的操作 参照 。 m D コマンドは、デフォルト簡単化を再開します。

最も基本的なデフォルト簡単化は、関数の評価です。 例えば、2 + 35 に評価され、 sqrt(9)3 に評価されます。 次のいずれかの場合、関数は評価されません。 引数の型の誤り (tan([2,3,4]), 引数の範囲の誤り (tan(90)), 引数の数の誤り (tan(3,5)), 関数名が認知されない場合 (f(5)), "symbolic" mode (シンボリック・モード 参照 ) が 評価を防止している場合 (sqrt(2)) 。

Calc は関数そのものを簡単化する前に、その関数の引数を簡単化(評価)します。 それで sqrt(5+4)sqrt 関数が計算される前に sqrt(9) に簡単化されます。 この法則には僅かながら例外があります。 quote, lambda, condition (:: 演算子) は その引数を評価しませんし、 if (? : 演算子) は引数群をどれ一つとして評価しません。 evalto は自身の左側の引数を評価しません。

ほとんどのコマンドは、 スタックから取得した引数すべてにデフォルト簡単化をかけ、 特定の演算を実行し、結果を簡単化してからスタックに push して戻します。 +Q [sqrt] のような標準算術コマンド共通の特例は、 スタックから引数群が単に pop され、適当な関数呼出しにまとめ入れられ、 そしてその関数が簡単化されます (その過程の一部として、上述のようにまず簡単化される引数群(動詞はどこだ))。

デフォルト簡単化規則群をここで完全に解説するには数が多すぎますが、 本節では主な算術演算子に適用する規則群を解説します。 この一覧は元来かなり専門的で、 あなたが Calc 代数のヘビーユーザーでなければおそらく面白くないでしょう。

-*- ちょっとひといき -*-

ここに解説した簡単化規則群のみならず、 任意の書替え規則群を変数 EvalRules にストアすると、 その規則群が組込み規則群よりも先に適用されるようになります。 詳細は、Automatic Rewrites 参照 。

-*- 閑話休題 -*-

さて、デフォルト簡単化規則群に取りかかりましょう。

+* のような算術演算子は、 Calc の内部形式では常に2つの引数を取ります。 3項以上の和や積は、代数の結合法則によって、 和は左結合形式 ((a + b) + c) + d, 積は右結合形式 a * (b * (c * d)) に (内部構造が)編成されます。 (a + b) + (c + d) のような式も、 左結合形式に再編成されますが、 Calc の代数コマンドは和や積の内部構造をできるだけ隠そうとするので、 まず問題になりません。 本来の結合形式の和や積は、以下の例ではカッコ無しで書かれます。

以下の小数の例外を除き、 和や積の交換法則による再編成(a + b から b + a へ)は されません。 世の中の代数ソフトによっては、常に各項を正規順序に整理して、 a b + b a2 a b に 簡単化可能なことが判るようにしたものもあります。 しかし、Calc はユーザーが望みどおりの項順序で入力したとみなし、 普通はその順序のままにしておくので、 上記のような式は ユーザーが明示的に a s コマンドを与えなければ 簡単化されません。代数的簡単化 参照 。

a - b は簡単化目的で和 a + (-b) のように扱われます。 デフォルト簡単化規則群のひとつは、 a + (-b)(-b) + aa - b 形式に書替えます。 ただし -b は「負に見える」項です。 「負に見える」とは、負の数, -x のように負符号をつけた式, 片方が負に見える積や商のことです。

その他の簡単化で負符号を伴うものに、 -(-x) から x への簡単化があります。 a または b のどちらかが負に見える場合、 それらの積や商は負符号を整理して -(a b)-(a/b) と書かれます。 ab が任意の数である場合、それらの和や差を符号反転すると、 -(a + b) から -a - b, -(b - a) から a - b に書替えられます。 (この最後の例や、(-b) + a から a - b への書替えの場合、 デフォルト簡単化規則によって例外的に和の項順が変えられます。)

分配法則を使って和が簡単化される場合もあります。 a, b がそれぞれ数値であるか、 または暗に (x-x のように省略されているが) 1 か -1 である 場合、 a x + b x(a + b) x に書替えられます。 数値以外の係数を持つ和を分配法則でまとめるには、 a c, a f, j M コマンドを使ってください。

分配法則は、2項の和か、3項以上なら隣り合う項についてのみ適用されます。 そのため a + b + b + ca + 2 b + c に簡単化されますが、 a + b + c + b は簡単化されません。 このようにしている理由は、 ある和のあらゆる項をお互いに比較するには、 項数の2乗に比例する時間が必要だからです。 Calc では、このような潜在的に遅い操作は、 明示的に呼出すコマンドに整理されています。a s のように。

a + 00 + aa に簡単化されます。 上述の規則群の結果、0 - a-a に簡単化されます。

-*- ちょっとひといき -*-

1 aa 1a に簡単化され、 (-1) aa (-1)-a に簡単化されます。 0 aa 00 に簡単化されますが、 ただし a が絶対にスカラーではない matrix mode においては、 一般ゼロ行列 `idn(0)' に簡単化されます。 また a が無限大なら `nan' となります。

また、(-a) ba (-b)-(a b) に簡単化されますが、 ただしこれは負符号のついた式に限られ、普通の負の数では起こりません。

積の項順は、数値のみ先頭に入替えられます。 a b 22 a b に順序が入替えられます。

a (b + c) は、 a が数値であり、 かつ b, c の少なくとも 1つが数値である場合に限り、 分配法則により展開されます。 2 (x + 3)2 x + 6 になります。 -a が負である式 (-a) (b - c) は、 a (c - b) に書替えられます。

積とべき乗の分配法則は積の隣合う項に適用されます。 a, b が、それぞれ数値, (x のように)隠された 1, sqrt(x) のように隠された 1/2 のいずれかの場合、 x^a x^bx^(a+b) になります。 まとめられたべき乗の合計が 1/2 の場合は `sqrt'-1/2 の場合は `1/sqrt' を使って結果が表現されます。 べき乗の合計がゼロになった場合、 積は 1 (matrix mode の時は `idn(1)') に簡単化されます。

負のべき乗とそれ以外との積は、割り算に変えられます。 x^(-2) y は、 y / x^2 になります。 ただし matrix mode であって、かつ xy も スカラーでない (この場合、項の順序を変えるのは不安全と考えられます)場合は、 この簡単化は起こりません。

そして、a (b/c)(a b)/c に書替えられ、 (a/b) c は matrix mode でなければ (a c)/b になります。

-*- ちょっとひといき -*-

商の簡単化は積の場合のそれに類似しています。 商 0 / x0 に簡単化されますが、 0 x のところで指摘したのと同じ例外があります。 同じく、x / 1x に、 x / (-1)-x に簡単化されます。

x / 0 は簡単化されずに残されるか、 無限大モードの設定に従った無限量に変換されます。 無限大モード 参照 。

a / b^(-c) は、a b^c に書替えられます。 ただし -c は任意の負に見えるべき乗です。 また、任意の c について、 1 / b^cb^(-c) になります。

さらに、matrix mode が邪魔しなければ、 (-a) / ba / (-b)-(a/b) になり、 (a/b) / ca / (b c) になり、 a / (b/c)(a c) / b になります。 同様に、任意の分数 b:c について、 a / (b:c)(c:b) a に簡単化されます。

(a + b) / c は、 c が数値であり、 かつ a, b の少なくとも 1つが数値である場合に限り、 分配法則により展開されます。 商のべき乗や平方根は積で解説したのとちょうど同じように展開されます。

積と商は左側の項のみ約分します。 言換えれば、 a x b / a y b は左の項が約分されて x b / y b になりますが、 x / y にはなりません。 繰返しますが、これは完全な約分操作が遅くなる可能性があるからです。 全ての項を約分するには a s を使ってください。

負に見える値の商は、 (-a) / (-b)a / b(-a) / (b - c)a / (c - b)(a - b) / (-c)(b - a) / c のように簡単化されます。

-*- ちょっとひといき -*-

x^01 に簡単化されるか、 matrix mode であれば `idn(1)' に簡単化されます。 式 0^x は、x が負数や複素数でない限り 0 に簡単化されます。 x が負数や複素数の場合、 結果は無限大モードの設定によって無限大になったり、簡単化されない式になります。 x=0 において、 x^00^x の簡単化が矛盾することから明らかなように、 0^0 は未定義形式です。

積や商のべき乗 (a b)^c, (a/b)^c は、 c が整数であるか、 a, b のいずれかが負でない実数である場合に限り、 分配されて a^c b^c, a^c / b^c に展開されます。 べき乗のべき乗 (a^b)^c は、 c が整数であり、かつ b c も整数に評価される場合に限り、 a^(b c) に簡単化されます。 これらの簡単化は、このような制限が無いと、 主値問題(代数 練習問題 1 解答「二乗と平方根」 参照 )で不安全になってしまいます。 (言換えれば、 ((-3)^1:2)^2 は簡単化しても安全ですが、 ((-3)^2)^1:2 は安全ではありません。) ユーザー変数がこれらの条件を満たす事を Calc に示す方法は、 宣言 参照 。

この規則の特別な例として、 sqrt(x)^n は、n が偶数のときに限り x^(n/2) に簡単化されます。

a が実数であることが判っていて、かつ b が偶数であり、 かつ c が 1/2 か 1/4 の倍数ならば、 (a^b)^cabs(a^(b c)) に簡単化されます。

また、任意の負に見える式 -a について、 (-a)^b は、 b が偶数なら a^b、 奇数なら -(a^b) に簡単化されます。

上に挙げた簡単化の目的からすると、 平方根 sqrt(x) は、基本的に 1/2 乗 x^1:2 のように振舞います。

ただし 1 / x^1:2x^(-1:2) になりますが、 1 / sqrt(x) はそのまま残されることに注意してください。

-*- ちょっとひといき -*-

一般単位行列(行列モードとスカラ・モード 参照 )は以下の規則群により簡単化されます。

-*- ちょっとひといき -*-

floor 関数や他の整数切捨て?関数は、 引数が確実に整数値と見なせる場合は消滅して、 floor(round(x))round(x) に簡単化します。 また、float, floor とその仲間達, ffloor とその仲間達の組合せは、適切に簡単化されます。 Integer Truncation 参照 。

abs(-x)abs(x) に変ります。 式 abs(abs(x))abs(x) に変ります。 実際には、abs(x)x が負でないことが確実なら x に、 正でないことが確実なら -x に変ります(宣言 参照 )。

ほとんどの関数は変数 i を虚数として認識しませんが、 arg 関数は arg(i)arg(-i) の 両方の場合を扱うので便利です。

conj(conj(x))x に簡単化します。 conj, re, im を使った他のいろいろな式も簡単化されますが、 特に、引数の幾つかが実数か虚数(定数 i を含む)か確実に判っている場合は、 さらに簡単化されます。 例えば、conj(a + b i) は、 一般には conj(a) - conj(b) i に簡単化されますが、 a, b が実数であることが知れていれば a - b i になります。

sinarctan のような関数は、 適正数値引数や無限大引数に対する単なる関数評価はしますが、 それ以上のデフォルト簡単化規則は普通ありません。 しかし次節で解説する a s コマンドは、 これらの関数の簡単化機能をいくつか提供します。

ある重要な簡単化は、ln(e) が 1 になり、 ln(e^x) が任意の x について x になることです。 (自然対数を使っている時にこんな事はお薦めできませんが、) たとえ Calc 変数 `e' に違う値をストアしていても、この簡単化は起こります。

論理関数の簡単化では、 !(a <= b)a > b になったりします。 等式や不等式の両辺が、それぞれ負に見えたりゼロだったりすると、 両辺を正負反転(サインチェンジ)し、不等号を逆にして簡単化します。 !!xx にするのは良さそうに見えるかもしれませんが、 !!2 は 1(真) であって 2 ではないので一般には正しくありません。

他の Calc 関数の多くは、 デフォルト簡単化規則がなにか定義されていることはめったにありません。 もちろん、引数が適正な数値であった場合は評価されます。


Go to the first, previous, next, last section, table of contents.     利用度数