6 #ifndef realroot_array_hpp
7 #define realroot_array_hpp
38 template <
class OS,
class R>
39 inline OS &
print(OS & os,
const R & v) {
41 typename R::const_iterator i=v.begin();
44 for(; i != v.end(); ++i) {os <<
", "; os<<*i;}
51 template <
class OS,
class R>
52 inline OS &
print(OS & os,
const R & v,
unsigned sz) {
57 for(; i <sz; ++i) os <<
","<<v[i];
67 template <
class IS,
class R>
68 inline IS &
read(IS & is, R & V) {
69 typedef typename R::size_type size_type;
73 for(size_type i=0; i< s; ++i) is >> V[i];
78 template <
class V1,
class V2>
inline
79 bool equal_n(
const V1& v1,
const V2 & v2,
int n )
82 while(i < n && v1[i] == v2[i]) i++;
87 template <
class V1,
class V2>
inline
88 bool equal(
const V1 & v1,
const V2 & v2)
89 {
return (v1.size() == v2.size()) &&
equal_n(v1,v2,v1.size()); }
93 template <
class V,
class C>
inline
95 for (
int i = 0; i < n; a[i] = v, i ++ ) {} };
98 template <
class V,
class C>
102 template <
class V,
class W>
103 void set(V & a,
const W &
b ) {
for (
int i = 0; i < (int)a.size(); a[i] = b[i], i ++ ) {} };
111 for (
int i = 0; i < k/2;
std::swap(v[a+i],v[k-1-i]), i ++ ) {}
118 template <
class V,
class I>
120 for(
I i=0;i<d/2;
std::swap(v[i],v[d-1-i]),++i) {}
124 template<
class V,
class W>
inline
126 for (
int i = a; i <
b; r[i] = -w[i], i++ ) {}
128 template<
class V,
class W>
inline
130 {
for (
int i = a; i <
b; r[i] = -r[i], i++ ){} };
132 template<
class VI>
inline
133 void neg_i( VI a, VI eda ) {
for ( ; a != eda; *a = -(*a), a++ ){} };
134 template<
class VI>
inline
135 void neg_i( VI a, VI eda, VI
b ) {
for ( ; a != eda; *a = -(*b), a++, b++ ){} };
136 template<
class V>
inline
138 template<
class V>
inline
141 a.resize( b.size() );
142 neg_i( a.begin(), a.end(), b.begin() );
145 template<
class V,
class W>
inline
146 void copy_range( V & v,
const W & w,
int a,
int b ) {
for (
int i = a; i <
b; v[i] = w[i], i ++ ){} }
147 template<
class V,
class W >
148 void add_n(V & a,
const W &
b,
int n ) {
for (
int i = 0; i < n; a[i] += b[i], i ++ ){} }
149 template<
class VI,
class WI>
150 void add_i( VI a, VI ea, WI
b ) {
for ( ; a != ea; *a += *
b, ++a, ++
b ){} };
153 template <
class V,
class W>
157 asz = a.size(), bsz = b.size();
161 add_i(a.begin(),a.end(),b.begin());
172 template<
class V,
class W,
class X >
inline
173 void add_n(V & a,
const W &
b,
const X&
c,
int n ) {
for (
int i = 0; i < n; a[i] = b[i]+c[i], i ++ ){} };
178 template <
class V,
class W,
class X>
182 asz = a.size(), bsz = b.size(), rsz = r.size();
185 if ( asz > rsz ) r.resize(asz);
191 if ( bsz > rsz ) r.resize(bsz);
199 template <
class V,
class W,
class X>
inline
200 void add(V & r,
const W & a,
const X &
b)
207 template <
class V>
inline
208 void add(V & r,
const V & a,
const V &
b)
210 if(&r==&a) {
add(r,b);
return; };
211 if(&r==&b) {
add(r,a);
return; };
215 template<
class V,
class W >
216 void sub_n(V & a,
const W &
b,
int n ) {
for (
int i = 0; i < n; a[i] -= b[i], i ++ ){} };
220 template <
class V,
class W>
224 asz = a.size(), bsz = b.size();
235 template<
class V,
class W,
class X >
inline
236 void sub_n(V & a,
const W &
b,
const X&
c,
int n ) {
for (
int i = 0; i < n; a[i] = b[i]-c[i], i ++ ){} };
239 template <
class V,
class W,
class X>
243 asz = a.size(), bsz = b.size(), rsz = r.size();
247 if ( asz > rsz ) r.resize(asz);
253 if ( bsz > rsz ) r.resize(bsz);
260 template <
class V,
class W,
class X>
261 void sub(V & r,
const W & a,
const X &
b)
269 void sub(V & r,
const V & a,
const V &
b)
271 if(&r==&a) {
sub(r,b);
return; };
276 template<
class V,
class W>
inline
278 {
for (
int i = 0; i < n; a[i] = a[i]*
c, i ++ ){} };
279 template<
class V,
class W,
class S>
inline
281 {
for (
int i = 0; i < n; a[i] = b[i]*
c, i++ ){} };
282 template<
class VI,
class W>
inline
284 {
for ( VI i = bga; i != eda; *i *=
c, ++i ){} };
285 template<
class VI,
class VII,
class W>
inline
287 {
for ( VI a = bga; a != eda; *a = *bgb *
c, ++bgb, ++a ){} };
290 template <
class V,
class W>
294 a.resize( b.size() );
300 template <
class V,
class W>
305 template<
class V,
class SC>
inline
307 {
for (
int i = 0; i < n; a[i] /= sc, i++){} }
308 template<
class V1,
class V2,
class SC>
310 {
for (
int i = 0; i < n; a[i] = b[i]/sc, i ++ ){} };
311 template<
class VI,
class SC>
inline
313 {
for ( ; bga < eda; *bga /= sc, bga++){} }
314 template<
class VI,
class SC>
inline
316 {
for ( ; a < eda; *a = *b / sc, a++, b ++ ){} };
318 template <
class V,
class SC>
322 a.resize( b.size() );
323 div_ext_i(a.begin(),a.end(),b.begin(),sc);
328 template <
class V,
class W>
333 template <
class V,
class W>
341 template <
class R,
class S,
class C>
inline
344 typedef typename S::const_iterator const_iterator;
345 typedef typename R::iterator iterator;
346 result.resize(a.size());
347 const_iterator
b=a.begin(); iterator i=result.begin();
348 for(; b!=a.end(); ++i, ++
b) *i = (*b) * m;
352 template <
class C,
class R>
356 for(
typename R::const_iterator it=v.begin(); it !=v.end(); ++it) r+=(*it)*(*it);
361 template <
class C,
class R>
365 for(
typename R::const_iterator it=v.begin(); it !=v.end(); ++it) r+=
pow(*it,p);
370 template <
class R,
class S>
371 typename R::value_type
innerprod_n(
const S & v,
const R & w,
unsigned n )
373 typename R::value_type r = 0;
374 for (
unsigned i = 0; i < n; r += v[i]*w[i], i++ ) {}
378 template <
class R,
class S>
379 typename R::value_type
innerprod(
const S & v,
const R & w)
381 typename R::value_type r =0;
382 for(
unsigned int i=0; i <v.size(); i++){r += (v[i]*w[i]);}
389 typename R::value_type r=0;
390 for(
unsigned i=0; i <(unsigned)v.size(); i++)
393 else if(r>-v[i]) r=-v[i];
399 template<
class U,
class R>
402 for(
unsigned i=0; i <v.size(); i++)
409 template <
typename V>
inline
412 unsigned sz = v.size();
414 for (
unsigned i = 0; i < sz; ++i)
418 template<
class Ia,
class Ib>
inline
424 template<
class Ra,
class Rb>
inline
427 a.resize( b.size() );
428 assign_i( a.begin(), a.end(), b.begin() );
431 template<
class R,
class C>
inline
433 {
for (
typename R::iterator i = r.begin(); i != r.end(); *i += x, i ++ ){} };
441 #endif // realroot_LINALG_VECTOR_H
void set_cst(V &a, const C &v)
Set all the entries of a to the values v.
Definition: array.hpp:99
void apply_mult(R &result, const S &a, const C &m)
Definition: array.hpp:342
T pow(const T &a, int i)
Definition: binomials.hpp:12
const C & b
Definition: Interval_glue.hpp:25
TMPL X
Definition: polynomial_operators.hpp:148
void mul_ext(V &a, const V &b, const W &c)
Scalar multiplication.
Definition: array.hpp:291
const Interval & I
Definition: Interval_glue.hpp:49
MP swap(const MP &P, int var_i, int var_j)
Definition: sparse_monomials.hpp:988
void sub_g(V &r, const W &a, const X &b)
Definition: array.hpp:240
bool equal_n(const V1 &v1, const V2 &v2, int n)
Definition: array.hpp:79
C norm(const R &v)
The $L_{2}$ norm for vectors.
Definition: array.hpp:353
void add_n(V &a, const W &b, int n)
Definition: array.hpp:148
void assign_i(Ia a, Ia eda, Ib b)
Definition: array.hpp:419
R::value_type innerprod(const S &v, const R &w)
Definition: array.hpp:379
void copy_range(V &v, const W &w, int a, int b)
Definition: array.hpp:146
void reverse(V &v, int n)
Definition: array.hpp:115
R::value_type innerprod_n(const S &v, const R &w, unsigned n)
Innerproduct of two vectors.
Definition: array.hpp:371
void neg_i(VI a, VI eda)
Definition: array.hpp:133
IS & read(IS &is, R &V)
Definition: array.hpp:68
void lcm_denominator(U &r, const R &v)
Definition: array.hpp:400
void reverse_n(V &v, int a, int n)
Reverse the entries of v, from the index a to n-1.
Definition: array.hpp:108
void neg(V &v)
Definition: array.hpp:137
void mul_ext_i(VI bga, VI eda, const W &c)
Definition: array.hpp:283
void sub(V &a, const W &b)
Substraction of two vectors.
Definition: array.hpp:221
scalar< T > sqrt(const scalar< T > &b)
Definition: scalar.hpp:501
void set(V &a, const W &b)
Definition: array.hpp:103
void add(V &a, const W &b)
Addition of two vectors.
Definition: array.hpp:154
void neg_range(V &r, const W &w, int a, int b)
Definition: array.hpp:125
void sub_n(V &a, const W &b, int n)
Definition: array.hpp:216
bool equal(const V1 &v1, const V2 &v2)
Definition: array.hpp:88
ZZ denominator(const QQ &a)
Definition: GMPXX.hpp:96
void add_i(VI a, VI ea, WI b)
Definition: array.hpp:150
void mul_ext_n(V &a, const W &c, int n)
Definition: array.hpp:277
void init_n(V &a, const C &v, int n)
Definition: array.hpp:94
const C & c
Definition: Interval_glue.hpp:45
double C
Definition: solver_mv_fatarcs.cpp:16
void vaddsc(R &r, const C &x)
Definition: array.hpp:432
void div_ext_n(V &a, const SC &sc, int n)
Definition: array.hpp:306
void div(V &a, const W &c)
Inplace scalar division.
Definition: array.hpp:334
void assign(A &a, const B &b)
Generic definition of the assignement function.
Definition: assign.hpp:97
void div_ext_i(VI bga, VI eda, const SC &sc)
Definition: array.hpp:312
R::value_type max_abs(const R &v)
Definition: array.hpp:387
OS & print(OS &os, const R &v)
Output function for general vectors: [v1, v2, ...].
Definition: array.hpp:39
void add_g(V &r, const W &a, const X &b)
Definition: array.hpp:179
ZZ lcm(const ZZ &a, const ZZ &b)
Definition: GMPXX.hpp:58
void assign(Ra &a, const Rb &b)
Definition: array.hpp:425
void div_ext(V &a, const V &b, const SC &sc)
Scalar division.
Definition: array.hpp:319