Show
Ignore:
Timestamp:
06/03/08 21:24:57 (7 months ago)
Author:
pernet
Message:

* Change the design of fflas-bounds
* Modular<double> -> ModularBalanced?<double>
* Fix the winograd recursion issue (when some steps are done over the field)
* Fix a bunch of bugs
* Remove the template specialization by the Element (incompatible with the soon coming compressed representations over small fields)
* Create a randiter file, generic wrt the modular field

Files:
1 modified

Legend:

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

    r26 r62  
    1212 */ 
    1313 
     14#ifndef __MODULAR_BALANCED_H 
     15#define __MODULAR_BALANCED_H 
     16 
    1417#include <math.h> 
    15  
    16  
    17 #ifndef __MODULAR_DOUBLE_BALANCED_H 
    18 #define __MODULAR_DOUBLE_BALANCED_H 
    19  
    20 template <class T> 
    21 class Modular; 
     18#include "fflas-ffpack/modular-randiter.h" 
    2219 
    2320template <class Element> 
    24 class ModularRandIter 
    25 { 
    26 public: 
    27         ModularRandIter (const Modular<Element> &F):_F(F){} 
    28         ModularRandIter (const ModularRandIter<Element> &R)  
    29                 : _F (R._F) {} 
    30         Element &random (Element &a) const 
    31         { return _F.init(a,(double)rand()); } 
    32 private: 
    33         Modular<Element> _F; 
    34          
    35 }; 
     21class ModularBalanced; 
    3622 
    3723template<> 
    38 class Modular <double>{ 
     24class ModularBalanced <double>{ 
    3925 
    4026protected: 
     
    4733        typedef double Element; 
    4834        typedef unsigned long FieldInt; 
    49         typedef ModularRandIter<double> RandIter; 
     35        typedef ModularBalancedRandIter<double> RandIter; 
    5036 
    5137        const bool balanced; 
    5238 
    53         Modular<double> (int p)  : modulus((double)p), inv_modulus(1./(double)p), half_mod( (p-1.)/2), balanced(true) {} 
    54  
    55         Modular<double>(const Modular<double>& mf) : modulus(mf.modulus), inv_modulus(mf.inv_modulus), half_mod(mf.half_mod), balanced(true){} 
    56          
    57         const Modular<double> &operator=(const Modular<double> &F) { 
     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){} 
     42         
     43        const ModularBalanced<double> &operator=(const ModularBalanced<double> &F) { 
    5844                        modulus = F.modulus; 
    5945                        inv_modulus = F.inv_modulus; 
     
    242228                return init( r, tmp ); 
    243229        } 
     230 
     231        static inline double getMaxModulus() 
     232        { return 67108864.0; } // 2^26 
    244233                 
    245234}; 
    246235template<> 
    247 class Modular <float>{ 
     236class ModularBalanced <float>{ 
    248237 
    249238protected: 
     
    256245        typedef float Element; 
    257246        typedef unsigned long FieldInt; 
    258         typedef ModularRandIter<float> RandIter; 
     247        typedef ModularBalancedRandIter<float> RandIter; 
    259248 
    260249        const bool balanced; 
    261250 
    262         Modular<float> (int p)  : modulus((float)p), inv_modulus(1./(float)p), half_mod( (p-1.)/2), balanced(true) {} 
    263  
    264         Modular<float>(const Modular<float>& mf) : modulus(mf.modulus), inv_modulus(mf.inv_modulus), half_mod(mf.half_mod), balanced(true){} 
    265          
    266         const Modular<float> &operator=(const Modular<float> &F) { 
     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){} 
     254         
     255        const ModularBalanced<float> &operator=(const ModularBalanced<float> &F) { 
    267256                        modulus = F.modulus; 
    268257                        inv_modulus = F.inv_modulus; 
     
    271260                } 
    272261 
    273          
    274          
    275          
    276          
    277262        FieldInt &cardinality (FieldInt &c) const{  
    278263                return c = (FieldInt) modulus; 
     
    462447                return init( r, tmp ); 
    463448        } 
     449        static inline float getMaxModulus() 
     450        { return 2048; } // 2^11 
    464451                 
    465452};