[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5. 簡易化

5.1 簡易化に関する諸定義  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.1 簡易化に関する諸定義

関数: APPLY_NOUNS (exp)
式中の名詞型を処理する。例えば、EXP:'DIFF(X^2/2,X);APPLY_NOUNS(EXP);はXになる。 これはEV(EXP,NOUNS);と同じ結果を与えるが、こちらの方がより速く、メモリ消費も より少ない。また、EVで問題が生じる恐れのあるTRANSLATE等で変換されたコードも 利用可能である。評価されていない名詞形式の演算子に対し、APPLYで関連する規則を 適用させるものは、呼出されたAPPLY_NOUNSであって、EV_NOUNSでは無い事に注意せよ。
変数: ASKEXP
デフォルト値:[] - ASKSIGNが呼び出された式を含む。ASKSIGNの質問に答える為に、 利用者はMACSYMA breakに^Aで入って、この式を調べても良い。

関数: ASKINTEGER (exp,<optional-arg>)
expは任意の有効なMACSYMAの式で、オプション引数はEVEN、ODD、INTEGERであり、 与えられない場合のデフォルト値はINTEGERである。この関数はデータベースから expがEVEN、ODD、さてまたINTEGERなのかを決定しようとする。利用者にそれが答え られないものかどうか質問し、もし可能であればデータベースにその情報を仕入れる。
 
(*訳者注:

先ず、EVEN、ODDとINTEGERは、
EVEN     …  偶数
ODD      …  奇数
INTEGER  …  整数
である。

(C1) aa:1;

(D1)                                   1
(C2) askinteger(aa);
(D2)                                  YES
(C3) askinteger(aa,ODD);
(D3)                                  YES
(C4) askinteger(aa,EVEN);
(D4)                                  NO
(C5) askinteger(aa,INTEGER);
(D5)                                  YES
(C6) askinteger(yy);

Is  yy  an integer?

yes;
(D6)                                  YES
(C7) askinteger(yy);

(D7)                                  YES
(C8) askinteger(yy,ODD);
Is  yy  an odd number?

NO;
(D8)                                  NO
(C9) askinteger(yy,even);
(D9)                                  YES
(C10) askinteger(zz,even);
Is  zz  an even number?

no;
(D10)                                 NO
(C11) askinteger(zz,odd);
Is  zz  an odd number?

no;
(D11)                                 NO
(C12) askinteger(zz,integer);
Is  zz  an integer?

yes;
(D12)                                 YES
(C13) askinteger(zz,integer);
(D13)                                 YES

この様に、yyがINTEGERであると指定すると、それからyyはINTEGERとなっている。
更に、yyがODDと宣言すると、自動的にEVENとなる。但し、zzがODDで無く、EVEN
で無いと宣言しても、askinteger(zz)はNOとはならずに尋ねてくる。ここで、YES
とすれば、それまで入力したODDでもEVENでも無い事は消去されている。

*)

関数: ASKSIGN (exp)
最初に入力された式が、正、負又は零であるかを決定する。もし、出来なければ、 その演繹を完遂する為に必要な質問を利用者に対して行う。利用者の答は現行の計算 (一つの"C行")の処理時間に対してデータベースに記録される。ASKSIGNの値はPOS、 NEG、ZEROの内のどれか一つである。

 
(* 訳者注:

POS   …  正の値
NEG   …  負の値
ZERO  …  零

*)

変数: DEMOIVRE
デフォルト値:[FALSE] - TRUEであれば、
 
%E^(A+B*%I) ==> %E^A*(COS(B)+%I*SIN(B))

となる。ここでBが%Iを持たなければ、AとBは展開されない。

DEMOIVRE:TRUE;でEXPONENTIALIZE:TRUEの効果を逆にする。

DEMOIVRE(exp)は、そのスイッチの設定やEVによる式の再評価無しでその変換を行う。

変数: DOMAIN
デフォルト値:[REAL] - COMPLEXであれば、SQRT(X^2)はABS(X)を返す代りにSQRT(X^2) のままとする。簡易化での"domain"の表記は依然初歩的で、暫くは、これ以上の制御 が行えない。

関数: EXPAND (exp)
総和の積と指数関数内部の和を展開し、有理式の分子を各々の項に分離し、そして 乗法(可換と非可換)をexpの全ての階層で加法に対して分配する。多項式に対しては、 より効率的なアルゴリズムを用いるRATEEXPAND(DESCRIBE(RATEXPAND);を参照せよ) を通常用いるべきである。

ファイルSHARE1;FACEXP FASLに幾つかの関連した関数(FACSUMとCOLLECTTERMが二つ) を含み、それらは制御された展開で式を構成する事が利用者が出来る様にする。 関数の概要はSHARE1;FACEXP USAGEで利用可能である。デモはBATCH("facexp.mc")$の 実行で利用出来る。

関数: EXPANDWRT (exp,var1,var2,...)
variに対してexpを展開する。variを含む全ての積は明示的に現れる。返される形式は variを持つ式の和の積を持たないものとなる。variは変数、演算子や式でも良い。 デフォルトで分母は展開されないが、EXPANDWRT_DENOMスイッチによって制御する事が 可能である。この関数を使う為にはLOAD(STOPEX);を実行せよ。

 
(* 訳者注:

Maximaではloadに失敗する。原因として存在しないFASLファイル等の読込みを実行し
ようとする為らしい。他に関数名が現状のMaximaで用いるものと異っている点もある。
実際に利用する為には、これらの修正が必要である。

*)

変数: EXPANDWRT_DENOM
デフォルト値:[FALSE] - EXPANDWRTによって展開された有理式の処理を制御する。 TRUEであれば、式の分子と分母の両方をEXPANDWRTの引数に従って展開を行うが、 EXPANDWRT_DENOMがFALSEであれば、分母のみをその方法で展開する。使う為には LOAD(STOPEX)を実行せよ。

関数: EXPANDWRT_FACTORED (exp, var1, var2, ..., varN)
EXPNDWRTに似ているが、幾分違った式の積を扱う。EXPAND_FACTOREDは要求される展開 を処理するが、引数リストの中の変数に含まれるexpの因子に対してのみ処理を行う。 これを使う為にはLOAD(STOPEX)を実行せよ。

変数: EXPON
デフォルト値:[0] - (EXPANDを呼び出す事とは独立して)自動的に展開される (絶対値が)最大の負の羃乗の指数。例えば、EXPONが4であれば(X+1)**(-5)は 自動的に展開されない。

変数: EXPONENTIALIZE
デフォルト値:[FALSE] - TRUEであれば、全ての三角関数と双曲関数が指数関数形式 に変換される(DEMOIVRE:TRUE;と設定すれば、逆の効果となる)。

EXPONENTIALIZE(exp)でスイッチの設定やEVによる式の再評価なしで式を指数関数形式 に変換する。

変数: EXPOP
デフォルト値:[0] - 自動的に展開される最大の正の指数。即ち、(X+1)**3と入力され た時に自動的に展開されるのはEXPOPが3以上の時に限る。もし、EXPOPよりも大きなn で(X+1)**nを展開したければ、EXPAND((X+1)**n)を実行すればMAXPOSEXがnよりも小さ くない時に限って動作する。

変数: FACTLIM
デフォルト値:[-1] - 自動的に展開される最も高い階乗を与える。-1であれば全ての 整数で展開される。

関数: INTOSUM (expr)
総和の乗法がなされる全ての物を取り、それらを総和の内部に置く。 もし、添字が式の外側で用いられていれば、この関数はSUMCONTRACTに対して実行す るのと同様に適切な添字を探そうとする。これは本質的に総和のOUTATIVE属性の 観念の逆であるが、この属性を取り除かずに素通りするだけである事に注意する。 幾つかの場合ではINTOSUMの前にSCANMAP(MULTTHRU,expr)が必要かもしれない。

宣言: LASSOCIATIVE
- DECLARE(G,LASSOCIATIVE);が実行されると、これは簡易化に対してGが左分配可能 である事を指定する。例えば、G(G(A,B),G(C,D))はG(G(G(A,B),C),D)に簡易化される。

宣言: LINEAR
- MACSYMAのOPPROPERTIERS(特殊演算子属性)の一つ。単一変数fがそう宣言されて いると、Aを"定数"とすれば、"展開" F(X+Y) -> F(X)+F(Y), F(A*X) -> A*F(X)が 実行される。

二変数以上の関数Fに対して"線型性"が定義されていると、'SUMや'INTEGRATEの場合、

Xを持たないA,Bに対してはF(A*X+B,X)->A*F(X,X)+B*F(1,X)となる(LINEARは丁度 ADDITIVE+OUTATIVEとなる)。

宣言: MAINVAR
- 変数をMAINVAR(主変数)としてDECLAREを用いて宣言しても良い。原子の順序は本質的 に数値<定数(例えば、%E,%PI)<スカラー<他の変数<MAINVARSである。例えば、 EXPAND((X+Y)^4);と(DECLARE(X,MAINVAR),EXPAND((X+Y)^4));の結果を比較せよ (注意:上述の機能を用いる事を選択した場合は注意が必要である。例えば、式の減算 で一方でXをMAINVARとし、もう一方でXをMAINVARとしていなければ、変数消去が発生 していれば再簡易化、例えば、EV(expression,SIMP)が必要となるかもしれない。 又、SAVEでXがMAINVARである式を保存する場合は、恐らくXも保存しなければなら ないだろう)。

変数: MAXAPPLYDEPTH
デフォルト値:[10000] - APPLY1とAPPLY2が検査する最大の深さ。

変数: MAXAPPLYHEIGHT
デフォルト値:[10000] - APPLYB1が到達可能な最大の高さ。

変数: MAXNEGEX
デフォルト値:[1000] - EXPAND命令によって展開される(絶対値が)最も大きな負の 指数(MAXPOSEXも見よ)。

変数: MAXPOSEX
デフォルト値:[1000] - EXPAND命令で展開される最大の指数(MAXNEGEXも見よ)。

宣言: MULTIPLICATIVE
- DECLARE(F,MULTIPLICATIVE)が実行されていると:

この簡易化はFがPRODUCT(X[I],I,下限,上限)の形式の式に作用させる時には生じない。

変数: NEGDISTRIB
デフォルト値:[TRUE] - TRUEであれば、式に含まれる-1の積が分配される。例えば、 -(X+Y)は-X-Yとなる。FALSEであれば、-(X+Y)はそのままで表示される。これは 時には便利だが注意を要する。通常の何でも無い処理やMACSYMAの局所的な利用以上の 必要性でSIMPフラグの様にFALSEに設定したくないフラグの一つである。

変数: NEGSUMDISPFLAG
デフォルト値:[TRUE] - TRUEであれば、X-Yは-Y+Xの代りにX-Yとして表示される。 FALSEに設定すると、二つの式の差で、表示に関するこの特別な検査が実行されない。 一つの適用はA+%I*BとA-%I*Bの両方が同じ方法で表示される。

 
(*訳者注:

(C1) NEGSUMDISPLAG;

(D1)                                TRUE


(C2) A+%I*B;

(D2)                               %I B + A
(C3) A-%I*B;

(D3)                               A - %I B
(C4) NEGSUMDISPFLAG:FALSE;

(D4)                                 FALSE
(C4)  A+%I*B;

(D4)                               %I B + A
(C5) A-%I*B;

(D5)                              - %I B + A

となる。
*)

特殊記号: NOEVAL
- EVによる評価を抑圧する。他のスイッチとの連携による再評価無しに式の簡易化を 行う時に便利である。

宣言: NOUN
- DECLARE命令のオプションの一つ。関数を自動的に評価されない関数を意味する "名詞型"として宣言する。

変数: NOUNDISP
デフォルト値:[FALSE] - TRUEであれば、名詞型が単引用符(')付きで表示される。 関数の定義を表示する時、このスイッチは常にTRUEである。

特殊記号: NOUNS
(EVFLAG) EV命令に対して、オプションとして用いる時、EVが作用する式に現われる 全ての"名詞"型は"動詞"型に変換される。つまり、それらが評価される。 NOUN,NOUNIFY,VERBとVERBIFも見よ。

特殊記号: NUMER
数値引数を持つ数学関数(指数関数を含む)が浮動小数点で評価される要因となる。 NUMERVALで与えられたexpの変数をそれらの値で置き換え、FLOATスイッチもONになる。

関数: NUMERVAL (var1, exp1, var2, exp2, ...)
variをexpiの数値変数として宣言し、このexpiはNUMERフラグがTRUEであれば、任意 の式に現われるその変数に対して評価と代入が行われる(EV関数を見よ)。

変数: OPPROPERTIES
- MACSYMAの簡易化で実装されている特殊演算子属性のリスト:LINEAR, ADDITIVE, MULTIPLICATIVE, OUTATIVE,EVENFUN, ODDFUN, COMMUTATIVE, SYMMETRIC, ANTISYMMETRIC, NARY,LASSOCIATIVEとRASSOCIATIVEである。

変数: OPSUBST
デフォルト値:[TRUE] - FALSEであれば、SUBSTが式中の演算子に対して代入する 事を防ぐ。例えば、(OPSUBST:FALSE,SUBST(X^2,R,R+R[0]));も動作する。

 
(*訳者注:

(C1) SUBST(X^2,R,R+R[0]); 

                                   2     2
(D1)                              X  + (X )
                                           0
(C2) (OPSUBST:FALSE,SUBST(X^2,R,R+R[0]));

                                     2
(D2)                                X  + R
                                          0

と、R[0]に安易な代入が行われていない事に注目。
*)

宣言: OUTATIVE
- DECLARE(F,OUTATIIVE)が実行されていると:

最初は'SUM,'INTEGRATEや'LIMITがOUTATIVEと宣言されている。

宣言: POSFUN
- 正関数(POSitive FUNction)、つまり、DECLARE(F,POSFUN);IS(F(X)>0);->TRUE である。

変数: PRODHACK
デフォルト値:[FALSE] - TRUEであれば、PRODUCT(F(I),I,3,1);は1/F(2)となる。 これはA>Bの場合、PRODUCT(F(I),I,A,B) = 1/PRODUCT(F(I),I,B+1,A-1)とする為 である。

関数: RADCAN (exp)
式expは、log、指数関数と羃乗根を含んでいても良く、式の大きなクラスと与えら れた変数の順序上で正規となる形式に変換する事で簡易化を行う。つまり、全ての 関数的に同値な形式は単一の形式に写影される。幾らかより大きな式のクラスに対し、 RADCANは正則形式を生成する。このクラスの中で二つの同値な式は同じ表示である 必要は無いが、それらのRADCANによる簡易化の差異は零となる。ある式に対しては RADCANは時間を多く消費する。これは因子分解と指数の部分分数展開を基本とした 簡易化の為に式の成分の間の関係を探索する代償である。

%E_TO_NUMLOG(デフォルト値:[FALSE]) - TRUEであれば、ある有理数"r"と、ある式 "x"に対して%E^(r*LOG(X))はX^rに簡易化される。

RADEXPAND[TRUE] - FALSEであれば、ある変換を禁止する:RADCAN(SQRT(1-X))は SQRT(1-X)のままで%I SQRT(X-1)とはならない。RADCAN(SQRT(X^2-2*X+1))は SQRT(X^2-2*X+1)のままでX-1に変換されない。例はEXAMPLE(RADCAN);を実行せよ。

変数: RADEXPAND
デフォルト値:[TRUE] - ALLであれば、n乗した因子のn乗根が根号の外に出される。 例えば、RADEXPANDがALLであれば、SQRT(16*X^2)は4*Xとなる。より特殊なものは SQRT(X^2)を考えよ。 (REALやCOMPLEXの設定を持つDOMAINの表記は依然幼稚である。ここでの設定は RADEXPANDがTRUEの時だけの事項である事に注意せよ。)

変数: RADPRODEXPAND
- このスイッチはRADEXPANDに名前を代えている。

変数: RADSUBSTFLAG
デフォルト値:[FALSE] - TRUEであれば、RATSUBSTがXでSQRT(X)をUで置き換える。

宣言: RASSOCIATIVE
- DECLARE(G,RASSOCIATIVE);が実行されると、これは簡易化に於てGが右分配律を 満す事を伝える。つまり、G(G(A,B),G(C,D))はG(A,G(B,G(C,D)))と簡易化される。

関数: SCSIMP (exp,rule1, rule2,...,rulen)
SCSIMP(=Sequential Comparative SIMPlification)は、式(その最初の引数)、同一性 や規則(その他の引数)の集合を取って簡易化を試みる。もし、より小さな式が得られ ると、その処理が繰り返される。そうでなければ、全ての簡易化が試みられた後に、 元の答が返される。例はEXAMPLE(SCSIMP);を試みよ。

関数: SIMP
FALSEであれば簡易化を禁止するSIMPスイッチの設定と無関係にexpの簡易化を行う。

変数: SIMPSUM
デフォルト値:[FALSE] - TRUEであれば、SUMの結果は簡易化される。この簡易化で 時々閉形式を生成する事が可能である。もし、SIMPSUMがFALSEか、'SUMが利用されて いれば、その値はSUMの名詞型で数学で使われる総和記号の表現となる。

関数: SUMCONTRACT (expr)
上限と下限の差が定数となる加法の全ての総和を結合する。結果は、各総和の集合に 対して、全ての適切な外の項を加えて一つの総和にしたものを含む式である。 SUNCONTRACTは全ての互換な総和を結合し、もし可能であれば、総和の一つから添字の 一つを用いる。SUMCONTRACTを実行する前にINTOSUM(expr)の実行が必要かもしれない。

変数: SUMEXPAND
デフォルト値:[FALSE] - TRUEであれば、和の積と和の羃乗は複数のsumを用いたもの に変換される。

 
例えば:

        SUMEXPAND:TRUE$
        SUM(F(I),I,0,M)*SUM(G(J),J,0,N); ->
                        'SUM('SUM(F(I1)*G(I2),I2,0,N),I1,0,M)
        SUM(F(I),I,0,M)^2; -> 'SUM('SUM(F(I3)*F(I4),I4,0,M),I3,0,M)

FALSEであれば、それらはそのままにされる。CAUCHYSUMも参照せよ。

変数: SUMHACK
デフォルト値:[FALSE] - TRUEであれば、A>Bの時に、 SUM(F(I),I,A,B)=-SUM(F(I),I,B+1,A-1)とする為、SUM(F(I),I,3,1);は-F(2)となる。

変数: SUMSPLITFACT
デフォルト値:[TRUE] - FALSEであれば、MINFACTORIALはFACTCOMBの後に作用させ られる。

宣言: SYMMETRIC
- DECLARE(H,SYMMETRIC);が実行されていれば、Hが対称関数である事を簡易化関数に 伝える。つまり、H(X,Z,Y)はH(X,Y,Z)に簡易化される。これはCOMMUTATIVEと同じで ある。

関数: UNKNOWN (exp)
expが一つの演算子を持つか、関数が組み込みの簡易化関数が分らない場合にTRUEを 返す。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Hiroshi Yokota on September, 16 2002 using texi2html