6 #ifndef realroot_SOLVE_SBDSLV_LINEAR_HOUSEHOLDER_HPP
7 #define realroot_SOLVE_SBDSLV_LINEAR_HOUSEHOLDER_HPP
21 template<
typename real_t >
25 real_t
scale, hh, h, g, f;
26 real_t * mi = M + (n-1)*n;
27 for ( i = n-1; i >= 1; i--, mi -= n )
33 for ( k = 0; k <= l; scale += fabs(mi[k]), k ++ ) ;
34 if ( scale == 0.0 ) e[i] = mi[l];
37 for ( k = 0; k <= l; mi[k] /=
scale, h += mi[k]*mi[k], k ++ ) ;
45 for ( j = 0; j <= l; j ++, mj += n ) {
48 for ( k = 0; k <= j; g += mj[k]*mi[k], k ++ ) ;
49 for ( k = j+1; k<= l; g += M[k*n+j]*mi[k], k ++ ) ;
54 for ( j = 0; j <= l; j ++ )
57 e[j] = g = e[j] - hh*f;
58 for ( k = 0; k <= j; M[j*n+k] -= (f*e[k]+g*mi[k]), k ++ ) ;
70 for ( i = 0; i < n; i ++, mi += n )
74 for ( j = 0; j <= l; j ++ )
77 for ( k = 0; k <= l; g += mi[k]*M[k*n+j], k ++ ) ;
78 for ( k = 0; k <= l; M[k*n+j] -= g*M[k*n+i], k ++ ) ;
82 for ( j = 0; j <= l; j ++ ) M[j*n+i] = mi[j] = 0.0;
86 template<
typename real_t >
87 real_t
pythag(
const real_t& a,
const real_t&
b)
105 template<
typename real_t >
106 void tqli( real_t * d, real_t * e,
int n, real_t * z )
109 real_t s,r,p,g,f,dd,
c,
b;
110 for ( i = 1; i < n; i ++ ) e[i-1] = e[i];
112 for ( l = 0; l < n; l++ )
119 for ( m = l; m < n-1; m++ )
122 if ( (real_t)(
std::abs(e[m])+dd) == dd )
129 g = (d[l+1]-d[l])/(2.0*e[l]);
130 r =
pythag(g,(real_t)1.0);
131 if ( g >= 0.0 ) g = d[m]-d[l]+e[l]/(g+
std::abs(r));
132 else g = d[m]-d[l]+e[l]/(g-
std::abs(r));
135 for ( i = m-1; i >= l; i-- )
149 r=(d[i]-g)*s+2.0*c*b;
152 for ( k = 0; k < n; k++ )
155 z[k*n+i+1] = s*z[k*n+i]+c*f;
156 z[k*n+i] = c*z[k*n+i]-s*f;
159 if ( r == 0.0 && i >= l )
continue;
169 template<
class real_t >
177 template<
typename real_t >
185 for ( k = 0; k <= n; p0[k] = p1[k] = 0, k ++ ) ;
188 p1[0] = M[n*(n-1)+(n-1)];
193 for ( i = n-2; i >= 0; i -- )
196 real_t
b = M[i*n+i+1];
198 for ( k = 0; k <= n-2-i; k ++ ) p0[k] = -p0[k]*(b*b);
199 for ( k = 0; k <= n-1-i; k ++ ) p0[k] += a*p1[k];
200 for ( k = 1; k <= n-i; k ++ )
214 template<
typename real_t >
const C & b
Definition: Interval_glue.hpp:25
MP swap(const MP &P, int var_i, int var_j)
Definition: sparse_monomials.hpp:988
void caract_polynom(real_t *p, real_t *M, int n)
Definition: linear_householder.hpp:215
void scale(IntervalData< RT, Poly > &ID, const RT &a)
Definition: contfrac_intervaldata.hpp:221
void symeigen(real_t *M, real_t *d, int n)
Definition: linear_householder.hpp:170
TMPL void copy(Polynomial &r, const Polynomial &a)
Copy of a in r.
Definition: sparse_monomials.hpp:613
void tqli(real_t *d, real_t *e, int n, real_t *z)
Definition: linear_householder.hpp:106
void abs(Interval< C, r > &x, const Interval< C, r > &a)
Definition: Interval_fcts.hpp:185
scalar< T > sqrt(const scalar< T > &b)
Definition: scalar.hpp:501
real_t pythag(const real_t &a, const real_t &b)
Definition: linear_householder.hpp:87
const C & c
Definition: Interval_glue.hpp:45
void householder(real_t *M, real_t *d, real_t *e, int n)
Definition: linear_householder.hpp:22
void cpolynom(real_t *p, real_t *M, int n)
Definition: linear_householder.hpp:178
#define assert(expr, msg)
Definition: shared_object.hpp:57