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