source: git/factory/cf_generator.cc @ a9c298

fieker-DuValspielwiese
Last change on this file since a9c298 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
RevLine 
[493c477]1/* emacs edit mode for this file is -*- C++ -*- */
[2dd068]2
[16f511]3#ifdef HAVE_CONFIG_H
[e4fe2b]4#include "config.h"
[16f511]5#endif /* HAVE_CONFIG_H */
[ab4548f]6
[650f2d8]7#include "cf_assert.h"
[ab4548f]8
[2dd068]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
[99ffd8]32CFGenerator * FFGenerator::clone () const
33{
34    return new FFGenerator();
35}
[2dd068]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 ) )
[806c18]62        current = 0;
[2dd068]63    else  if ( current == gf_q1 - 1 )
[806c18]64        current = gf_q + 1;
[2dd068]65    else
[806c18]66        current++;
[2dd068]67}
68
[99ffd8]69CFGenerator * GFGenerator::clone () const
70{
71    return new GFGenerator();
72}
73
[2dd068]74AlgExtGenerator::AlgExtGenerator()
75{
76    ASSERT( 0, "not a valid generator" );
77}
78
79AlgExtGenerator::AlgExtGenerator( const AlgExtGenerator & )
80{
81    ASSERT( 0, "not a valid generator" );
[ab4548f]82}
[2dd068]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 ) );
[b96e07]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    }
[2dd068]108    nomoreitems = false;
109}
110
111AlgExtGenerator::~AlgExtGenerator()
112{
[b96e07]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    }
[2dd068]125}
126
127void AlgExtGenerator::reset()
128{
[b96e07]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    }
[2dd068]139    nomoreitems = false;
140}
141
142CanonicalForm AlgExtGenerator::item() const
143{
144    ASSERT( ! nomoreitems, "no more items" );
145    CanonicalForm result = 0;
[b96e07]146    if ( getGFDegree() > 1 )
147    {
148      for ( int i = 0; i < n; i++ )
[806c18]149            result += power( algext, i ) * gensg[i]->item();
[b96e07]150    }
151    else
152    {
153      for ( int i = 0; i < n; i++ )
[806c18]154            result += power( algext, i ) * gensf[i]->item();
[b96e07]155    }
[2dd068]156    return result;
157}
158
159void AlgExtGenerator::next()
160{
161    ASSERT( ! nomoreitems, "no more items" );
162    int i = 0;
163    bool stop = false;
[b96e07]164    if ( getGFDegree() > 1 )
165    {
166      while ( ! stop && i < n )
167      {
[806c18]168            gensg[i]->next();
169            if ( ! gensg[i]->hasItems() )
[b96e07]170        {
[806c18]171              gensg[i]->reset();
172              i++;
173            }
174            else
175              stop = true;
[b96e07]176      }
177    }
178    else
179    {
180      while ( ! stop && i < n )
181      {
[806c18]182            gensf[i]->next();
183            if ( ! gensf[i]->hasItems() )
[b96e07]184        {
[806c18]185              gensf[i]->reset();
186              i++;
187            }
188            else
189              stop = true;
[b96e07]190      }
[2dd068]191    }
192    if ( ! stop )
[806c18]193        nomoreitems = true;
[2dd068]194}
195
[99ffd8]196CFGenerator * AlgExtGenerator::clone () const
197{
198    return new AlgExtGenerator(algext);
199}
200
[2dd068]201CFGenerator * CFGenFactory::generate()
202{
203    ASSERT( getCharacteristic() > 0, "not a finite field" );
204    if ( getGFDegree() > 1 )
[806c18]205        return new GFGenerator();
[2dd068]206    else
[806c18]207        return new FFGenerator();
[2dd068]208}
Note: See TracBrowser for help on using the repository browser.