そのうち大幅改訂予定
これは現在作成中のC++で多項式を簡単に扱えるようにするライブラリlibPolynomialのページです。
libPolynomialでは多項式をかなり直感的に扱うことができます。このライブラリはGPLv3で浄化されています。

サンプル

#include <iostream>
#include "polynomial.h"
 
int main()
{
	const Polynomial<int> x = Polynomial<int>::variable();
	const Polynomial<double> w = Polynomial<double>::variable();
	Polynomial<int> f = 3*(x^3)+5*(x^2)+8*x+4;
	Polynomial<double> fd = 3.0*(w^3)+5.0*(w^2)+8.0*w+4.0;
	Polynomial<int> g = 3*(x^3)+7*(x^2)+4*x+6;
	Polynomial<int> h = (x^2)+x+2;					//Output:
	cout << f.getStr() << endl;						//3x^3+5x^2+8x+4
	cout << g.getStr() << endl;						//3x^3+7x^2+4x+6
	cout << h.getStr() << endl;						//x^2+x+2
	cout << (f+g).getStr() << endl;					//6x^3+12x^2+12x+10
	cout << (f-g).getStr() << endl;					//-2x^2+4x-2
	cout << (f*g).getStr() << endl;					//9x^6+36x^5+71x^4+106x^3+90x^2+64x+24
	cout << (h^2).getStr() << endl;					//x^4+2x^3+5x^2+4x+4
	cout << (f/h).getStr() << endl;					//3x+2
	cout << (f%g).getStr() << endl;					//-2x^2+4x-2
	cout << f.diff().getStr() << endl;					//9x^2+10x+8
	cout << fd.i_integ(0).getStr() << endl;			//0.75x^4+1.66667x^3+4x^2+4x
	cout << fd.d_integ(-2,2) << endl;				//42.6667
	cout << f(5) << endl;							//544
	cout << (f == g) << endl;						//0
	cout << (f == (3*(x^3)+5*(x^2)+8*x+4)) << endl;	//1
	return 0;
}
 

現時点でできること

  • 多項式の作成
  • 多項式同士の加算・減算・乗算・除算・剰余算(+,-,*,/,%,+=,-=,*=,/=,%=が使えます)
  • 多項式の自然数乗(^,^=が使えます 演算子の優先順位に注意)
  • 多項式と定数の加算・減算・乗算、多項式を定数で割る除算(+,-,*,/,%,+=,-=,*=,/=,%=が使えます)
  • 定数で割ってモニック化(toMonique()メソッド)
  • 微分(diff()メソッド)
  • 不定積分(i_integ()メソッド)、定積分(d_integ()メソッド)
  • 具体値の代入
  • 多項式同士の等価比較
  • 多項式のコピー
  • 文字列表現の作成(getStr()メソッド)

今後やりたいこと

  • constexpr化
  • 動作の高速化
  • 文字列→多項式の変換
  • 入出力ストリームへの対応
  • 複数変数多項式への完全対応

使い方

Polynomial<T> poly;
 
係数及び変数の型がTとなります。TをPolynomialクラスにすると複数変数の多項式になりますが、現時点ではgetStr()メソッドが使えません。
Tは少なくともint(およびchar,short,long,long long)、float(およびdouble,long double)であれば問題なく使えるはずです(ただしオーバーフロー等には注意)。整数倍ができて加算、乗算が可換で加減乗除が出来る型ならばとりあえず計算はできるはずです。

変数を用いた初期化

これが一番直感的な初期化方法です。
variable()メソッドは一次の係数が1、定数項0の一次式を返します。これを適当な文字で置くと使いやすくなります。
const Polynomial<int> x = Polynomial<int>::variable();
Polynomial<int> f = 3*(x^3)+5*(x^2)+8*x+4;
 
注意
^演算子の優先順位は+より低いので、()で囲わないと正しい結果が得られません。

vectorを用いた初期化

こちらのほうが高速に処理でき、大量のデータを扱うのにも便利です。
vector<int> ary(4);
ary[0] = 4;
ary[1] = 8;
ary[2] = 5;
ary[3] = 3;
Polynomial<int> f = Polynomial(ary);
 
ary[i]がi次の係数になります。

単項式

bx^aの形の単項式はPolynomial<T>::monomial(int a,T b)で得られます。

微積分

poly.diff()でpolyを微分した多項式が得られます。
poly.i_integ(T c)でpolyの原始関数のうち、定数項がcのものを得られます。
poly.d_integ(T start,T end)で\scriptstyle{\int_{start}^{end}{\rm poly}(x) dx}を計算できます。(Tが実数の範囲にない場合正しく動作するかはわかりません)

モニック化

定数で割ってモニック(最高時の係数が1)にした多項式はtoMonique()メソッドで得られます。

ソースコードは?

githubに上げました→
polynomial.h
サンプル
test.cpp
GMP多倍長演算ライブラリを利用したAKS素数判定法の実装例
aks.cpp

ここに質問を書き込むとそのうち答えが掲載されるかも
名前:
コメント:
最終更新:2013年05月19日 23:58