2013-03-14 39 views
0

我正在构建一个用C++编写的应用程序,它涉及代数。我决定将GiNaC用于计算机代数系统(CAS),它工作正常;但是有一个小问题。元素的顺序不是我希望它们输出的方式。让我举个例子。这是我的C++代码:GiNaC输出的顺序

这一计划的
#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>库可以很容易地做到这一点,但我宁愿不涉及正则表达式,我的代码也足够复杂)
我使用GCC 4.7.2 Ubuntu Quantal Quetzal。感谢您的帮助。

回答

1

你所指的行为记录在here,它似乎没有任何内置的功能来处理这种情况。

根据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; 
}