source: git/factory/cf_factory.cc @ 2dd068

spielwiese
Last change on this file since 2dd068 was 2dd068, checked in by Rüdiger Stobbe <stobbe@…>, 28 years ago
Initial revision git-svn-id: file:///usr/local/Singular/svn/trunk@6 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 6.4 KB
Line 
1// emacs edit mode for this file is -*- C++ -*-
2// $Id: cf_factory.cc,v 1.0 1996-05-17 10:59:43 stobbe Exp $
3
4/*
5$Log: not supported by cvs2svn $
6*/
7
8#include "assert.h"
9#include "cf_defs.h"
10#include "cf_factory.h"
11#include "canonicalform.h"
12#include "int_cf.h"
13#include "int_int.h"
14#include "int_rat.h"
15#include "int_poly.h"
16#include "int_pp.h"
17#include "imm.h"
18
19int CFFactory::currenttype = IntegerDomain;
20
21void
22CFFactory::settype ( int type )
23{
24    ASSERT( type==FiniteFieldDomain || type==GaloisFieldDomain || type==IntegerDomain || type==RationalDomain || type==PrimePowerDomain, "illegal basic domain!" );
25    currenttype = type;
26}
27
28InternalCF *
29CFFactory::basic ( int value )
30{
31    if ( currenttype == IntegerDomain )
32        if ( value >= MINIMMEDIATE && value <= MAXIMMEDIATE )
33            return int2imm( value );
34        else
35            return new InternalInteger( value );
36//     else  if ( currenttype == RationalDomain )
37//      if ( value >= MINIMMEDIATE && value <= MAXIMMEDIATE )
38//          return int2imm( value );
39//      else
40//          return new InternalRational( value );
41    else  if ( currenttype == FiniteFieldDomain )
42        return int2imm_p( ff_norm( value ) );
43    else  if ( currenttype == GaloisFieldDomain )
44        return int2imm_gf( gf_int2gf( value ) );
45    else  if ( currenttype == PrimePowerDomain )
46        return new InternalPrimePower( value );
47    else {
48        ASSERT( 0, "illegal basic domain!" );
49        return 0;
50    }
51}
52
53InternalCF *
54CFFactory::basic ( int type, int value )
55{
56    if ( type == IntegerDomain )
57        if ( value >= MINIMMEDIATE && value <= MAXIMMEDIATE )
58            return int2imm( value );
59        else
60            return new InternalInteger( value );
61//     else  if ( type == RationalDomain )
62//      if ( value >= MINIMMEDIATE && value <= MAXIMMEDIATE )
63//          return int2imm( value );
64//      else
65//          return new InternalRational( value );
66    else  if ( type == FiniteFieldDomain )
67        return int2imm_p( ff_norm( value ) );
68    else  if ( type == GaloisFieldDomain )
69        return int2imm_gf( gf_int2gf( value ) );
70    else  if ( type == PrimePowerDomain )
71        return new InternalPrimePower( value );
72    else {
73        cerr << "type = " << type << endl;
74        ASSERT( 0, "illegal basic domain!" );
75        return 0;
76    }
77}
78       
79InternalCF *
80CFFactory::basic ( const char * str )
81{
82    if ( currenttype == IntegerDomain ) {
83        InternalInteger * dummy = new InternalInteger( str );
84        if ( dummy->is_imm() ) {
85            InternalCF * res = int2imm( dummy->intval() );
86            delete dummy;
87            return res;
88        }
89        else
90            return dummy;
91    }
92//     else  if ( currenttype == RationalDomain ) {
93//      InternalRational * dummy = new InternalRational( str );
94//      if ( dummy->is_imm() ) {
95//          InternalCF * res = int2imm( dummy->intval() );
96//          delete dummy;
97//          return res;
98//      }
99//      else
100//          return dummy;
101//     }
102    else  if ( currenttype == FiniteFieldDomain ) {
103        InternalInteger * dummy = new InternalInteger( str );
104        InternalCF * res = int2imm_p( dummy->intmod( ff_prime ) );
105        delete dummy;
106        return res;
107    }
108    else  if ( currenttype == GaloisFieldDomain ) {
109        InternalInteger * dummy = new InternalInteger( str );
110        InternalCF * res = int2imm_gf( gf_int2gf( dummy->intmod( ff_prime ) ) );
111        delete dummy;
112        return res;
113    }
114    else  if ( currenttype == PrimePowerDomain )
115        return new InternalPrimePower( str );
116    else {
117        ASSERT( 0, "illegal basic domain!" );
118        return 0;
119    }
120}
121
122InternalCF *
123CFFactory::basic ( int type, const char * const str )
124{
125    if ( type == IntegerDomain ) {
126        InternalInteger * dummy = new InternalInteger( str );
127        if ( dummy->is_imm() ) {
128            InternalCF * res = int2imm( dummy->intval() );
129            delete dummy;
130            return res;
131        }
132        else
133            return dummy;
134    }
135//     else  if ( type == RationalDomain ) {
136//      InternalRational * dummy = new InternalRational( str );
137//      if ( dummy->is_imm() ) {
138//          InternalCF * res = int2imm( dummy->intval() );
139//          delete dummy;
140//          return res;
141//      }
142//      else
143//          return dummy;
144//     }
145    else  if ( type == FiniteFieldDomain ) {
146        InternalInteger * dummy = new InternalInteger( str );
147        InternalCF * res = int2imm( dummy->intmod( ff_prime ) );
148        delete dummy;
149        return res;
150    }
151    else  if ( type == GaloisFieldDomain ) {
152        InternalInteger * dummy = new InternalInteger( str );
153        InternalCF * res = int2imm_gf( gf_int2gf( dummy->intmod( ff_prime ) ) );
154        delete dummy;
155        return res;
156    }
157    else  if ( type == PrimePowerDomain )
158        return new InternalPrimePower( str );
159    else {
160        ASSERT( 0, "illegal basic domain!" );
161        return 0;
162    }
163}
164
165InternalCF *
166CFFactory::basic ( int type, int value, bool nonimm )
167{
168    if ( nonimm )
169        if ( type == IntegerDomain )
170            return new InternalInteger( value );
171        else  if ( type == RationalDomain )
172            return new InternalRational( value );
173        else {
174            ASSERT( 0, "illegal basic domain!" );
175            return 0;
176        }
177    else
178        return CFFactory::basic( type, value );
179}
180
181InternalCF *
182CFFactory::basic ( const MP_INT & num )
183{
184    if ( currenttype != IntegerDomain ) {
185        InternalPrimePower * dummy = new InternalPrimePower( num );
186        return (InternalCF*)(dummy->normalize_myself());
187    }
188    else
189        return new InternalInteger( num );
190}
191
192InternalCF *
193CFFactory::rational ( int num, int den )
194{
195    InternalRational * res = new InternalRational( num, den );
196    return res->normalize_myself();
197}
198
199InternalCF *
200CFFactory::rational ( const MP_INT & num, const MP_INT & den, bool normalize )
201{
202    if ( normalize ) {
203        InternalRational * result = new InternalRational( num, den );
204        return result->normalize_myself();
205    }
206    else
207        return new InternalRational( num, den );
208}
209
210InternalCF *
211CFFactory::poly (  const Variable & v, int exp, const CanonicalForm & c )
212{
213    if ( v.level() == LEVELBASE )
214        return c.getval();
215    else
216        return new InternalPoly( v, exp, c );
217}
218
219InternalCF *
220CFFactory::poly ( const Variable & v, int exp )
221{
222    if ( v.level() == LEVELBASE )
223        return CFFactory::basic( 1 );
224    else
225        return new InternalPoly( v, exp, 1 );
226}
227
228MP_INT getmpi ( InternalCF * value, bool symmetric )
229{
230    ASSERT( ! is_imm( value ) && ( value->levelcoeff() == PrimePowerDomain || value->levelcoeff() == IntegerDomain ), "illegal operation" );
231    MP_INT dummy;
232    if ( value->levelcoeff() == IntegerDomain )
233        mpz_init_set( &dummy, &InternalInteger::MPI( value ) );
234    else  if ( symmetric ) {
235        mpz_init( &dummy );
236        if ( mpz_cmp( &InternalPrimePower::primepowhalf, &InternalPrimePower::MPI( value ) ) < 0 )
237            mpz_sub( &dummy, &InternalPrimePower::MPI( value ), &InternalPrimePower::primepow );
238        else
239            mpz_set( &dummy, &InternalPrimePower::MPI( value ) );
240    }
241    else
242        mpz_init_set( &dummy, &InternalPrimePower::MPI( value ) );
243    return dummy;
244}       
Note: See TracBrowser for help on using the repository browser.