source: git/factory/cf_generator.cc @ 37f64cb

spielwiese
Last change on this file since 37f64cb was 67294f1, checked in by Martin Lee <martinlee84@…>, 10 years ago
chg: move IntGenerator from facAlgFuncUtil to cf_generator
  • Property mode set to 100644
File size: 4.2 KB
Line 
1/* emacs edit mode for this file is -*- C++ -*- */
2
3
4#include "config.h"
5
6
7#include "cf_assert.h"
8
9#include "cf_defs.h"
10#include "cf_generator.h"
11#include "imm.h"
12#include "gfops.h"
13#include "ffops.h"
14
15bool IntGenerator::hasItems() const
16{
17    return 1;
18}
19
20CanonicalForm IntGenerator::item() const
21{
22  return mapinto (CanonicalForm (current));
23}
24
25void IntGenerator::next()
26{
27    current++;
28}
29
30CFGenerator * IntGenerator::clone () const
31{
32    return new IntGenerator();
33}
34
35bool FFGenerator::hasItems() const
36{
37    return current < ff_prime;
38}
39
40CanonicalForm FFGenerator::item() const
41{
42    ASSERT( current < ff_prime, "no more items" );
43    return CanonicalForm( int2imm_p( current ) );
44}
45
46void FFGenerator::next()
47{
48    ASSERT( current < ff_prime, "no more items" );
49    current++;
50}
51
52CFGenerator * FFGenerator::clone () const
53{
54    return new FFGenerator();
55}
56
57GFGenerator::GFGenerator()
58{
59    current = gf_zero();
60}
61
62bool GFGenerator::hasItems() const
63{
64    return ( current != gf_q + 1 );
65}
66
67void GFGenerator::reset()
68{
69    current = gf_zero();
70}
71
72CanonicalForm GFGenerator::item() const
73{
74    ASSERT( current != gf_q + 1, "no more items" );
75    return CanonicalForm( int2imm_gf( current ) );
76}
77
78void GFGenerator::next()
79{
80    ASSERT( current != gf_q + 1, "no more items" );
81    if ( gf_iszero( current ) )
82        current = 0;
83    else  if ( current == gf_q1 - 1 )
84        current = gf_q + 1;
85    else
86        current++;
87}
88
89CFGenerator * GFGenerator::clone () const
90{
91    return new GFGenerator();
92}
93
94AlgExtGenerator::AlgExtGenerator()
95{
96    ASSERT( 0, "not a valid generator" );
97}
98
99AlgExtGenerator::AlgExtGenerator( const AlgExtGenerator & )
100{
101    ASSERT( 0, "not a valid generator" );
102}
103
104AlgExtGenerator& AlgExtGenerator::operator= ( const AlgExtGenerator & )
105{
106    ASSERT( 0, "not a valid generator" );
107    return *this;
108}
109
110AlgExtGenerator::AlgExtGenerator( const Variable & a )
111{
112    ASSERT( a.level() < 0, "not an algebraic extension" );
113    ASSERT( getCharacteristic() > 0, "not a finite field" );
114    algext = a;
115    n = degree( getMipo( a ) );
116    if ( getGFDegree() > 1 )
117    {
118      gensg = new GFGenerator * [n];
119      for ( int i = 0; i < n; i++ )
120        gensg[i] = new GFGenerator();
121    }
122    else
123    {
124      gensf = new FFGenerator * [n];
125      for ( int i = 0; i < n; i++ )
126        gensf[i] = new FFGenerator();
127    }
128    nomoreitems = false;
129}
130
131AlgExtGenerator::~AlgExtGenerator()
132{
133    if ( getGFDegree() > 1 )
134    {
135      for ( int i = 0; i < n; i++ )
136        delete gensg[i];
137      delete [] gensg;
138    }
139    else
140    {
141      for ( int i = 0; i < n; i++ )
142        delete gensf[i];
143      delete [] gensf;
144    }
145}
146
147void AlgExtGenerator::reset()
148{
149    if ( getGFDegree() > 1 )
150    {
151      for ( int i = 0; i < n; i++ )
152        gensg[i]->reset();
153    }
154    else
155    {
156      for ( int i = 0; i < n; i++ )
157        gensf[i]->reset();
158    }
159    nomoreitems = false;
160}
161
162CanonicalForm AlgExtGenerator::item() const
163{
164    ASSERT( ! nomoreitems, "no more items" );
165    CanonicalForm result = 0;
166    if ( getGFDegree() > 1 )
167    {
168      for ( int i = 0; i < n; i++ )
169            result += power( algext, i ) * gensg[i]->item();
170    }
171    else
172    {
173      for ( int i = 0; i < n; i++ )
174            result += power( algext, i ) * gensf[i]->item();
175    }
176    return result;
177}
178
179void AlgExtGenerator::next()
180{
181    ASSERT( ! nomoreitems, "no more items" );
182    int i = 0;
183    bool stop = false;
184    if ( getGFDegree() > 1 )
185    {
186      while ( ! stop && i < n )
187      {
188            gensg[i]->next();
189            if ( ! gensg[i]->hasItems() )
190        {
191              gensg[i]->reset();
192              i++;
193            }
194            else
195              stop = true;
196      }
197    }
198    else
199    {
200      while ( ! stop && i < n )
201      {
202            gensf[i]->next();
203            if ( ! gensf[i]->hasItems() )
204        {
205              gensf[i]->reset();
206              i++;
207            }
208            else
209              stop = true;
210      }
211    }
212    if ( ! stop )
213        nomoreitems = true;
214}
215
216CFGenerator * AlgExtGenerator::clone () const
217{
218    return new AlgExtGenerator(algext);
219}
220
221CFGenerator * CFGenFactory::generate()
222{
223    if (getCharacteristic() == 0)
224        return new IntGenerator();
225    else if ( getGFDegree() > 1 )
226        return new GFGenerator();
227    else
228        return new FFGenerator();
229}
Note: See TracBrowser for help on using the repository browser.