Common Library  0.9.5
tadah_fussy::math_lib 名前空間

数学関数用名前空間 [詳解]

名前空間

 diff_method
 差分法名前空間
 
 eigen_lib
 固有値計算関数用名前空間
 
 polynomial
 多項式定義用名前空間
 
 solver
 連立方程式・最適化問題の解法用名前空間
 

データ構造

class  SumOp
 二つの値の和を計算するための関数オブジェクト [詳解]
 
class  SumOp< std::pair< T, U > >
 二つの値の和を計算するための関数オブジェクト( std::pair用 ) [詳解]
 
class  KahanSumOp
 Kahanの加算アルゴリズムを使って和を計算するための関数オブジェクト [詳解]
 
class  KahanSumOp< std::pair< T, U > >
 Kahanの加算アルゴリズムを使って和を計算するための関数オブジェクト(std::pair用) [詳解]
 
class  AddBinder
 単項関数で値を処理してから加算するための関数オブジェクト [詳解]
 
class  OpBinder
 単項関数と二項関数の組み合わせにより値を処理するための関数オブジェクト [詳解]
 

関数

template<class U >
Pow (const U &t, const U &n)
 t の n 乗を計算する関数 [詳解]
 
template<class U >
PowerRoot (const U &c, const U &e)
 c の e 乗根の近似値を求める [詳解]
 
template<class U >
ModularPower (const U &a, U k, const U &n)
 繰り返し自乗法を使った法 n のべき乗計算( a の k 乗を n で割った余りを求める ) [詳解]
 
template<class U >
GCD (U a, U b)
 ユークリッドの互除法を使った最大公約数の計算 [詳解]
 
template<class U >
int8_t Jacobi (U a, U p)
 ヤコビ記号を求める [詳解]
 
template<class T >
Pi ()
 円周率を返す関数 [詳解]
 
template<class Res , class I >
Res AccuratePermutation (I n, I r)
 順列 ( n 個の要素から r 個を並べる場合の数 ) の計算 [詳解]
 
template<class T >
Permutation (T n, T r)
 順列 ( n 個の要素から r 個を並べる場合の数 ) の計算 [詳解]
 
template<class Res , class In >
Res AccurateMultiCoef (In s, In e)
 m 個のグループからそれぞれ k[1] 〜 k[m] 個ずつ合計 n 個並べる場合の数(多項係数)を求める [詳解]
 
template<class Res , class In >
Res MultiCoef (In s, In e)
 m 個のグループからそれぞれ k[1] 〜 k[m] 個ずつ合計 n 個並べる場合の数(多項係数)を求める [詳解]
 
template<class Res , class T >
Res AccurateCombination (T n, T r)
 組み合わせ ( n 個の要素から r 個を選ぶ場合の数 ) の計算 [詳解]
 
template<class D , class I >
BinCoef (D a, I r)
 一般の二項係数の計算 [詳解]
 
template<class Res , class I >
Res AccurateBernoulliNum (I n)
 ベルヌーイ数 Bn を求める [詳解]
 
template<class Res , class I >
Res BernoulliNum (I n)
 ベルヌーイ数 Bn を求める [詳解]
 
template<class Op >
AddBinder< Op > OpBind (Op op)
 処理用単項関数から AddBinder 関数オブジェクトを生成する [詳解]
 
template<class Res , class UnOp , class BinOp >
OpBinder< Res, UnOp, BinOp > OpBind (UnOp unOp, BinOp binOp)
 処理用単項関数と二項関数から OpBinder 関数オブジェクトを生成する [詳解]
 
template<class Res , class In >
Res Sum (In s, In e)
 データ列の s から e の直前までの範囲の総和を求める [詳解]
 
template<class Res , class In , class SUM_Op >
Res Sum (In s, In e, SUM_Op sumOp)
 データ列の s から e の直前までの範囲の総和を求める [詳解]
 
template<class Res , class Container >
Res SumAll (const Container &c)
 全データの総和を求める [詳解]
 
template<class Res , class Container , class SUM_Op >
Res SumAll (const Container &c, SUM_Op sumOp)
 全データの総和を求める [詳解]
 
template<class In >
bool Normalize (In s, In e)
 データ列の s から e の直前までの範囲を正規化する [詳解]
 

詳解

数学関数用名前空間

関数詳解

◆ Pow()

template<class U >
U tadah_fussy::math_lib::Pow ( const U &  t,
const U &  n 
)

t の n 乗を計算する関数

テンプレート引数の U は、乗法・除法・減算・剰余・等号演算子が使える型である必要がある。 剰余演算子を使うため、整数型であることを前提としている。

0 の 0 乗は 0 ではなく 1 を返す。

  • べき数が負数の場合は例外 tadah_fussy::exception::NegativeNumber< U > を投げる。
引数
tべき乗される数
nべき数
戻り値
計算結果

◆ PowerRoot()

template<class U >
U tadah_fussy::math_lib::PowerRoot ( const U &  c,
const U &  e 
)

c の e 乗根の近似値を求める

ニュートン-ラフソン法を利用したべき乗根算出ルーチン。 c は符号なし整数であることを前提とし、c の e 乗根を超えない最大数を返す。 但し、e が U() の場合は U() を返す。

引数
cべき乗根を求める対象の数
eべき数
戻り値
c の e 乗根

◆ ModularPower()

template<class U >
U tadah_fussy::math_lib::ModularPower ( const U &  a,
k,
const U &  n 
)

繰り返し自乗法を使った法 n のべき乗計算( a の k 乗を n で割った余りを求める )

テンプレート引数の U は、乗法・剰余・ビットシフト・AND・比較演算子が使える型である必要がある。 剰余演算子やビットシフトなどを使うため、符号なし整数型であることを前提としている。

  • 底 a や法 n が 0 の場合は 0 を返す。
  • 指数が 0 の場合は法 n における 1 を返す。
引数
a
k指数
n
戻り値
べき乗

◆ GCD()

template<class U >
U tadah_fussy::math_lib::GCD ( a,
b 
)

ユークリッドの互除法を使った最大公約数の計算

テンプレート引数の U は、剰余・比較演算子が使える型である必要がある。 剰余演算子を使うため、符号なし整数型であることを前提としている。

  • いずれかがゼロの場合、もう一方の数をそのまま返す。
引数
a,b最大公約数を求める二つの自然数
戻り値
最大公約数

◆ Jacobi()

template<class U >
int8_t tadah_fussy::math_lib::Jacobi ( a,
p 
)

ヤコビ記号を求める

a が p を法として 0 でない数の平方数と合同になるとき、a を「p を法とした平方剰余」という。

a が p を法として平方剰余(1)か平方非剰余(-1)かを判定する。この判定値を「ヤコビ記号」という。 但し、次の場合は 0 を返す。

  • a と p が互いに素でない場合
  • p が 3 以上の奇数でない場合
引数
a判定対象の数
p
戻り値
1 ... 平方剰余 ; -1 ... 平方非剰余 ; 0 ... GCD(a,p) != 1

◆ Pi()

template<class T >
T tadah_fussy::math_lib::Pi ( )

円周率を返す関数

定数 M_PI(double/float用) と M_PIl(long double用) を返す。明示的にテンプレート引数を記述する必要がある。

戻り値
円周率

◆ AccuratePermutation()

template<class Res , class I >
Res tadah_fussy::math_lib::AccuratePermutation ( n,
r 
)

順列 ( n 個の要素から r 個を並べる場合の数 ) の計算

nPr = n! / ( n - r )! = n( n - 1 )...( n - r + 1 ) を正確に計算する。 計算可能な範囲は戻り値の型 Res に依存し、Res の取りうる値の範囲を超えた場合は正しい結果は得られない。 テンプレート引数 Res は明示的に記述する必要があることに注意。

  • n < r または r < 0 ならゼロを返す。
引数
n全要素数
r並べる要素の数
戻り値
順列の計算結果(n < r または r < 0 ならゼロ)

◆ Permutation()

template<class T >
T tadah_fussy::math_lib::Permutation ( n,
r 
)

順列 ( n 個の要素から r 個を並べる場合の数 ) の計算

nPr = n! / ( n - r )! = n( n - 1 )...( n - r + 1 ) の近似値を計算する。

  • n < r または r < 0 ならゼロを返す。
引数
n全要素数
r並べる要素の数
戻り値
順列の計算結果(n < r または r < 0 ならゼロ)

◆ AccurateMultiCoef()

template<class Res , class In >
Res tadah_fussy::math_lib::AccurateMultiCoef ( In  s,
In  e 
)

m 個のグループからそれぞれ k[1] 〜 k[m] 個ずつ合計 n 個並べる場合の数(多項係数)を求める

n! / k[1]!k[2]!...k[m]! を正確に計算する。但し、n は k[1] から k[m] までの数の和を意味する。 これは多項定理における項 Πi( x^k[i] ) の係数を表す。 計算可能な範囲は戻り値の型 Res に依存し、Res の取りうる値の範囲を超えた場合は正しい結果は得られない。

k[1] から k[m] の中に一つでも負数があった場合はゼロを返す。

引数
s各グループの要素数からなる配列の開始位置
e各グループの要素数からなる配列の末尾の次の位置
戻り値
多項係数の計算結果(要素数に負数が含まれていた場合はゼロ)

◆ MultiCoef()

template<class Res , class In >
Res tadah_fussy::math_lib::MultiCoef ( In  s,
In  e 
)

m 個のグループからそれぞれ k[1] 〜 k[m] 個ずつ合計 n 個並べる場合の数(多項係数)を求める

n! / k[1]!k[2]!...k[m]! の近似値を計算する。但し、n は k[1] から k[m] までの数の和を意味する。 これは多項定理における項 Πi( x^k[i] ) の係数を表す。 計算可能な範囲は戻り値の型 Res に依存し、Res の取りうる値の範囲を超えた場合は正しい結果は得られない。

  • k[1] から k[m] の中に一つでも負数があった場合はゼロを返す。
引数
s各グループの要素数からなる配列の開始位置
e各グループの要素数からなる配列の末尾の次の位置
戻り値
多項係数の計算結果(要素数に負数が含まれていた場合はゼロ)

◆ AccurateCombination()

template<class Res , class T >
Res tadah_fussy::math_lib::AccurateCombination ( n,
r 
)

組み合わせ ( n 個の要素から r 個を選ぶ場合の数 ) の計算

nCr = n! / r!( n - r )! を正確に計算する。 計算可能な範囲は戻り値の型 Res に依存し、Res の取りうる値の範囲を超えた場合は正しい結果は得られない。

  • n < r ならゼロを返す。
  • r < 0 ならゼロを返す。
引数
n要素数
r要素から選択する数
戻り値
組み合わせの計算結果

◆ BinCoef()

template<class D , class I >
D tadah_fussy::math_lib::BinCoef ( a,
r 
)

一般の二項係数の計算

C( a, r ) = Γ( a + 1 ) / Γ( r + 1 )Γ( a - r + 1 ) を近似的に計算する。このとき、

( 1 + x )^a = 1 + C( a, 1 )x + C( a, 2 )x^2 + ... + C( a, r )x^r + ...

が成り立つ。

  • r < 0 ならゼロを返す。
  • a + 1 <= r ならゼロを返す
引数
a指数部
r次数
戻り値
二項係数の計算結果

◆ AccurateBernoulliNum()

template<class Res , class I >
Res tadah_fussy::math_lib::AccurateBernoulliNum ( n)

ベルヌーイ数 Bn を求める

ベルヌーイ数の計算に利用する組み合わせ(二項係数)は math_lib::AccurateCombination を使って正確に求めている。

引数
n何番目のベルヌーイ数か?
戻り値
ベルヌーイ数 Bn

◆ BernoulliNum()

template<class Res , class I >
Res tadah_fussy::math_lib::BernoulliNum ( n)

ベルヌーイ数 Bn を求める

ベルヌーイ数の計算に利用する組み合わせ(二項係数)は math_lib::BinCoef を使って近似的に求めている。

引数
n何番目のベルヌーイ数か?
戻り値
ベルヌーイ数 Bn

◆ OpBind() [1/2]

template<class Op >
AddBinder< Op > tadah_fussy::math_lib::OpBind ( Op  op)

処理用単項関数から AddBinder 関数オブジェクトを生成する

引数
op処理用単項関数
戻り値
AddBinder 関数オブジェクト

◆ OpBind() [2/2]

template<class Res , class UnOp , class BinOp >
OpBinder< Res, UnOp, BinOp > tadah_fussy::math_lib::OpBind ( UnOp  unOp,
BinOp  binOp 
)

処理用単項関数と二項関数から OpBinder 関数オブジェクトを生成する

AddBinder の場合と異なり、戻り値の Res を明示する必要があることに注意

引数
unOp処理用単項関数
binOp二項関数
戻り値
OpBinder 関数オブジェクト

◆ Sum() [1/2]

template<class Res , class In >
Res tadah_fussy::math_lib::Sum ( In  s,
In  e 
)

データ列の s から e の直前までの範囲の総和を求める

テンプレート引数の In はデータ列の反復子の型を表す。 処理内容としては、初期値をゼロとして std::accumulate を呼び出すだけである。

return std::accumulate( s, e, Res() );

初期値を渡さないため、Sum< Res >( ... ) のように戻り値の型を明示する必要があることに注意。

  • s, e からデータ列の長さを調べ、長さが負数となっている場合は例外 tadah_fussy::exception::NegativeLength< std::iterator_traits< In >::difference_type > を投げる。
引数
s対象のデータ列の開始反復子
e対象のデータ列の末尾の次の反復子
戻り値
求めた総和

◆ Sum() [2/2]

template<class Res , class In , class SUM_Op >
Res tadah_fussy::math_lib::Sum ( In  s,
In  e,
SUM_Op  sumOp 
)

データ列の s から e の直前までの範囲の総和を求める

テンプレート引数の In はデータ列の反復子、SUM_Op は総和計算用の二項関数オブジェクトの型をそれぞれ表す。 処理内容としては、初期値をゼロとして std::accumulate を呼び出すだけである。

return std::accumulate( s, e, Res(), sumOp );

初期値を渡さないため、Sum< Res >( ... ) のように戻り値の型を明示する必要があることに注意。

  • s, e からデータ列の長さを調べ、長さが負数となっている場合は例外 tadah_fussy::exception::NegativeLength< std::iterator_traits< In >::difference_type > を投げる。
引数
s対象のデータ列の開始反復子
e対象のデータ列の末尾の次の反復子
sumOp和の二項計算用関数オブジェクト
戻り値
求めた総和

◆ SumAll() [1/2]

template<class Res , class Container >
Res tadah_fussy::math_lib::SumAll ( const Container &  c)

全データの総和を求める

テンプレート引数の Container はデータ列の型を表す。

初期値を渡さないため、SumAll< Res >( ... ) のように戻り値の型を明示する必要があることに注意。

引数
c対象のデータ列への参照
戻り値
求めた総和

◆ SumAll() [2/2]

template<class Res , class Container , class SUM_Op >
Res tadah_fussy::math_lib::SumAll ( const Container &  c,
SUM_Op  sumOp 
)

全データの総和を求める

テンプレート引数の Container はデータ列、SUM_Op は総和計算用の二項関数オブジェクトの型をそれぞれ表す。

初期値を渡さないため、SumAll< Res >( ... ) のように戻り値の型を明示する必要があることに注意。

引数
c対象のデータ列への参照
sumOp和の二項計算用関数オブジェクト
戻り値
求めた総和

◆ Normalize()

template<class In >
bool tadah_fussy::math_lib::Normalize ( In  s,
In  e 
)

データ列の s から e の直前までの範囲を正規化する

テンプレート引数の In はデータ列の反復子の型を表す。

データ列のユークリッド・ノルムを 1 にする正規化であり、平均ゼロ・標準偏差 1 とする正規化とは異なる。 後者の正規化は Statistics::Normalize を参照。

  • s, e からデータ列の長さを調べ、長さが負数となっている場合は例外 tadah_fussy::exception::NegativeLength< std::iterator_traits< In >::difference_type > を投げる。
引数
s対象のデータ列の開始反復子
e対象のデータ列の末尾の次の反復子
戻り値
ユークリッド・ノルムがゼロの場合は false を返す (正規化は行われない)