6

ここに私の状況があります: 変数 (x、y、z など) を含む 2 つの数式があります。実行のためにシャント ヤード アルゴリズムを使用して、既にそれらをポストフィックスにコンパイルしましたが、数学的に等しいかどうかをテストする方法が必要です。

例:

x+5==5+x
x*2==x+x
4/(x/2)==8/x

私の最初の考えは、数千の異なるランダム入力を投げて、評価結果が同じかどうかを確認することです。

このアプローチで予測される問題: 精度の問題、NaN 状況、およびオーバーフローの可能性。

すべての計算は Java の double 型で行われます。

何か案は?:)

編集: これはカジュアル ゲーム用であるため、ソリューションは完璧である必要はありません。

4

3 に答える 3

5

あなたが提供した式の例では、関数を変換して、除数の最大係数を持ち、共通因数を持たない多項式を別の多項式で割ったものを生成できます。これにより、標準的な形式が得られます-違いがある場合、2つの関数は実際には異なります。ただし、ここでも係数を任意精度の有理数またはヒット精度の問題として表す必要があります。それまでに、http://en.wikipedia.orgにリストされているような基本的なコンピューター代数システムのほとんどを記述しているはずです。 /wiki/List_of_computer_algebra_systems - いくつかのフリー システムが含まれています。

于 2013-01-27T12:30:56.983 に答える
4

このトピックに関するWikipideaによると:

http://en.wikipedia.org/wiki/Symbolic_computation

「数式の等価性には 2 つの概念があります。構文上の等価性とは、式が同じように記述されている (またはコンピュータで表現されている) ことを意味する式の等価性です。些細なこととして、数学者によってめったに考慮されませんが、プログラムで簡単にテストできる唯一の等価性.

式で指数と対数が許可されている場合、数値を表す 2 つの式が意味的に等しいかどうかを判断するアルゴリズムが存在しない可能性があることが知られています。したがって、(意味的な) 等価性は、多項式や有理分数などの一部のクラスの式でのみテストできます。

2 つの式が等しいかどうかをテストするには、特定のアルゴリズムを設計する代わりに、それらを標準的な形式にするか、それらの違いを通常の形式にして、結果の構文上の同等性をテストするのが通常です。」

それがベストプラクティスのようです。

于 2013-01-27T12:26:42.123 に答える