source: git/factory/cf_generator.cc @ b1dfaf

spielwiese
Last change on this file since b1dfaf was 341696, checked in by Hans Schönemann <hannes@…>, 14 years ago
Adding Id property to all files git-svn-id: file:///usr/local/Singular/svn/trunk@12231 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 3.5 KB
Line 
1/* emacs edit mode for this file is -*- C++ -*- */
2/* $Id$ */
3
4#include <config.h>
5
6#include "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
31
32GFGenerator::GFGenerator()
33{
34    current = gf_zero();
35}
36
37bool GFGenerator::hasItems() const
38{
39    return ( current != gf_q + 1 );
40}
41
42void GFGenerator::reset()
43{
44    current = gf_zero();
45}
46
47CanonicalForm GFGenerator::item() const
48{
49    ASSERT( current != gf_q + 1, "no more items" );
50    return CanonicalForm( int2imm_gf( current ) );
51}
52
53void GFGenerator::next()
54{
55    ASSERT( current != gf_q + 1, "no more items" );
56    if ( gf_iszero( current ) )
57        current = 0;
58    else  if ( current == gf_q1 - 1 )
59        current = gf_q + 1;
60    else
61        current++;
62}
63
64AlgExtGenerator::AlgExtGenerator()
65{
66    ASSERT( 0, "not a valid generator" );
67}
68
69AlgExtGenerator::AlgExtGenerator( const AlgExtGenerator & )
70{
71    ASSERT( 0, "not a valid generator" );
72}
73
74AlgExtGenerator& AlgExtGenerator::operator= ( const AlgExtGenerator & )
75{
76    ASSERT( 0, "not a valid generator" );
77    return *this;
78}
79
80AlgExtGenerator::AlgExtGenerator( const Variable & a )
81{
82    ASSERT( a.level() < 0, "not an algebraic extension" );
83    ASSERT( getCharacteristic() > 0, "not a finite field" );
84    algext = a;
85    n = degree( getMipo( a ) );
86    if ( getGFDegree() > 1 )
87    {
88      gensg = new GFGenerator * [n];
89      for ( int i = 0; i < n; i++ )
90        gensg[i] = new GFGenerator();
91    }
92    else
93    {
94      gensf = new FFGenerator * [n];
95      for ( int i = 0; i < n; i++ )
96        gensf[i] = new FFGenerator();
97    }
98    nomoreitems = false;
99}
100
101AlgExtGenerator::~AlgExtGenerator()
102{
103    if ( getGFDegree() > 1 )
104    {
105      for ( int i = 0; i < n; i++ )
106        delete gensg[i];
107      delete [] gensg;
108    }
109    else
110    {
111      for ( int i = 0; i < n; i++ )
112        delete gensf[i];
113      delete [] gensf;
114    }
115}
116
117void AlgExtGenerator::reset()
118{
119    if ( getGFDegree() > 1 )
120    {
121      for ( int i = 0; i < n; i++ )
122        gensg[i]->reset();
123    }
124    else
125    {
126      for ( int i = 0; i < n; i++ )
127        gensf[i]->reset();
128    }
129    nomoreitems = false;
130}
131
132CanonicalForm AlgExtGenerator::item() const
133{
134    ASSERT( ! nomoreitems, "no more items" );
135    CanonicalForm result = 0;
136    if ( getGFDegree() > 1 )
137    {
138      for ( int i = 0; i < n; i++ )
139            result += power( algext, i ) * gensg[i]->item();
140    }
141    else
142    {
143      for ( int i = 0; i < n; i++ )
144            result += power( algext, i ) * gensf[i]->item();
145    }
146    return result;
147}
148
149void AlgExtGenerator::next()
150{
151    ASSERT( ! nomoreitems, "no more items" );
152    int i = 0;
153    bool stop = false;
154    if ( getGFDegree() > 1 )
155    {
156      while ( ! stop && i < n )
157      {
158        gensg[i]->next();
159            if ( ! gensg[i]->hasItems() )
160        {
161              gensg[i]->reset();
162              i++;
163            }
164            else
165              stop = true;
166      }
167    }
168    else
169    {
170      while ( ! stop && i < n )
171      {
172        gensf[i]->next();
173            if ( ! gensf[i]->hasItems() )
174        {
175              gensf[i]->reset();
176              i++;
177            }
178            else
179              stop = true;
180      }
181    }
182    if ( ! stop )
183        nomoreitems = true;
184}
185
186CFGenerator * CFGenFactory::generate()
187{
188    ASSERT( getCharacteristic() > 0, "not a finite field" );
189    if ( getGFDegree() > 1 )
190        return new GFGenerator();
191    else
192        return new FFGenerator();
193}
Note: See TracBrowser for help on using the repository browser.