source: git/factory/cf_generator.cc @ e4fe2b

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