added PT::Construct_cofficient_const_iterator_range

added PT::Construct_innermost_coefficient_const_iterator_range
rm according functors _begin/_end
This commit is contained in:
Michael Hemmer 2008-10-15 08:38:34 +00:00
parent 79dec30a9c
commit 8e7bed8e6d
4 changed files with 70 additions and 63 deletions

View File

@ -79,8 +79,7 @@ Polynomial<NT> modular_gcd_utcf_dfai(
typedef typename PT::Innermost_coefficient_type IC; typedef typename PT::Innermost_coefficient_type IC;
typename Coercion_traits<Poly,IC>::Cast ictp; typename Coercion_traits<Poly,IC>::Cast ictp;
typename PT::Innermost_coefficient_const_begin begin; typename PT::Construct_innermost_coefficient_const_iterator_range range;
typename PT::Innermost_coefficient_const_end end;
typename PT::Innermost_leading_coefficient ilcoeff; typename PT::Innermost_leading_coefficient ilcoeff;
typedef Algebraic_extension_traits<IC> ANT; typedef Algebraic_extension_traits<IC> ANT;
@ -131,7 +130,7 @@ Polynomial<NT> modular_gcd_utcf_dfai(
IC denom; IC denom;
{ {
Poly tmp = F1+F2; Poly tmp = F1+F2;
denom = dfai(begin(tmp),end(tmp)); denom = dfai(range(tmp).first, range(tmp).second);
} }
denom *= nfac(denom); denom *= nfac(denom);

View File

@ -156,11 +156,10 @@ inline int square_free_factorize_for_regular_polynomial_
typedef Polynomial<Coeff> POLY; typedef Polynomial<Coeff> POLY;
typedef Polynomial_traits_d<POLY> PT; typedef Polynomial_traits_d<POLY> PT;
typedef typename Polynomial_traits_d<POLY>::Innermost_coefficient_type IC; typedef typename PT::Innermost_coefficient_type IC;
typename Polynomial_traits_d<POLY>::Innermost_leading_coefficient ilcoeff; typename PT::Innermost_leading_coefficient ilcoeff;
//typename Polynomial_traits_d<POLY>::Innermost_coefficient_to_polynomial ictp; //typename PT::Innermost_coefficient_to_polynomial ictp;
typename Polynomial_traits_d<POLY>::Innermost_coefficient_const_begin begin; typename PT::Construct_innermost_coefficient_const_iterator_range range;
typename Polynomial_traits_d<POLY>::Innermost_coefficient_const_end end;
typename Algebraic_extension_traits<IC>::Denominator_for_algebraic_integers dfai; typename Algebraic_extension_traits<IC>::Denominator_for_algebraic_integers dfai;
typename Algebraic_extension_traits<IC>::Normalization_factor nfac; typename Algebraic_extension_traits<IC>::Normalization_factor nfac;
typename Scalar_factor_traits<POLY>::Scalar_factor sfac; typename Scalar_factor_traits<POLY>::Scalar_factor sfac;
@ -186,7 +185,7 @@ inline int square_free_factorize_for_regular_polynomial_
// integers, which comes out from c=gcd(a,b), such that a and b are // integers, which comes out from c=gcd(a,b), such that a and b are
// divisible by c // divisible by c
IC lcoeff = ilcoeff(c); IC lcoeff = ilcoeff(c);
IC denom = dfai(begin(c), end(c)); IC denom = dfai(range(c).first, range(c).second);
lcoeff *= denom * nfac(denom); lcoeff *= denom * nfac(denom);
POLY w = (a * POLY(lcoeff)) / c; POLY w = (a * POLY(lcoeff)) / c;
POLY y = (b * POLY(lcoeff)) / c; POLY y = (b * POLY(lcoeff)) / c;
@ -209,7 +208,7 @@ inline int square_free_factorize_for_regular_polynomial_
} }
i++; i++;
lcoeff = ilcoeff(g); // same as above lcoeff = ilcoeff(g); // same as above
denom =dfai(begin(c), end(c)); denom =dfai(range(c).first, range(c).second);
lcoeff *= denom * nfac(denom); lcoeff *= denom * nfac(denom);
w = (w * POLY(lcoeff)) / g; w = (w * POLY(lcoeff)) / g;
y = (z * POLY(lcoeff)) / g; y = (z * POLY(lcoeff)) / g;

View File

@ -54,7 +54,16 @@
Innermost_coefficient_const_iterator; \ Innermost_coefficient_const_iterator; \
\ \
typedef typename Polynomial_d::const_iterator \ typedef typename Polynomial_d::const_iterator \
Coefficient_const_iterator; Coefficient_const_iterator; \
\
typedef std::pair<Innermost_coefficient_const_iterator, \
Innermost_coefficient_const_iterator> \
Innermost_coefficient_const_iterator_range; \
\
typedef std::pair<Coefficient_const_iterator, \
Coefficient_const_iterator> \
Coefficient_const_iterator_range; \
CGAL_BEGIN_NAMESPACE; CGAL_BEGIN_NAMESPACE;
@ -98,9 +107,8 @@ public:
operator()(const Polynomial_d& p) const { operator()(const Polynomial_d& p) const {
typedef Innermost_coefficient_const_iterator IT; typedef Innermost_coefficient_const_iterator IT;
Innermost_coefficient_type content(0); Innermost_coefficient_type content(0);
for (IT it = typename PT::Innermost_coefficient_const_begin()(p); typename PT::Construct_innermost_coefficient_const_iterator_range range;
it != typename PT::Innermost_coefficient_const_end()(p); for (IT it = range(p).first; it != range(p).second; it++){
it++){
content = CGAL::gcd(content, *it); content = CGAL::gcd(content, *it);
if(CGAL::is_one(content)) break; if(CGAL::is_one(content)) break;
} }
@ -438,6 +446,14 @@ class Polynomial_traits_d_base< Polynomial< Coefficient_type_ >,
Innermost_coefficient_const_iterator; Innermost_coefficient_const_iterator;
typedef typename Polynomial_d::const_iterator Coefficient_const_iterator; typedef typename Polynomial_d::const_iterator Coefficient_const_iterator;
typedef std::pair<Innermost_coefficient_const_iterator,
Innermost_coefficient_const_iterator>
Innermost_coefficient_const_iterator_range;
typedef std::pair<Coefficient_const_iterator,
Coefficient_const_iterator>
Coefficient_const_iterator_range;
// We use our own Strict Weak Ordering predicate in order to avoid // We use our own Strict Weak Ordering predicate in order to avoid
// problems when calling sort for a Exponents_coeff_pair where the // problems when calling sort for a Exponents_coeff_pair where the
@ -966,32 +982,23 @@ public:
typedef typename ::boost::mpl::if_<IC_is_real_embeddable,Compare_,Null_functor>::type Compare; typedef typename ::boost::mpl::if_<IC_is_real_embeddable,Compare_,Null_functor>::type Compare;
struct Construct_coefficient_const_iterator_range
// This is going to be in PolynomialToolBox : public std::unary_function< Polynomial_d,
struct Coefficient_const_begin Coefficient_const_iterator_range> {
: public std::unary_function< Polynomial_d, Coefficient_const_iterator > { Coefficient_const_iterator_range
Coefficient_const_iterator
operator () (const Polynomial_d& p) { return p.begin(); }
};
struct Coefficient_const_end
: public std::unary_function< Polynomial_d, Coefficient_const_iterator > {
Coefficient_const_iterator
operator () (const Polynomial_d& p) { return p.end(); }
};
struct Innermost_coefficient_const_begin
: public std::unary_function< Polynomial_d, Innermost_coefficient_const_iterator > {
Innermost_coefficient_const_iterator
operator () (const Polynomial_d& p) { operator () (const Polynomial_d& p) {
return typename Coefficient_const_flattening::Flatten()(p.end(),p.begin()); return make_pair( p.begin(), p.end() );
} }
}; };
struct Innermost_coefficient_const_end struct Construct_innermost_coefficient_const_iterator_range
: public std::unary_function< Polynomial_d, Innermost_coefficient_const_iterator > { : public std::unary_function< Polynomial_d,
Innermost_coefficient_const_iterator Innermost_coefficient_const_iterator_range> {
Innermost_coefficient_const_iterator_range
operator () (const Polynomial_d& p) { operator () (const Polynomial_d& p) {
return typename Coefficient_const_flattening::Flatten()(p.end(),p.end()); return make_pair(
typename Coefficient_const_flattening::Flatten()(p.end(),p.begin()),
typename Coefficient_const_flattening::Flatten()(p.end(),p.end()));
} }
}; };
@ -1101,8 +1108,7 @@ public:
typename PT::Construct_polynomial construct; typename PT::Construct_polynomial construct;
typename PT::Innermost_leading_coefficient ilcoeff; typename PT::Innermost_leading_coefficient ilcoeff;
typename PT::Innermost_coefficient_const_begin begin; typename PT::Construct_innermost_coefficient_const_iterator_range range;
typename PT::Innermost_coefficient_const_end end;
typedef Algebraic_extension_traits<Innermost_coefficient_type> AET; typedef Algebraic_extension_traits<Innermost_coefficient_type> AET;
typename AET::Denominator_for_algebraic_integers dfai; typename AET::Denominator_for_algebraic_integers dfai;
typename AET::Normalization_factor nfac; typename AET::Normalization_factor nfac;
@ -1110,7 +1116,7 @@ public:
IC ilcoeff_q = ilcoeff(q); IC ilcoeff_q = ilcoeff(q);
// this factor is needed in case IC is an Algebraic extension // this factor is needed in case IC is an Algebraic extension
IC dfai_q = dfai(begin(q), end(q)); IC dfai_q = dfai(range(q).first, range(q).second);
// make dfai_q a 'scalar' // make dfai_q a 'scalar'
ilcoeff_q *= dfai_q * nfac(dfai_q); ilcoeff_q *= dfai_q * nfac(dfai_q);

View File

@ -1507,19 +1507,19 @@ void test_coefficient_const_iterator(const PT&) {
typedef typename PT::Coefficient_type Coefficient; typedef typename PT::Coefficient_type Coefficient;
typedef typename PT::Coefficient_const_iterator CCIterator; typedef typename PT::Coefficient_const_iterator CCIterator;
typename PT::Coefficient_const_begin begin; typename PT::Construct_coefficient_const_iterator_range coeff_range;
typename PT::Coefficient_const_end end;
typename PT::Degree degree; typename PT::Degree degree;
typename PT::Get_coefficient coeff; typename PT::Get_coefficient coeff;
Polynomial_d p = generate_sparse_random_polynomial<Polynomial_d>(); Polynomial_d p = generate_sparse_random_polynomial<Polynomial_d>();
CCIterator it = begin(p);
CCIterator it = coeff_range(p).first;
for(int i = 0; i <= degree(p); i++){ for(int i = 0; i <= degree(p); i++){
assert(*it == coeff(p,i)); assert(*it == coeff(p,i));
it++; it++;
} }
assert(end(p) == it); assert(coeff_range(p).second == it);
} }
@ -1556,25 +1556,28 @@ void test_innermost_coefficient_const_iterator(const PT&) {
Polynomial_3 r(q1, q2, q3); Polynomial_3 r(q1, q2, q3);
int i; int i;
typename PT_1::Innermost_coefficient_const_iterator it1; (void) it1;
typename PT_1::Innermost_coefficient_const_begin begin1; (void) begin1;
typename PT_1::Innermost_coefficient_const_end end1; (void) end1;
typename PT_2::Innermost_coefficient_const_iterator it2; (void) it2;
typename PT_2::Innermost_coefficient_const_begin begin2; (void) begin2;
typename PT_2::Innermost_coefficient_const_end end2; (void) end2;
typename PT_3::Innermost_coefficient_const_iterator it3; (void) it3;
typename PT_3::Innermost_coefficient_const_begin begin3; (void) begin3;
typename PT_3::Innermost_coefficient_const_end end3; (void) end3;
for (i = 1, it1 = begin1(p1); i <= 3; ++i, ++it1)
typename PT_1::Innermost_coefficient_const_iterator it1; (void) it1;
typename PT_1::Construct_innermost_coefficient_const_iterator_range range1;
typename PT_2::Innermost_coefficient_const_iterator it2; (void) it2;
typename PT_2::Construct_innermost_coefficient_const_iterator_range range2;
typename PT_3::Innermost_coefficient_const_iterator it3; (void) it3;
typename PT_3::Construct_innermost_coefficient_const_iterator_range range3;
(void) range1;
(void) range2;
(void) range3;
for (i = 1, it1 = (range1(p1).first); i <= 3; ++i, ++it1)
assert(*it1 == i); assert(*it1 == i);
assert(it1 == end1(p1)); assert(it1 == range1(p1).second);
for (i = 1, it2 = begin2(q1); i <= 9; ++i, ++it2) for (i = 1, it2 = range2(q1).first; i <= 9; ++i, ++it2)
assert(*it2 == i); assert(*it2 == i);
assert(it2 == end2(q1)); assert(it2 == range2(q1).second);
for (i = 1, it3 = begin3(r); i <= 27; ++i, ++it3) for (i = 1, it3 = range3(r).first; i <= 27; ++i, ++it3)
assert(*it3 == i); assert(*it3 == i);
assert(it3 == end3(r)); assert(it3 == range3(r).second);
} }
@ -1774,7 +1777,7 @@ int main(){
#ifdef CGAL_USE_CORE #ifdef CGAL_USE_CORE
{ {
typedef CGAL::CORE_arithmetic_kernel AT; typedef CGAL::CORE_arithmetic_kernel AT;
test_AT<AT>(); //test_AT<AT>();
} }
#endif #endif