Show
Ignore:
Timestamp:
06/03/08 21:42:52 (6 months ago)
Author:
pernet
Message:

JGD & CPernet: faster reconstruction

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/linbox/linbox/algorithms/cra-full-multip.h

    r2943 r2960  
    11/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ 
    22// ======================================================================= // 
    3 // Time-stamp: <24 Apr 08 10:01:34 Jean-Guillaume.Dumas@imag.fr>  
     3// Time-stamp: <23 Apr 08 19:28:37 Jean-Guillaume.Dumas@imag.fr>  
    44// ======================================================================= // 
    55#ifndef __LINBOX_CRA_FULL_MULTIP_H 
     
    8989                                std::vector<Integer>::const_iterator t_it= _tab_it->begin(); 
    9090                                 
    91                                 Integer invm; inv(invm, _mod_it->operator()(), mi()); 
     91                                Integer invprod; precomputeInvProd(invprod, mi(), _mod_it->operator()()); 
    9292                                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);  
    9494 
    9595                                    // Product (lazy) computation 
    9696                                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                                } 
    97102 
    98103                                di += *_dsz_it; 
     
    157162                                std::vector<Integer>::iterator t0_it = d.begin(); 
    158163                                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()() ); 
    161166 
    162167                                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); 
    164169                                 
    165170                                    // Overall product computation 
     
    168173                                    // Moding out and normalization 
    169174                                for(t0_it = d.begin();t0_it != d.end(); ++t0_it) { 
     175                                    *t0_it %= Product(); 
    170176                                    Integer tmp(*t0_it); 
    171177                                    normalize(*t0_it, tmp, Product()); 
     
    219225protected: 
    220226         
    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 m1 
    225         u1 *= m0;         // u1 <-- (u1-u0)( m0^{-1} mod m1 ) m0  
    226         return u1 += u0;  // u1 <-- u0 + (u1-u0)( m0^{-1} mod m1 ) m0 
    227     } 
    228      
    229      
    230  
    231227    Integer& precomputeInvProd(Integer& res, const Integer& m1, const Integer& m0) { 
    232228        inv(res, m0, m1); 
     
    234230    } 
    235231 
    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) { 
    237233        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  
    241235        return u1 += u0;  // u1 <-- u0 + (u1-u0)( m0^{-1} mod m1 ) m0 
    242236    }