added first version of Interpolate functor + tests

TODO: operator for iterator range, documentation
This commit is contained in:
Michael Hemmer 2008-01-13 16:21:29 +00:00
parent 17ad244833
commit bb0bd09446
2 changed files with 104 additions and 38 deletions

View File

@ -16,11 +16,12 @@
#include <CGAL/basic.h> #include <CGAL/basic.h>
#include <CGAL/Polynomial/polynomial_utils.h> #include <CGAL/Polynomial/polynomial_utils.h>
#include <CGAL/Polynomial/resultant.h> #include <CGAL/Polynomial/resultant.h>
#include <CGAL/Polynomial/square_free_factorization.h> #include <CGAL/Polynomial/square_free_factorization.h>
#include <CGAL/extended_euclidean_algorithm.h>
#define CGAL_POLYNOMIAL_TRAITS_D_BASE_TYPEDEFS \ #define CGAL_POLYNOMIAL_TRAITS_D_BASE_TYPEDEFS \
typedef Polynomial_traits_d< Polynomial< Coefficient_ > > PT; \ typedef Polynomial_traits_d< Polynomial< Coefficient_ > > PT; \
typedef Polynomial_traits_d< Coefficient_ > PTC; \ typedef Polynomial_traits_d< Coefficient_ > PTC; \
@ -77,6 +78,7 @@ template< class Coefficient_, class ICoeffAlgebraicCategory >
class Polynomial_traits_d_base_icoeff_algebraic_category { class Polynomial_traits_d_base_icoeff_algebraic_category {
public: public:
typedef Null_functor Multivariate_content; typedef Null_functor Multivariate_content;
typedef Null_functor Interpolate;
}; };
// Specializations // Specializations
@ -117,6 +119,7 @@ class Polynomial_traits_d_base_icoeff_algebraic_category<
return content; return content;
} }
}; };
}; };
template< class Coefficient_ > template< class Coefficient_ >
@ -146,6 +149,52 @@ class Polynomial_traits_d_base_icoeff_algebraic_category<
return Innermost_coefficient(1); return Innermost_coefficient(1);
} }
}; };
struct Interpolate{
typedef Polynomial<Innermost_coefficient> Polynomial_1;
void operator() (
const Polynomial_1& m1, const Polynomial_d& u1,
const Polynomial_1& m2, const Polynomial_d& u2,
Polynomial_1& m, Polynomial_d& u) const {
Polynomial_1 s,t;
CGAL::extended_euclidean_algorithm(m1,m2,s,t);
m = m1 * m2;
this->operator()(m1,m2,m,s,t,u1,u2,u);
}
void operator() (
const Polynomial_1& m1, const Polynomial_1& m2, const Polynomial_1& m,
const Polynomial_1& s, const Polynomial_1& t,
Polynomial_d u1, Polynomial_d u2,
Polynomial_d& u) const {
#ifndef NDEBUG
Polynomial_1 tmp,s_,t_;
tmp = CGAL::extended_euclidean_algorithm(m1,m2,s_,t_);
CGAL_precondition(tmp == Polynomial_1(1));
CGAL_precondition(s_ == s);
CGAL_precondition(t_ == t);
#endif
typename CGAL::Coercion_traits<Polynomial_1,Polynomial_d>::Cast cast;
typename Polynomial_traits_d<Polynomial_1>::Canonicalize canonicalize;
typename Polynomial_traits_d<Polynomial_d>::Pseudo_division_remainder
pseudo_remainder;
CGAL_precondition(u1.degree() < m1.degree() || u1.is_zero());
CGAL_precondition(u2.degree() < m2.degree() || u2.is_zero());
if(m1.degree() < m2.degree()){
Polynomial_d v = pseudo_remainder(cast(s)*(u2-u1),cast(canonicalize(m2)));
u = cast(m1)*v + u1;
}
else{
Polynomial_d v = pseudo_remainder(cast(t)*(u1-u2),cast(canonicalize(m1)));
u = cast(m2)*v + u2;
}
}
};
}; };
template< class Coefficient_ > template< class Coefficient_ >

View File

@ -13,7 +13,6 @@
#include <CGAL/_test_basic.h> #include <CGAL/_test_basic.h>
#include <CGAL/Random.h> #include <CGAL/Random.h>
static CGAL::Random my_rnd(346); // some seed static CGAL::Random my_rnd(346); // some seed
@ -84,40 +83,6 @@ generate_sparse_random_polynomial(int max_degree = 10){
return result; return result;
} }
void print_monom(std::vector<int> ev){
if(ev.size() >= 1)
if (ev[0] != 0)
if (ev[0] == 1)
std::cout << "x";
else
std::cout << "x^" << ev[0];
if(ev.size() >= 2)
if (ev[0] != 0)
if (ev[0] == 1)
std::cout << "y";
else
std::cout << "y^" << ev[1];
if(ev.size() >= 3) std::cout << "z^" << ev[2];
if(ev.size() >= 4) std::cout << "x^" << ev[3];
}
template <class Monom_rep>
void print_monom_rep(Monom_rep monom_rep){
std::sort(monom_rep.begin(), monom_rep.end());
for(typename Monom_rep::iterator it = monom_rep.begin();
it != monom_rep.end(); ++it){
//if(it->second != 0){
std::cout << it->second <<"*" ;
print_monom(it->first);
std::cout <<" + ";
//}
}
std::cout << std::endl;
}
template <class Polynomial_traits_d> template <class Polynomial_traits_d>
void test_construct_polynomial(){ void test_construct_polynomial(){
@ -487,6 +452,51 @@ void test_multivariate_content(){
std::cerr << " ok "<< std::endl; std::cerr << " ok "<< std::endl;
} }
// // Multivariate_content;
template <class Polynomial_traits_d>
void test_interpolate(){
std::cerr << "start test_interpolate "; std::cerr.flush();
typedef Polynomial_traits_d PT_d;
typedef typename PT_d::Innermost_coefficient ICoeff;
typedef typename PT_d::Polynomial_d Polynomial_d;
typedef typename PT_d:: template Rebind<ICoeff,1>::Other PT_1;
typedef typename PT_1::Polynomial_d Polynomial_1;
typename PT_d::Interpolate interpolate;
typename PT_d::Evaluate eval;
for(int i = 0; i < 5; i++){
Polynomial_d p = generate_sparse_random_polynomial<Polynomial_d>(i);
Polynomial_1 m(1);
Polynomial_d u(0);
for (int j = 0; j <= i; j++){
Polynomial_1 m1 = m;
Polynomial_d u1 = u;
Polynomial_1 m2 = Polynomial_1(ICoeff(-j),ICoeff(2));
Polynomial_d u2 = eval(p,ICoeff(j)/ICoeff(2));
interpolate(m1,u1,m2,u2,m,u);
}
CGAL_test_assert(u == p);
}
for(int i = 0; i < 5; i++){
Polynomial_d p = generate_sparse_random_polynomial<Polynomial_d>(i);
Polynomial_1 m(1);
Polynomial_d u(0);
for (int j = 0; j <= i; j++){
Polynomial_1 m2 = m;
Polynomial_d u2 = u;
Polynomial_1 m1 = Polynomial_1(ICoeff(-j),ICoeff(2));
Polynomial_d u1 = eval(p,ICoeff(j)/ICoeff(2));
interpolate(m1,u1,m2,u2,m,u);
}
CGAL_test_assert(u == p);
}
std::cerr << " ok "<< std::endl;
}
// // Shift; // // Shift;
template <class Polynomial_traits_d> template <class Polynomial_traits_d>
void test_shift(){ void test_shift(){
@ -1361,6 +1371,8 @@ Polynomial_traits_d, CGAL::Integral_domain_tag > {
test_univariate_content<Polynomial_traits_d>(); test_univariate_content<Polynomial_traits_d>();
// Multivariate_content; // Multivariate_content;
test_multivariate_content<Polynomial_traits_d>(); test_multivariate_content<Polynomial_traits_d>();
// Interpolate;
test_interpolate<Polynomial_traits_d>();
// Square_free_factorization; // Square_free_factorization;
test_square_free_factorization<Polynomial_traits_d>(); test_square_free_factorization<Polynomial_traits_d>();
} }
@ -1551,9 +1563,10 @@ void test_AT(){
CGAL::set_pretty_mode(std::cout); CGAL::set_pretty_mode(std::cout);
CGAL::set_pretty_mode(std::cerr); CGAL::set_pretty_mode(std::cerr);
typedef typename AT::Integer Integer; typedef typename AT::Integer Integer;
typedef typename AT::Rational Rational; typedef typename AT::Rational Rational;
std::cerr << std::endl; std::cerr << std::endl;
std::cerr << "Test for coefficient type Integer" << std::endl; std::cerr << "Test for coefficient type Integer" << std::endl;
std::cerr << "--------------------------------------" << std::endl; std::cerr << "--------------------------------------" << std::endl;
@ -1596,6 +1609,9 @@ void test_AT(){
int main(){ int main(){
#if 1
test_AT<CGAL::Arithmetic_kernel>();
#else
#ifdef CGAL_USE_LEDA #ifdef CGAL_USE_LEDA
{ {
typedef CGAL::LEDA_arithmetic_kernel AT; typedef CGAL::LEDA_arithmetic_kernel AT;
@ -1607,6 +1623,7 @@ int main(){
typedef CGAL::CORE_arithmetic_kernel AT; typedef CGAL::CORE_arithmetic_kernel AT;
test_AT<AT>(); test_AT<AT>();
} }
#endif
#endif #endif
return 0; return 0;
} }