1

我正在构建一个用 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

当我们添加有符号数、括号或更复杂的代数表达式时,这个问题会更加严重(它有时甚至会写成 (-3+a)x,看起来很丑 :-)std::cout<<GiNaC::latex 并不能解决问题。在我看来,最烦人的部分是输出的不稳定行为。
在 GiNaC 中是否可能发生类似的事情。我也不想有一个非常混乱的代码(因为 C++0x<regex>库可以很容易地做到这一点,但我宁愿不涉及正则表达式,我的代码已经足够复杂了)
我在 Ubuntu Quantal Quetzal 下使用 GCC 4.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 回答