source: git/factory/cf_factory.cc @ 6c5d86

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