source: git/factory/cf_generator.cc @ 1e5c50

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