1

私はC++で書かれたアプリケーションを構築していますが、これには代数が多く含まれています。数式処理システム(CAS)にGiNaCを使用することにしました。これは完全に機能しています。ただし、少し問題があります。要素の順序は、出力に含める方法ではありません。例を挙げましょう。これは私のC++コードです:

#include <iostream>
#include <ginac/ginac.h>

int main()
{
    using namespace GiNaC;
    symbol x("x");
    ex poly((x^2)+3*x+5);

    std::cout << poly;
}

このプログラムの出力は次のとおりです。

5+x^2+3*x

さて、これは一定ではないことを検出しました。出力も次のようになります。

5+3*x+x^2

どちらも数学的に正しいのですが、私が望む(または多分私が必要とする:-)形式はどちらでもありません。多項式を最大の次数で開始する必要があります。つまり、出力は次のようになります。

x^2+3*x+5

この問題は、符号付き数値、パランセシス、またはより複雑な代数式を追加するとさらに悪化します(非常に醜いように見える(-3 + a)xと書くことさえあります:-) std::cout<<GiNaC::latex 。そして、私の見解では、最も厄介な部分は、出力の不安定な動作です。
GiNaCで可能なことのようなものです。また、本当に厄介なコードは必要ありません(C ++ 0x<regex>ライブラリはこれを簡単に実行できるためですが、正規表現を使用したくないため、コードは十分に複雑です)
UbuntuQuantalQuetzalでGCC4.7.2を使用しています。ご協力ありがとうございました。

4

1 に答える 1

2

あなたが参照している振る舞いはここに文書化されており、このケースを処理するための組み込み機能ではないようです。

これによると、これを自分で実装する必要があります。以下は、これを行う方法の短いサンプルコードです。

#include <iostream>
#include <vector>
#include <algorithm>
#include <ginac/ginac.h>

int main()
{
    using namespace GiNaC;
    symbol x("x");
    ex poly(-3*x-5+power(x,2));

    std::vector<ex> terms(poly.begin(), poly.end());
    std::sort(std::begin(terms), std::end(terms), 
        [x](const ex& lhs, const ex& rhs) { return lhs.degree(x)>rhs.degree(x); });

    bool first{ true };
    for(auto term : terms) {
        if( first ) first = false;
        else if( term.coeff(term)>0) std::cout << '+' ;

        std::cout << term;
    }

    std::cout << std::endl;
}
于 2013-03-14T20:18:36.180 に答える