13 #ifndef _realroot_SOLVE_CONTFRAC_HPP_ 
   14 #define _realroot_SOLVE_CONTFRAC_HPP_ 
   18 #include <realroot/upoldse.hpp> 
   19 #include <realroot/upoldse_bound.hpp> 
   20 #include <realroot/sign.hpp> 
   42             template <
typename NT>
 
   45                 return foo( p.begin(), p.end());
 
   49             template <
typename NT>
 
   52                 return -
foo( p.rbegin(), p.rend());
 
   56             long foo( IT first, IT last)
 
   58                 typedef typename std::iterator_traits<IT>::difference_type     size_type;
 
   60                 size_type deg = std::distance( first, last);
 
   63                 int s = 
sign( *(last-1));
 
   66                 bool first_time = 
true;
 
   70                 for ( IT it = (last-2); it != first-1; --it, ++i) {
 
   71                     if ( s * 
sign( *it) < 0) {
 
   96             return std::log( static_cast<double>(a));
 
   99 #define __GMP_EXPR ::__gmp_expr<T, U> 
  100 #define TMPL template <class T, class U> inline 
  106             mpz_mul_2exp( b.get_mpz_t(), a.get_mpz_t(), k );
 
  113             mpz_mul_2exp( r.get_mpz_t(), a.get_mpz_t(), k );
 
  119             return mpz_sizeinbase( mpz_class( a).get_mpz_t(), 2 );
 
  127         template < 
typename RT, 
typename Poly > 
inline 
  132             for (
int i = 0; i <= 
degree( ID.
p); ++i) {
 
  142     template<
class C> 
typename meta::rationalof<C>::T 
to_rational(
const C& a, 
const C& 
b)
 
  144         typedef typename meta::rationalof<C>::T rational;
 
  145         return  (rational(a)/b);
 
  149     template < 
class NT , 
class LowerBound = AkritasBound<NT> >
 
  153         typedef typename meta::rationalof<RT>::T     
FT;
 
  162     template < 
class NT, 
class LB > 
inline 
  167         typedef typename K::root_t     root_t;
 
  178     template < 
typename K >
 
  183         typedef typename K::RT    RT;
 
  184         typedef typename K::FT    FT;
 
  185         typedef typename K::FT    rational_t;
 
  186         typedef typename K::FIT   FIT;
 
  187         typedef typename K::Poly  Poly;
 
  205         if ( s == 0 ) { 
return; }
 
  216         Poly 
X(2, 
AsSize()); X[1] = RT(1); X[0]=RT(0);
 
  218         std::stack< IntervalData > S;
 
  219         if ( posneg) S.push( IntervalData( 1, 0, 0, 1, f, s));
 
  220         else S.push( IntervalData( -1, 0, 0, 1, f, s));
 
  222         while ( !S.empty() ) {
 
  224             IntervalData ID = S.top();
 
  282                 if ( ID.
p[0] == RT(0)) {
 
  287                 if ( ID.
s == 0 ) { 
continue; }
 
  301             if (I1.
p[0] == RT(0)) {
 
  311             I2.
s = ID.
s - I1.
s - r;
 
  339             } 
else if ( I1.
s > 1) {
 
  340                 S.push( IntervalData( I1.
a, I1.
b, I1.
c, I1.
d, I1.
p, I1.
s));
 
  347             } 
else if ( I2.
s > 1) {
 
  348                 S.push( IntervalData( I2.
a, I2.
b, I2.
c, I2.
d, I2.
p, I2.
s));
 
  358     template < 
typename K >
 
  363         typedef typename K::RT    RT;
 
  364         typedef typename K::FT    FT;
 
  365         typedef typename K::root_t   FIT;
 
  366         typedef typename K::Poly  Poly;
 
  376         if ( s == 0 ) { 
return; }
 
  383         Poly 
X(2, 
AsSize()); X[1] = RT(1);
 
  385         std::stack< IntervalData > S;
 
  386         if ( posneg) S.push( IntervalData( 1, 0, 0, 1, f, s));
 
  387         else S.push( IntervalData( -1, 0, 0, 1, f, s));
 
  389         IntervalData ID, I1, I2;
 
  396         unsigned long mult = 0; 
 
  398         while ( !S.empty() ) {
 
  405             lowerBound =  CauchyMinimumBound( ID.
p);
 
  406             std::cout << 
"lower bound is "<< lowerBound << std::endl;
 
  409                 midpoint = FT(ID.
d * B - ID.
b*
sign(ID.
a), 2* 
abs(ID.
a));
 
  411             }
else if (ID.
d > ID.
c ){
 
  412                 midpoint = FT(ID.
d, ID.
c);
 
  415             if(midpoint < 1)  midpoint = 1;
 
  416             std::cout << 
"Midpoint = " << midpoint << std::endl;
 
  418             if(lowerBound >= midpoint){
 
  419                 if ( lowerBound > 1 ) {
 
  426                 if ( lowerBound == 1 ) {
 
  431                     if ( ID.
p[0] == RT(0)) {
 
  436                     if ( ID.
s == 0 ) { 
continue; }
 
  449                 if (I1.
p[0] == RT(0)) {
 
  456                 I2.
s = ID.
s - I1.
s - mult;
 
  472                 I1.
b = ID.
a * RT(midpoint) + ID.
b;
 
  474                 I1.
d = ID.
c * RT(midpoint) + ID.
d;
 
  478                 if (I1.
p[0] == RT(0)) {
 
  486                 I2.
b = ID.
b + ID.
a * RT(midpoint);
 
  488                 I2.
d = ID.
d + ID.
c * RT(midpoint);
 
  489                 I2.
s = ID.
s - I1.
s - mult;
 
  520             } 
else if ( I1.
s > 1) {
 
  521                 S.push( IntervalData( I1.
a, I1.
b, I1.
c, I1.
d, I1.
p, I1.
s));
 
  526             } 
else if ( I2.
s > 1) {
 
  527                 S.push( IntervalData( I2.
a, I2.
b, I2.
c, I2.
d, I2.
p, I2.
s));
 
  530         std::cout << 
"---------------- iters: " << iters << std::endl; 
 
  536     template < 
typename OutputIterator, 
typename K >
 
  538     CF_solve( 
const typename K::Poly& f, OutputIterator sol, 
int  mult, K)
 
  540         typedef typename K::Poly  Poly;
 
  541         typedef typename K::FIT FIT;
 
  547         for (idx = 0; idx <= 
degree( f); ++idx) {
 
  548             if ( f[idx] != 0 ) 
break;
 
  552         if ( idx == 0 ) { p = f; } 
 
  555             for (
int j = idx; j <= 
degree( f); ++j) 
 
  561         for (
int i = 1; i <= 
degree(p); i+=2) p[i] *= -1;
 
  568         if (idx != 0) isolating_intervals.
push_back( FIT( 0, 0));
 
  571         for (
int i = 1; i <= 
degree(p); i+=2) p[i] *= -1;
 
  598         for (
unsigned i = 0 ; i < isolating_intervals.
size(); ++i) {*sol++ = isolating_intervals[i];}
 
  606     template < 
typename K,
 
  607                typename OutputIterator > 
inline 
  620 #endif // _realroot_SOLVE_CONTFRAC_HPP_ 
Cauchy bound. 
Definition: univariate_bounds.hpp:163
Sequence of terms with reference counter. 
Definition: Seq.hpp:28
void resize(size_type i)
Definition: Seq.hpp:169
OutputIterator CF_solve(const typename K::Poly &f, OutputIterator sol, int mult, K)
Definition: contfrac.hpp:538
const C & b
Definition: Interval_glue.hpp:25
Definition: univariate_bounds.hpp:409
TMPL X
Definition: polynomial_operators.hpp:148
dynamic_exp< E >::degree_t degree(const dynamic_exp< E > &t)
Definition: dynamicexp.hpp:191
void shift(IntervalData< RT, Poly > &ID, const RT &a)
Definition: contfrac_intervaldata.hpp:257
Interval< FT > root_t
Definition: contfrac.hpp:155
Definition: solver_uv_continued_fraction.hpp:78
OutputIterator solve_contfrac(const typename K::Poly &h, OutputIterator sol, K)
Definition: contfrac.hpp:609
Definition: solver_binary.hpp:51
MP swap(const MP &P, int var_i, int var_j)
Definition: sparse_monomials.hpp:988
Interval< FT > to_FIT(const FT &a, const FT &b)
Definition: contfrac_intervaldata.hpp:103
void scale(IntervalData< RT, Poly > &ID, const RT &a)
Definition: contfrac_intervaldata.hpp:221
self_t & push_back(const C &x)
Definition: Seq.hpp:110
void CF_positive(const typename K::Poly &f, Seq< typename K::FIT > &RL, bool posneg, K)
Definition: contfrac.hpp:180
FT bound_root(const POLY &p, const Cauchy< FT > &m)
Definition: univariate_bounds.hpp:325
upoldse< NT > Poly
Definition: contfrac.hpp:156
#define __GMP_EXPR
Definition: contfrac.hpp:99
RT a
Definition: contfrac_intervaldata.hpp:22
#define TMPL
Definition: contfrac.hpp:100
NT RT
Definition: contfrac.hpp:152
void reverse(Poly &R, const Poly &P)
Definition: contfrac_intervaldata.hpp:139
Seq< typename ContFrac< NT, LB >::root_t > solve(const typename ContFrac< NT >::Poly &f, ContFrac< NT, LB >)
Definition: contfrac.hpp:164
RT b
Definition: contfrac_intervaldata.hpp:22
RT c
Definition: contfrac_intervaldata.hpp:22
Definition: contfrac_intervaldata.hpp:17
unsigned long s
Definition: contfrac_intervaldata.hpp:24
size_type size() const 
Definition: Seq.hpp:166
RT d
Definition: contfrac_intervaldata.hpp:22
meta::rationalof< C >::T to_rational(const C &a, const C &b)
Definition: contfrac.hpp:142
void shift_by_1(Poly &R, const Poly &P)
Definition: contfrac_intervaldata.hpp:168
Definition: shared_object.hpp:61
void abs(Interval< C, r > &x, const Interval< C, r > &a)
Definition: Interval_fcts.hpp:185
void MCF_positive(const typename K::Poly &f, Seq< typename K::root_t > &RL, bool posneg, K)
Definition: contfrac.hpp:360
R & rep()
Definition: Seq.hpp:62
Generic class for intervals. 
Definition: Interval.hpp:44
ContFrac_t self_t
Definition: contfrac.hpp:158
Class. 
Definition: contfrac.hpp:150
Poly p
Definition: contfrac_intervaldata.hpp:23
meta::rationalof< RT >::T FT
Definition: contfrac.hpp:153
double C
Definition: solver_mv_fatarcs.cpp:16
int sign(const QQ &a)
Definition: GMP.hpp:60
LowerBound bound
Definition: contfrac.hpp:157
unsigned sign_variation(Iterator b, Iterator e)
Definition: sign_variation.hpp:27
Interval< T, r > max(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:135
size_t log(const scalar< MPF > &b)
Definition: scalar_floating.hpp:506
Interval< FT > FIT
Definition: contfrac.hpp:154
#define assert(expr, msg)
Definition: shared_object.hpp:57