codegen[optimize] - 共通部分式の最適化
使い方
optimize(expr)
パラメータ
expr - 式、配列、方程式のリスト、または手続き
|
説明
|
|
•
|
optimize への入力は、単一の代数式、(例えば、公式の行列のような)代数式の配列、name = algebraic の形の等式のリスト(すなわち``計算列'')、または Maple の手続きのいずれかでなければなりません。
|
•
|
もし入力が Maple の手続きでなければ、optimize からの出力は入力に対する``最適化された計算列''を表す name = algebraic の形の等式のリストです。列における各々の方程式は1つの代入に対応します。大域変数 t0, t1, t2, … は計算列において一時的な(局所)変数として用いられます。
|
•
|
もし入力が Maple の手続きならば、出力は最適化された Maple の出力です。現在のところ optimize は、``計算列''すなわち単純な代入文の列から成る単純な手続き(それらは if 文や繰り返しを含まない)のみを最適化することができます。
|
[s1 = f1(x), s2 = f2(x,s1), ..., sn = fn(x,s1,...,sn)]
|
の形の計算列であるならば、これは Maple の手続き
|
|
proc(x) global s1,s2,...,sn;
s1 := f1(x);
s2 := f2(x,s1);
...
sn := fn(x,s1,s2,...,sn);
end proc
|
|
と同値であると解釈されます。従って、計算列における名前 s1, s2, s3, …, sn は計算列から取り除くことのできない大域変数として認識されます。そうでない場合は、オプション引数、globals=[g1, g2, …, gn]、parameters=[p1, p2, …, pm]、および locals=[l1, l2, …, l3] を用いて指定されます。
|
•
|
optimize 関数は、x が s1, s2, …, sn のいずれも含まない計算列
|
[s1 = f1(x), s2 = f2(x,s1), ..., sn = fn(x,s1,...,sn)]
だけを最適化するために設計されています。従って、この条件が満足される場合のみ optimize 関数の使用を推奨します。そうでないと、予期しない 結果が得られるでしょう。
•
|
optimize 関数は Maple の記憶機能オプションを線形な計算時間とメモリ空間において部分式を特定するため用います。しかしながら、このことは、Maple が単一のものとして単純化した部分式のみを見つけられることを意味します。例えば、式 x+y は x+y+z と共通であるとは認識されません。すなわち、optimize は主として``構文的な''最適化を行ないます。
|
•
|
もし tryhard がオプション引数として与えられるなら、異なったアルゴリズムが用いられ、より良く最適化された出力が与えられるが、より多くの時間とメモリ空間が消費されます。
|
•
|
ルーチン codegen[cost] を、最適化されていないものとされているものの入力に対する操作の合計回数を与えるため用いることができます。
|
•
|
with(codegen,optimize) はこのコマンドの短縮形の使用を可能にします。
|
|
|
例
|
|
>
|
with(codegen,optimize,makeproc,cost):
f := x^4-x^3;
|
| (2.1) |
| (2.2) |
>
|
f := x*ln(x)+2*x^2*ln(x)+3*x^3*ln(x);
|
| (2.3) |
| (2.4) |
| (2.5) |
| (2.6) |
>
|
cost(f)-cost(optimize(f)); # the savings
|
| (2.7) |
| (2.8) |
| (2.9) |
>
|
cs := [t=x,r[1]=t*(x-y)^2,r[2]=2*(y-x)^2]:
optimize(cs);
|
| (2.10) |
>
|
optimize(cs,locals=[t]); # r[1],r[2] are global
|
| (2.11) |
| (2.12) |
| (2.13) |
>
|
A := array([[x^3,x^2],[x^2,x^4]]);
|
| (2.14) |
| (2.15) |
>
|
g := proc(x,A::array(1..2)) A[1] := y*sin(x); A[2] := x^2*sin(x); end proc;
|
| (2.16) |
| (2.17) |
>
|
h := proc(x) local s,t,r; s := 1; t := x; r := t^2; r*s end proc;
|
| (2.18) |
| (2.19) |
>
|
s := proc(a,b,c) local r,s; r := a*b+a*c; s := b*c+c^2;r-s;end proc;
|
| (2.20) |
| (2.21) |
| (2.22) |
|
|