algebra/algebraic-parser-ja.html

# Algebra::AlgebraicParser

(文字列の代数的評価クラス)

## ファイル名:

- algebraic-parser.rb

## スーパークラス:

- Object

## インクルードしているモジュール:

なし

## クラスメソッド:

`Algebra::AlgebraicParser.eval(string, ring)`
  string の四則演算式を ring 上で計算します。

## メソッド:

なし

## 仕様

### 評価の手順

変数の値は、その変数名を引数として ring のクラスメソ ッド indeterminate の引数として渡され、その戻り値 として評価されます。また数値は ring.ground のクラス メソッド indterminate で評価されます。

    require "algebraic-parser"
    class A
      def self.indeterminate(str)
        case str
        when "x"; 7
        when "y"; 11
        end
      end
      def A.ground
        Integer
      end
    end
    p Algebraic::AlgebraicParser.eval("x * y - x^2 + x/8", A)
        #=> 7*11 - 7**2 + 7/8 = 28

ここで、Integer の indeterminate は algebraic-parser.rb が require している algebra-supplement.rb で次のように定義されています。

    def Integer.indeterminate(x)
      eval(x)
    end

### 識別子

識別子は、「英字1文字＋数字0文字以上」で定義されます。したがって

    "a13bc04def0"

は、

    "a13 * b * c04 * d * e * f0"

と解釈されます。

### 演算子

演算子を結合の弱い順に並べます。

    ;       中間評価
    +, -    和, 差
    +, -    単項 +, 単項 -
    *, /    積, 商
    並置    積
    **, ^   冪

### 用例

クラス Algebra::Polynomial、クラス Algebra::MPolynomial には適 切に indeterminate, ground が定義されています。したがって次のように文字列評価ができます。

    require "algebraic-parser"
    require "rational"
    require "m-polynomial"
    F = Algebra::MPolynomial(Rational)
    p Algebra::AlgebraicParser.eval("- (2*y)**3 + x", F) #=> -8y^3 + x

Algebra::MPolynomial では、indeterminate は変数を表現するオブジェ クトの登録も行うので、登録順が変数間の順序になります。したがって ; を 使って先に変数を評価させる事によって、順序の変更をする事ができます。

    F.variables.clear
    p Algebra::AlgebraicParser.eval("x; y; - (2*y)**3 + x", F) #=> x - 8y^3