GiNaC输出顺序

时间:2013-03-14 17:59:25

标签: c++ ginac

我正在构建一个用C ++编写的应用程序,它非常涉及代数。我决定将GiNaC用于计算机代数系统(CAS)。它工作得很好;但是有一点问题。元素的顺序不是我希望它们在输出中的方式。让我举个例子。这是我的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

当我们添加有符号数字,paranthesis或更复杂的代数表达式时,这个问题更加严重(有时甚至会写出(-3 + a)x看起来非常丑陋:-) std::cout<<GiNaC::latex 不解决问题。在我看来,最烦人的部分是输出的不稳定行为。 在GiNaC中是否有类似的可能性。我也不希望有一个非常混乱的代码(因为C ++ 0x <regex>库可以很容易地做到这一点,但我宁愿不涉及正则表达式,我的代码足够复杂)
我在Ubuntu Quantal Quetzal下使用GCC 4.7.2。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您所引用的行为已记录为here,并且它似乎不是处理此案例的任何内置功能。<​​/ p>

根据this,您需要自己实施。以下是如何完成此操作的简短示例代码。

#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;
}