KrisLibrary  1.0.0
polynomial.h
1 #ifndef MATH_POLYNOMIAL_H
2 #define MATH_POLYNOMIAL_H
3 
4 #include "misc.h"
5 
6 namespace Math {
7 
8 namespace Polynomial {
9 
10 //alias for x^i
11 template <class T>
12 inline T BasisTerm(const T x, int i) { return IntegerPower(x,i); }
13 
14 //kth derivative of x^i
15 template <class T>
16 T BasisTerm_Dk(const T x, int i,int k)
17 {
18  if(k>i) return 0;
19  return (T)FactorialTruncated(i,k)*BasisTerm(x,i-k);
20 }
21 
22 //fills in p[i] with x^i, p must have size degree+1
23 template <class T>
24 void Basis(const T x, int degree, T p[])
25 {
26  p[0]=(T)1;
27  for(int i=1;i<=degree;i++) p[i]=x*p[i-1];
28 }
29 
30 //fills in p[i] with kth derivative of x^i, p must have size degree+1
31 template <class T>
32 void Basis_Dx(const T x, int degree, T p[])
33 {
34  Basis(x,degree,p);
35  for(int i=degree;i>=1;i--) p[i]=Real(i)*x*p[i-1];
36  p[0]=0;
37 }
38 
39 template <class T>
40 void Basis_DDx(const T x, int degree, T p[])
41 {
42  Basis(x,degree,p);
43  for(int i=degree;i>=2;i--) p[i]=Real(i*(i-1))*x*p[i-2];
44  p[0]=0; if(degree<1) return;
45  p[1]=0;
46 }
47 
48 //The kth derivative of the basis
49 template <class T>
50 void Basis_Dkx(const T x, int degree, T p[], int k)
51 {
52  Basis(x,degree,p);
53  for(int i=degree;i>=k;i--) p[i]=Real(FactorialTruncated(i,k))*x*p[i-k];
54  int end=(k<degree?k:degree);
55  for(int i=0;i<end;i++) p[i]=0;
56 }
57 
58 
59 } //namespace Polynomial
60 } //namespace Math
61 #endif
Miscellaneous math functions.
T IntegerPower(const T x, int i)
Calculates x^i where i is an integer (in O(log i) time)
Definition: misc.h:94
unsigned int FactorialTruncated(unsigned int n, unsigned int k)
Returns n!/(n-k)! in O(k) time.
Definition: misc.h:114
Contains all definitions in the Math package.
Definition: WorkspaceBound.h:12