これらの線に沿った何かは、MathGroupの投稿で議論されています
http://forums.wolfram.com/mathgroup/archive/2009/Oct/msg00023.html
(少なくともその投稿の作者には非常に関連性のある外典のメモがあるようです。)
上記の例でどのように適用されるかを次に示します。この自己完結型を維持するために、置換コードを繰り返します。
replacementFunction[expr_, rep_, vars_] :=
Module[{num = Numerator[expr], den = Denominator[expr],
hed = Head[expr], base, expon},
If[PolynomialQ[num, vars] &&
PolynomialQ[den, vars] && ! NumberQ[den],
replacementFunction[num, rep, vars]/
replacementFunction[den, rep, vars],
If[hed === Power && Length[expr] == 2,
base = replacementFunction[expr[[1]], rep, vars];
expon = replacementFunction[expr[[2]], rep, vars];
PolynomialReduce[base^expon, rep, vars][[2]],
If[Head[hed] === Symbol &&
MemberQ[Attributes[hed], NumericFunction],
Map[replacementFunction[#, rep, vars] &, expr],
PolynomialReduce[expr, rep, vars][[2]]]]]]
あなたの例は次のようになります。入力と置換を行います。後者の場合、分母を払うことによって同等の多項式を作成します。
kK = a*b*t/((t + f) c*d);
rep = Numerator[Together[p - t/(t + f)]];
これで、置換を呼び出すことができます。'p'をパラメーターとして扱い、置き換えたい変数をリストします。このように、それは他よりも低く注文されます。つまり、置換は「p」を優先してそれらを削除しようとします。
In[127]:= replacementFunction[kK, rep, {t, f}]
Out[127]= (a b p)/(c d)
このアプローチには、リストされている「変数」が何であるかを理解するのに少し魔法があります。おそらく、それを改善するためにさらに微調整を行うことができます。しかし、一般的に、新しい代替品として使用したいものをリストしないことが正しい方法であると私は信じています。
何年にもわたって、MathGroupにはこのアイデアのバリエーションがありました。他のいくつかは、処理したい特定の式により適している可能性があります。
- - 編集 - -
この背後にある考え方は、PolynomialReduceを使用して代数置換を行うことです。つまり、パターンマッチングを試みるのではなく、多項式の「正規化」メソッドを使用します。しかし、一般的に、私たちは多項式入力を扱っていません。したがって、このアイデアをNumericQ関数内のPolynomialQ引数に再帰的に適用します。
このアイデアの以前のバージョンは、いくつかの詳細とともに、以下で参照されているメモ、およびそれが参照しているメモにあります(説明的な再帰についてはどうですか?)。
http://forums.wolfram.com/mathgroup/archive/2006/Aug/msg00283.html
---編集を終了---
---編集2---
野生で観察されるように、このアプローチは必ずしも単純化するものではありません。これは代数的置換を行います。これには、内部で「用語の順序付け」(大まかに言うと「どのものが他のものに置き換えられるか」)の概念が含まれるため、単純な変数はより長い式に拡張できます。
用語の書き換えのもう1つの形式は、パターンマッチングによる構文の置換であり、他の応答では、そのアプローチの使用について説明しています。考慮すべきパターンの一般性が圧倒的になる可能性がある限り、これには別の欠点があります。たとえば、ルールがk /(w + p ^ 4)をqに置き換えることである場合、k ^ 2 /(w + p ^ 4)^ 3で何をしますか?(具体的には、これを(k /(w + p ^ 4))^ 2 * 1 /(w + p ^ 4)と同等であるとどのように認識しますか?)
結論は、何が望まれ、どのような方法が実行可能であるかについての考えを持っている必要があるということです。もちろん、これは一般的に問題固有です。
発生することの1つは、一般的に発生するすべての「複雑な」式を見つけて、より単純な式に置き換えたい場合です。これは、共通部分式除去(CSE)と呼ばれます。Mathematicaでは、これはExperimental`OptimizeExpression[]と呼ばれる関数を使って行うことができます。これについて説明しているMathGroupの投稿へのリンクがいくつかあります。
http://forums.wolfram.com/mathgroup/archive/2009/Jul/msg00138.html
http://forums.wolfram.com/mathgroup/archive/2007/Nov/msg00270.html
http://forums.wolfram.com/mathgroup/archive/2006/Sep/msg00300.html
http://forums.wolfram.com/mathgroup/archive/2005/Jan/msg00387.html
http://forums.wolfram.com/mathgroup/archive/2002/Jan/msg00369.html
これらのメモの1つからの例を次に示します。
InputForm[Experimental`OptimizeExpression[(3 + 3*a^2 + Sqrt[5 + 6*a + 5*a^2] +
a*(4 + Sqrt[5 + 6*a + 5*a^2]))/6]]
Out[206]//InputForm=
Experimental`OptimizedExpression[Block[{Compile`$1, Compile`$3, Compile`$4,
Compile`$5, Compile`$6}, Compile`$1 = a^2; Compile`$3 = 6*a;
Compile`$4 = 5*Compile`$1; Compile`$5 = 5 + Compile`$3 + Compile`$4;
Compile`$6 = Sqrt[Compile`$5]; (3 + 3*Compile`$1 + Compile`$6 +
a*(4 + Compile`$6))/6]]
---編集を終了2---
ダニエル・リヒトブラウ