|
realroot_doc 0.1.1
|
#include <univariate_bounds.hpp>
Cauchy bound.
Definition at line 162 of file univariate_bounds.hpp.
| C lower_bound | ( | const Poly & | f | ) | const [inline] |
Computes the Cauchy lower bound on the first positive root as a power of 2.
| C | type of the result. |
| Poly | type of the polynomial. |
| p | Univariate polynomial |
Definition at line 210 of file univariate_bounds.hpp.
References mmx::abs(), mmx::bit_size(), mmx::degree(), and mmx::sign().
{
using univariate::degree;
typedef C RT;
long deg = degree( f);
long l = 0;
for (int i = 1; i <= deg; ++i) {
if ( sign( f[i]) * sign( f[0]) < 0 ) {
++l;
}
}
long ba0 = bit_size(f[0]) - 1; /* puiss de 2 < an */
bool bound_set = false;
long K = 0;
for (int i = 1; i <= deg; ++i) {
if ( sign( f[i]) * sign( f[0]) < 0 ) {
long bai = bit_size( RT( l * f[i])) - 1;
long p = bai - ba0 - 1 ;
long k = i;
long q = p / k;
long r = p % k;
long rq = 0;
if (r <= k-2) {
rq = q + 1;
} else {
rq = q + 2;
}
if ( (bound_set == false) || (K < rq) ) {
K = rq;
bound_set = true;
}
}
}
if ( K < 0 ) {return pow2<RT>( abs( K) );}
return 0;
}
| long lower_power_2 | ( | const Poly & | f | ) | const [inline] |
Definition at line 256 of file univariate_bounds.hpp.
References mmx::abs(), mmx::bit_size(), mmx::degree(), and mmx::sign().
{
using univariate::degree;
typedef typename Poly::value_type RT;
long deg = degree( f);
long l = 0;
for (int i = 1; i <= deg; ++i) {
if ( sign( f[i]) * sign( f[0]) < 0 ) {
++l;
}
}
long ba0 = bit_size(f[0]) - 1; /* puiss de 2 < an */
bool bound_set = false;
long K = 0;
for (int i = 1; i <= deg; ++i) {
if ( sign( f[i]) * sign( f[0]) < 0 ) {
long bai = bit_size( RT( l * f[i])) - 1;
long p = bai - ba0 - 1 ;
long k = i;
long q = p / k;
long r = p % k;
long rq = 0;
if (r <= k-2) {
rq = q + 1;
} else {
rq = q + 2;
}
if ( (bound_set == false) || (K < rq) ) {
K = rq;
bound_set = true;
}
}
}
if ( K < 0 ) { abs( K);}
return -1;
}
| double upper_bound | ( | const Poly & | p | ) |
Definition at line 305 of file univariate_bounds.hpp.
References mmx::abs(), mmx::univariate::lcoeff(), mmx::vctops::max(), and mmx::numerics::rnd_up().
{
typedef typename Poly::value_type coeff_t;
numerics::rounding<double> rnd( numerics::rnd_up() );
//using std::abs;
coeff_t M=0;
for(unsigned i=0;i< p.size(); i++) M = std::max(M, coeff_t(abs(p[i])));
// abs_max<coeff_t> M = std::for_each(p.begin(), p.end()-1, abs_max<coeff_t>());
coeff_t an = coeff_t(abs(univariate::lcoeff(p)));
//std::cout <<M<<" "<<an<<" "<<std::endl;
double res=as<double>(coeff_t(M/an)) + 1;
// std::cout <<res<<std::endl;
return res;
}
| static C upper_bound | ( | const Poly & | p | ) | [inline, static] |
Computes the Cauchy root bound.
| C | type of the result. |
| Poly | type of the polynomial. |
| p | Univariate polynomial |
If the polynomial @ is in the monomial basis is of the form
the Cauchy bound on the modul of the roots of
is
Definition at line 186 of file univariate_bounds.hpp.
References mmx::abs(), mmx::univariate::lcoeff(), and abs_max< T >::max.
Referenced by mmx::bound_root().
{
// DEBUG::print("Cauchy");
typedef typename Poly::value_type RT;
typedef typename texp::rationalof<RT>::T rational;
//using std::abs;
abs_max<RT> M = std::for_each(p.begin(), p.end()-1, abs_max<RT>());
RT an = abs(lcoeff(p));
// rational val= rational(M.max)/an + rational(1);
C res= C(M.max/an) + C(1);
// C res; let::assign(res, val);
return res;
}