43#ifndef LASS_GUARDIAN_OF_INCLUSION_NUM_POLYNOMIAL_INL
44#define LASS_GUARDIAN_OF_INCLUSION_NUM_POLYNOMIAL_INL
57Polynomial<T>::Polynomial()
63Polynomial<T>::Polynomial(
TParam iScalar):
71Polynomial<T>::Polynomial(
const TCoefficients& iCoefficients):
78template <
typename InputIterator>
79Polynomial<T>::Polynomial(InputIterator iBegin, InputIterator iEnd):
86template <
typename T>
inline
87const typename Polynomial<T>::TCoefficients&
88Polynomial<T>::coefficients()
const
95template <
typename T>
inline
96const typename Polynomial<T>::TValue
97Polynomial<T>::operator[](
size_t iIndex)
const
99 LASS_ASSERT(iIndex < a_.size());
105template <
typename T>
inline
106const typename Polynomial<T>::TValue
107Polynomial<T>::at(
size_t iIndex)
const
109 return iIndex < a_.size() ? a_[iIndex] : TNumTraits::zero;
115const typename Polynomial<T>::TValue
116Polynomial<T>::operator()(TParam iX)
const
118 TValue result = TNumTraits::zero;
119 TValue x = TNumTraits::one;
120 const size_t n = a_.size();
121 for (
size_t i = 0; i < n; ++i)
132const Polynomial<T>& Polynomial<T>::operator+()
const
140const Polynomial<T> Polynomial<T>::operator-()
const
142 const size_t n = a_.size();
143 TCoefficients result(n);
144 for (
size_t i = 0; i < n; ++i)
148 return Polynomial<T>(result);
154Polynomial<T>& Polynomial<T>::operator+=(
const Polynomial<T>& iOther)
156 const size_t n = iOther.a_.size();
159 a_.resize(n, TNumTraits::zero);
161 for (
size_t i = 0; i < n; ++i)
163 a_[i] += iOther.a_[i];
171Polynomial<T>& Polynomial<T>::operator-=(
const Polynomial<T>& iOther)
173 const size_t n = iOther.a_.size();
176 a_.resize(n, TNumTraits::zero);
178 for (
size_t i = 0; i < n; ++i)
180 a_[i] -= iOther.a_[i];
188Polynomial<T>& Polynomial<T>::operator*=(
const Polynomial<T>& iOther)
190 const size_t m = a_.size();
191 const size_t n = iOther.a_.size();
192 TCoefficients result(m + n - 1, TNumTraits::zero);
193 for (
size_t i = 0; i < m; ++i)
195 const TValue a = a_[i];
196 for (
size_t k = 0; k < n; ++k)
198 result[i + k] += a * iOther.a_[k];
208Polynomial<T>& Polynomial<T>::operator+=(TParam iScalar)
212 a_.resize(1, iScalar);
224Polynomial<T>& Polynomial<T>::operator-=(TParam iScalar)
228 a_.resize(1, -iScalar);
240Polynomial<T>& Polynomial<T>::operator*=(TParam iScalar)
242 const size_t n = a_.size();
243 for (
size_t i = 0; i < n; ++i)
253Polynomial<T>& Polynomial<T>::operator/=(TParam iScalar)
255 const size_t n = a_.size();
256 for (
size_t i = 0; i < n; ++i)
266Polynomial<T> Polynomial<T>::derivative()
const
268 const size_t n = a_.size();
271 return Polynomial<T>();
273 TCoefficients result(n - 1);
274 for (
size_t i = 1; i < n; ++i)
276 result[i - 1] =
static_cast<typename TNumTraits::baseType
>(i) * a_[i];
278 return Polynomial<T>(result);
284Polynomial<T> Polynomial<T>::integral()
const
286 const size_t n = a_.size();
289 return Polynomial<T>();
291 TCoefficients result(n + 1);
292 result[0] = TNumTraits::zero;
293 for (
size_t i = 0; i < n; ++i)
295 result[i + 1] = a_[i] /
static_cast<typename TNumTraits::baseType
>(i);
297 return Polynomial<T>(result);
303Polynomial<T> Polynomial<T>::pow(
size_t iPower)
const
305 Polynomial<T> result(1);
306 for (
size_t i = 0; i < iPower; ++i)
350 static Polynomial<T> result(1);
361 static TValue coefficients[2] = { 0, 1 };
362 static Polynomial<T> result(coefficients, coefficients + 2);
373 typedef typename Polynomial<T>::TCoefficients TCoefficients;
374 const TCoefficients& a = iA.coefficients();
375 const TCoefficients& b = iB.coefficients();
376 const size_t m = a.size();
377 const size_t n = b.size();
382 for (
size_t i = 0; i < n; ++i)
394template <
typename T>
inline
395bool operator!=(
const Polynomial<T>& iA,
const Polynomial<T>& iB)
402template <
typename T>
inline
403Polynomial<T> operator+(
const Polynomial<T>& iA,
const Polynomial<T>& iB)
405 Polynomial<T> result(iA);
412template <
typename T>
inline
413Polynomial<T> operator-(
const Polynomial<T>& iA,
const Polynomial<T>& iB)
415 Polynomial<T> result(iA);
422template <
typename T>
inline
423Polynomial<T> operator*(
const Polynomial<T>& iA,
const Polynomial<T>& iB)
425 Polynomial<T> result(iA);
432template <
typename T>
inline
433Polynomial<T> operator+(
const T& iA,
const Polynomial<T>& iB)
435 Polynomial<T> result(iB);
442template <
typename T>
inline
443Polynomial<T> operator-(
const T& iA,
const Polynomial<T>& iB)
445 Polynomial<T> result(-iB);
452template <
typename T>
inline
453Polynomial<T> operator*(
const T& iA,
const Polynomial<T>& iB)
455 Polynomial<T> result(iB);
462template <
typename T>
inline
463Polynomial<T> operator+(
const Polynomial<T>& iA,
const T& iB)
465 Polynomial<T> result(iA);
472template <
typename T>
inline
473Polynomial<T> operator-(
const Polynomial<T>& iA,
const T& iB)
475 Polynomial<T> result(iA);
482template <
typename T>
inline
483Polynomial<T> operator*(
const Polynomial<T>& iA,
const T& iB)
485 Polynomial<T> result(iA);
492template <
typename T>
inline
493Polynomial<T> operator/(
const Polynomial<T>& iA,
const T& iB)
495 Polynomial<T> result(iA);
502template <
typename T,
typename Char,
typename Traits>
503std::basic_ostream<Char, Traits>&
504operator<<(std::basic_ostream<Char, Traits>& iS,
const Polynomial<T>& iA)
506 typedef typename Polynomial<T>::TCoefficients TCoefficients;
507 const TCoefficients& a = iA.coefficients();
508 const size_t n = a.size();
515 for (
size_t i = 1; i < n; ++i)
517 iS <<
" + " << a[i] <<
"x^" <<
static_cast<unsigned long>(i);
an univariate polynomial.
const const_iterator end() const
return iterator to last (highest) coefficient
static Polynomial< T > x()
return linear polynomial x
static Polynomial< T > one()
return constant polynomial 1
const size_type size() const
return size of coefficients.
const const_iterator begin() const
return iterator to first (lowest) coefficient
numeric types and traits.
Library for Assembled Shared Sources.