Show
Ignore:
Timestamp:
06/05/08 14:58:48 (6 months ago)
Author:
pernet
Message:

Update the randiter:
* add the non-zero randiter class (following LinBox? structure)
* modify finite fields accordingly
* Update implementation of finite fields to fix bugs, improve efficiency and readability
* minor tweeks

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • include/fflas-ffpack/modular-balanced.h

    r62 r66  
    1717#include <math.h> 
    1818#include "fflas-ffpack/modular-randiter.h" 
     19#include "fflas-ffpack/nonzero-randiter.h" 
    1920 
    2021template <class Element> 
     
    2627protected: 
    2728        double modulus; 
    28         double inv_modulus; 
    2929        double half_mod; 
    30  
     30        unsigned long lmodulus; 
    3131        
    3232public:         
     
    3434        typedef unsigned long FieldInt; 
    3535        typedef ModularBalancedRandIter<double> RandIter; 
     36        typedef NonzeroRandIter<ModularBalanced<double>, ModularBalancedRandIter<double> >  NonZeroRandIter; 
    3637 
    3738        const bool balanced; 
    3839 
    39         ModularBalanced<double> (int p)  : modulus((double)p), inv_modulus(1./(double)p), half_mod( (p-1.)/2), balanced(true) {} 
    40  
    41         ModularBalanced<double>(const ModularBalanced<double>& mf) : modulus(mf.modulus), inv_modulus(mf.inv_modulus), half_mod(mf.half_mod), balanced(true){} 
     40        ModularBalanced<double> (int p) : modulus((double)p), 
     41                half_mod( (p-1.)/2), 
     42                balanced(true) {} 
     43 
     44        ModularBalanced<double>(const ModularBalanced<double>& mf) 
     45        : modulus(mf.modulus), half_mod(mf.half_mod), balanced(true){} 
    4246         
    4347        const ModularBalanced<double> &operator=(const ModularBalanced<double> &F) { 
    4448                        modulus = F.modulus; 
    45                         inv_modulus = F.inv_modulus; 
    4649                        half_mod = F.half_mod; 
    4750                        return *this; 
     
    7073                 
    7174        std::ostream &write (std::ostream &os) const { 
    72                 return os << "int mod " << (int)modulus; 
     75                return os << "double mod " << (int)modulus; 
    7376        } 
    7477         
     
    9699        } 
    97100 
    98         inline Element& init(Element& x, double y =0) const {              
     101        inline Element& init(Element& x, const double y =0) const {                
    99102                double tmp; 
    100103                 
     
    131134                if ( x > half_mod ) return x -= modulus; 
    132135                if ( x < -half_mod ) return x += modulus;  
    133                 else return x; 
     136                return x; 
    134137        } 
    135138  
     
    137140                x = y - z; 
    138141                if (x > half_mod) return x -= modulus; 
    139                 else if (x < -half_mod) return x += modulus; 
    140                 else return x; 
     142                if (x < -half_mod) return x += modulus; 
     143                return x; 
    141144        } 
    142145                 
    143146        inline Element &mul (Element &x, const Element &y, const Element &z) const {             
    144147                double tmp= y*z; 
    145                 //x= tmp - floor(tmp*inv_modulus)*modulus; 
    146148                return init (x, tmp); 
    147149        } 
     
    187189                              const Element &y) const { 
    188190                double tmp= a*x+y; 
    189                 //return r = tmp- floor(tmp*inv_modulus)*modulus;  
    190191                return init( r, tmp); 
    191  
    192192        } 
    193193 
     
    196196                if ( x > half_mod ) return x -= modulus; 
    197197                if ( x < -half_mod ) return x += modulus;  
    198                 else return x; 
     198                return x; 
    199199        } 
    200200  
     
    203203                if ( x > half_mod ) return x -= modulus; 
    204204                if ( x < -half_mod ) return x += modulus;  
    205                 else return x; 
     205                return x; 
    206206        } 
    207207  
     
    224224                 
    225225        inline Element &axpyin (Element &r, const Element &a, const Element &x) const { 
    226                 double tmp=r+a*x; 
    227                 //return r= tmp- floor(tmp*inv_modulus)*modulus;  
    228                 return init( r, tmp ); 
     226                r += a * x; 
     227                return init( r, r); 
    229228        } 
    230229 
     
    238237protected: 
    239238        float modulus; 
    240         float inv_modulus; 
    241239        float half_mod; 
    242240 
     
    246244        typedef unsigned long FieldInt; 
    247245        typedef ModularBalancedRandIter<float> RandIter; 
     246        typedef NonzeroRandIter<ModularBalanced<float>, RandIter> NonZeroRandIter; 
    248247 
    249248        const bool balanced; 
    250249 
    251         ModularBalanced<float> (int p)  : modulus((float)p), inv_modulus(1./(float)p), half_mod( (p-1.)/2), balanced(true) {} 
    252  
    253         ModularBalanced<float>(const ModularBalanced<float>& mf) : modulus(mf.modulus), inv_modulus(mf.inv_modulus), half_mod(mf.half_mod), balanced(true){} 
     250        ModularBalanced<float> (int p)  : modulus((float)p), half_mod( (p-1.)/2), balanced(true) {} 
     251 
     252        ModularBalanced<float>(const ModularBalanced<float>& mf) : modulus(mf.modulus), half_mod(mf.half_mod), balanced(true){} 
    254253         
    255254        const ModularBalanced<float> &operator=(const ModularBalanced<float> &F) { 
    256255                        modulus = F.modulus; 
    257                         inv_modulus = F.inv_modulus; 
    258256                        half_mod = F.half_mod; 
    259257                        return *this; 
     
    361359                 
    362360        inline Element &mul (Element &x, const Element &y, const Element &z) const {             
    363                 float tmp= y*z; 
    364                 //x= tmp - floor(tmp*inv_modulus)*modulus; 
    365                 return init (x, tmp); 
     361                x = y*z; 
     362                return init (x, x); 
    366363        } 
    367364  
    368365        inline Element &div (Element &x, const Element &y, const Element &z) const { 
    369                 Element temp; 
    370                 inv (temp, z); 
    371                 return mul (x, y, temp); 
     366                inv (x, z); 
     367                return mulin (x, y); 
    372368        } 
    373369  
     
    405401                              const Element &x,  
    406402                              const Element &y) const { 
    407                 float tmp= a*x+y; 
    408                 //return r = tmp- floor(tmp*inv_modulus)*modulus;  
    409                 return init( r, tmp); 
     403                r = a * x + y; 
     404                return init( r, r); 
    410405 
    411406        } 
     
    443438                 
    444439        inline Element &axpyin (Element &r, const Element &a, const Element &x) const { 
    445                 float tmp=r+a*x; 
    446                 //return r= tmp- floor(tmp*inv_modulus)*modulus;  
    447                 return init( r, tmp ); 
     440                r += a * x; 
     441                return init( r, r); 
    448442        } 
    449443        static inline float getMaxModulus()