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