我正在构建一个用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。谢谢你的帮助。
答案 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;
}