source: git/factory/cf_generator.cc @ 16f511

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