2013-03-14 36 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; 
}