Changeset 2960
- Timestamp:
- 06/03/08 21:42:52 (4 months ago)
- Files:
-
- 1 modified
-
trunk/linbox/linbox/algorithms/cra-full-multip.h (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/linbox/linbox/algorithms/cra-full-multip.h
r2943 r2960 1 1 /* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ 2 2 // ======================================================================= // 3 // Time-stamp: <2 4 Apr 08 10:01:34Jean-Guillaume.Dumas@imag.fr>3 // Time-stamp: <23 Apr 08 19:28:37 Jean-Guillaume.Dumas@imag.fr> 4 4 // ======================================================================= // 5 5 #ifndef __LINBOX_CRA_FULL_MULTIP_H … … 89 89 std::vector<Integer>::const_iterator t_it= _tab_it->begin(); 90 90 91 Integer inv m; inv(invm, _mod_it->operator()(), mi());91 Integer invprod; precomputeInvProd(invprod, mi(), _mod_it->operator()()); 92 92 for( ; ri_it != ri.end(); ++ri_it, ++ t_it) 93 equalreconstruct(*ri_it, mi(), *t_it, _mod_it->operator()(), invm);93 smallbigreconstruct(*ri_it, *t_it, invprod); 94 94 95 95 // Product (lazy) computation 96 96 mi.mulin(*_mod_it); 97 98 // Moding out 99 for(ri_it = ri.begin() ; ri_it != ri.end(); ++ri_it) { 100 *ri_it %= mi(); 101 } 97 102 98 103 di += *_dsz_it; … … 157 162 std::vector<Integer>::iterator t0_it = d.begin(); 158 163 std::vector<Integer>::const_iterator t_it = _tab_it->begin(); 159 160 Integer invm; inv(invm, _mod_it->operator()(), Product());164 Integer invprod; 165 precomputeInvProd(invprod, Product(), _mod_it->operator()() ); 161 166 162 167 for( ; t0_it != d.end(); ++t0_it, ++t_it) 163 smallbigreconstruct(*t0_it, Product(), *t_it, _mod_it->operator()(), invm);168 smallbigreconstruct(*t0_it, *t_it, invprod); 164 169 165 170 // Overall product computation … … 168 173 // Moding out and normalization 169 174 for(t0_it = d.begin();t0_it != d.end(); ++t0_it) { 175 *t0_it %= Product(); 170 176 Integer tmp(*t0_it); 171 177 normalize(*t0_it, tmp, Product()); … … 219 225 protected: 220 226 221 Integer& equalreconstruct(Integer& u1, const Integer& m1, const Integer& u0, const Integer& m0, const Integer& invm) {222 u1 -= u0; // u1 <-- (u1-u0)223 u1 *= invm; // u1 <-- (u1-u0)( m0^{-1} mod m1 )224 u1 %= m1; // u1 <-- ( (u1-u0)m0^{-1} ) mod m1225 u1 *= m0; // u1 <-- (u1-u0)( m0^{-1} mod m1 ) m0226 return u1 += u0; // u1 <-- u0 + (u1-u0)( m0^{-1} mod m1 ) m0227 }228 229 230 231 227 Integer& precomputeInvProd(Integer& res, const Integer& m1, const Integer& m0) { 232 228 inv(res, m0, m1); … … 234 230 } 235 231 236 Integer& smallbigreconstruct(Integer& u1, const Integer& m1, const Integer& u0, const Integer& m0, const Integer& invm) {232 Integer& smallbigreconstruct(Integer& u1, const Integer& u0, const Integer& invprod) { 237 233 u1 -= u0; // u1 <-- (u1-u0) 238 u1 *= invm; // u1 <-- (u1-u0)( m0^{-1} mod m1 ) 239 u1 %= m1; // u1 <-- ( (u1-u0)m0^{-1} ) mod m1 240 u1 *= m0; // u1 <-- (u1-u0)( m0^{-1} mod m1 ) m0 234 u1 *= invprod; // u1 <-- (u1-u0)( m0^{-1} mod m1 ) m0 241 235 return u1 += u0; // u1 <-- u0 + (u1-u0)( m0^{-1} mod m1 ) m0 242 236 }
