1 #ifndef POWER_SERIES_HEADER 2 #define POWER_SERIES_HEADER 3 #include <kernel/mod2.h> 4 #include <kernel/Poly.h> 5 template <class traits> class PowerSeriesInputIterator: 6 public std:: 7 iterator< 8 std::input_iterator_tag, 9 typename traits::expansion_type, 10 int, 11 shared_ptr<const typename traits::expansion_type>, 12 const typename traits::expansion_type 13 > { 14 private: 15 typedef typename traits::denominator_type denominator_type; 16 typedef typename traits::numerator_type numerator_type; 17 typedef typename traits::expansion_type expansion_type; 18 denominator_type denominator; 19 numerator_type numerator; 20 denominator_type toPot; 21 int state; 22 expansion_type data; 23 denominator_type lastPot; 24 public: PowerSeriesInputIterator(numerator_type num_arg,denominator_type den_arg)25 PowerSeriesInputIterator(numerator_type num_arg, 26 denominator_type den_arg): 27 data(den_arg.getRing()), 28 lastPot(den_arg.getRing()), 29 numerator(num_arg), 30 denominator(den_arg){ 31 32 ring r=denominator.getRing(); 33 34 //not the lead coef Number c=denominator.leadCoef(); 35 Number c(1,r); 36 typename traits::denominator_type::iterator it=denominator.begin(); 37 typename traits::denominator_type::iterator end=denominator.end(); 38 while(it!=end){ 39 40 if ((*it).isConstant()){ 41 //change this type 42 c=denominator_type(*it).leadCoef(); 43 44 break; 45 } 46 47 ++it; 48 49 50 51 } 52 c=Number(1,r)/c; 53 numerator*=c; 54 denominator*=c; 55 toPot=denominator+denominator_type(-1,r); 56 57 toPot*=Number(-1,r); 58 //change this type 59 lastPot=denominator_type(1,r); 60 data=numerator; 61 state=0; 62 63 } PowerSeriesInputIterator()64 PowerSeriesInputIterator(){ 65 state=-1; 66 } shorten()67 void shorten(){ 68 typename expansion_type::iterator it=data.begin(); 69 typename expansion_type::iterator end=data.end(); 70 ring r=data.getRing(); 71 expansion_type remove(r); 72 while(it!=end){ 73 if(it->lmTotalDegree()<state){ 74 remove+=expansion_type(*it); 75 } 76 it++; 77 } 78 remove*=Number(-1,r); 79 data+=remove; 80 } getValue()81 expansion_type getValue(){ 82 typename expansion_type::iterator it=data.begin(); 83 typename expansion_type::iterator end=data.end(); 84 ring r=data.getRing(); 85 expansion_type res(r); 86 while(it!=end){ 87 if(it->lmTotalDegree()==state) 88 { 89 res+=expansion_type(*it); 90 } 91 it++; 92 } 93 return res; 94 } 95 PowerSeriesInputIterator& operator++(){ 96 state++; 97 shorten(); 98 lastPot*=toPot; 99 100 data+=lastPot*numerator; 101 102 103 return *this; 104 105 } 106 //bad if this are iterators for different PowerSeries 107 bool operator==(const PowerSeriesInputIterator& t2){ 108 return state==t2.state; 109 } 110 bool operator!=(const PowerSeriesInputIterator& t2){ 111 return state!=t2.state; 112 } 113 114 115 116 PowerSeriesInputIterator operator++(int){ 117 PowerSeriesInputIterator it(*this); 118 ++(*this); 119 return it; 120 } 121 const expansion_type operator*(){ 122 return expansion_type(getValue()); 123 } 124 shared_ptr<const expansion_type> operator->(){ 125 return shared_ptr<const expansion_type>(new expansion_type(getValue())); 126 } 127 }; 128 129 130 template<class traits> class PowerSeriesBase{ 131 public: 132 typedef typename traits::denominator_type denominator_type; 133 typedef typename traits::numerator_type numerator_type; 134 protected: 135 denominator_type denominator; 136 numerator_type numerator; 137 public: 138 PowerSeriesBase()139 PowerSeriesBase(){ 140 } PowerSeriesBase(const numerator_type & a,const denominator_type & b)141 PowerSeriesBase(const numerator_type &a, const denominator_type & b):numerator(a),denominator(b){ 142 assume(a.getRing()==b.getRing()); 143 //asume b!=NULL 144 } 145 typedef PowerSeriesInputIterator<traits> iterator; begin()146 iterator begin(){ 147 return iterator(numerator,denominator); 148 } end()149 iterator end(){ 150 return iterator(); 151 } 152 153 154 }; 155 class PowerSeriesPolyTraits; 156 class PowerSeriesVectorTraits; 157 typedef PowerSeriesBase<PowerSeriesPolyTraits> PowerSeries; 158 typedef PowerSeriesBase<PowerSeriesVectorTraits> VectorPowerSeries; 159 class PowerSeriesPolyTraits{ 160 public: 161 typedef Poly numerator_type; 162 typedef Poly denominator_type; 163 typedef PowerSeries create_type; 164 typedef Poly expansion_type; 165 }; 166 class PowerSeriesVectorTraits{ 167 public: 168 typedef Vector numerator_type; 169 typedef Poly denominator_type; 170 typedef VectorPowerSeries create_type; 171 typedef Vector expansion_type; 172 }; 173 174 175 #endif 176