source: git/factory/variable.cc @ 59a678c

spielwiese
Last change on this file since 59a678c was 59a678c, checked in by Jens Schmidt <schmidt@…>, 27 years ago
#include <config.h> added delete something changed to delete [] something where necessary some casts added git-svn-id: file:///usr/local/Singular/svn/trunk@156 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 6.3 KB
Line 
1// emacs edit mode for this file is -*- C++ -*-
2// $Id: variable.cc,v 1.3 1997-04-15 09:44:26 schmidt Exp $
3
4/*
5$Log: not supported by cvs2svn $
6Revision 1.2  1997/03/27 10:24:37  schmidt
7stream-io wrapped by NOSTREAMIO
8
9Revision 1.1  1996/12/05 18:24:56  schmidt
10``Unconditional'' check-in.
11Now it is my turn to develop factory.
12
13// Revision 1.0  1996/05/17  10:59:47  stobbe
14// Initial revision
15//
16*/
17
18#include <config.h>
19
20#include <string.h>
21
22#include "assert.h"
23
24#include "cf_defs.h"
25#include "variable.h"
26#include "canonicalform.h"
27#include "cf_factory.h"
28#include "int_poly.h"
29#include "cf_iter.h"
30
31class ext_entry
32{
33private:
34    InternalPoly * _mipo;
35    bool _reduce;
36public:
37    ext_entry () : _mipo(0), _reduce(false) {}
38    ext_entry ( InternalPoly * mipoly, bool reduce ) : _mipo(mipoly), _reduce(reduce) {};
39    ext_entry ( const ext_entry & e ) : _mipo(e._mipo), _reduce(e._reduce) {}
40    ~ext_entry () {};
41    ext_entry & operator= ( const ext_entry & e )
42    {
43        if ( this != &e ) {
44            _mipo = e._mipo;
45            _reduce = e._reduce;
46        }
47        return *this;
48    }
49    InternalPoly * mipo () { return _mipo; }
50    void setmipo( InternalPoly * p ) { _mipo = p; }
51    bool & reduce () { return _reduce; }
52};
53
54static ext_entry * algextensions = 0;
55static char * var_names = 0;
56static char * var_names_ext = 0;
57static char default_name = 'v';
58static char default_name_ext = 'a';
59
60Variable::Variable( int l, bool flag ) : _level(l)
61{
62    ASSERT( flag, "illegal level" );
63}
64
65Variable::Variable( int l ) : _level(l)
66{
67    ASSERT( l > 0 && l != LEVELQUOT, "illegal level" );
68}
69
70Variable::Variable( char name )
71{
72    bool isext = false;
73    int n, i;
74    if ( var_names_ext != 0 ) {
75        n = strlen( var_names_ext );
76        i = 1;
77        while ( i < n && var_names_ext[i] != name ) i++;
78        if ( i < n ) {
79            _level = -i;
80            isext = true;
81        }
82    }
83    if ( ! isext ) {
84        if ( var_names == 0 ) {
85            var_names = new char [3];
86            var_names[0] = '@';
87            var_names[1] = name;
88            var_names[2] = '\0';
89            _level = 1;
90        }
91        else {
92            n = strlen( var_names );
93            i = 1;
94            while ( i < n && var_names[i] != name ) i++;
95            if ( i < n )
96                _level = i;
97            else {
98                ASSERT( name != '@', "illegal variable name" );
99                char * newvarnames = new char [n+2];
100                for ( i = 0; i < n; i++ )
101                    newvarnames[i] = var_names[i];
102                newvarnames[n] = name;
103                newvarnames[n+1] = 0;
104                delete [] var_names;
105                var_names = newvarnames;
106                _level = n;
107            }
108        }
109    }
110}
111
112Variable::Variable( int l, char name ) : _level(l)
113{
114    ASSERT( l > 0 && l != LEVELQUOT, "illegal level" );
115    int n;
116    if ( (n = (var_names == 0 ? 0 : strlen( var_names ))) <= l ) {
117        char * newvarnames = new char [l+2];
118        int i;
119        for ( i = 0; i < n; i++ )
120            newvarnames[i] = var_names[i];
121        for ( i = n; i < l; i++ )
122            newvarnames[i] = '@';
123        newvarnames[l] = name;
124        newvarnames[l+1] = 0;
125        delete [] var_names;
126        var_names = newvarnames;
127    }
128    else {
129        ASSERT( var_names[l] == '@', "illegal name" );
130        var_names[l] = name;
131    }
132}
133
134char
135Variable::name() const
136{
137    if ( _level > 0 && _level < (int)strlen( var_names ) )
138        return( var_names[_level] );
139    else if ( _level < 0 && -_level < (int)strlen( var_names_ext ) )
140        return( var_names_ext[-_level] );
141    else
142        return '@';
143}
144
145#ifndef NOSTREAMIO
146ostream & operator << ( ostream & os, const Variable & v )
147{
148    if ( v._level == LEVELBASE )
149        os << "1";
150    else {
151        char * vn = ( v._level > 0 ) ? var_names : var_names_ext;
152        char dn = ( v._level > 0 ) ? default_name : default_name_ext;
153        int l = v._level;
154
155        if ( l < 0 ) l = -l;
156        if ( (vn == 0) || ((int)strlen( vn ) <= l) )
157            os << dn << "_" << l;
158        else  if ( vn[l] == '@' )
159            os << dn << "_" << l;
160        else
161            os << vn[l];
162    }
163    return os;
164}
165#endif /* NOSTREAMIO */
166
167static bool legal_mipo( const CanonicalForm & mipo )
168{
169    ASSERT( mipo.inPolyDomain(), "not a legal extension" );
170    bool ok = true;
171    for ( CFIterator i = mipo; ok && i.hasTerms(); i++ )
172        ok = i.coeff().inBaseDomain();
173    return ok;
174}
175
176static CanonicalForm conv2mipo ( const CanonicalForm & mipo, const Variable alpha )
177{
178    CanonicalForm result;
179    for ( CFIterator i = mipo; i.hasTerms(); i++ )
180        result += i.coeff() * power( alpha, i.exp() );
181    return result;
182}
183
184Variable rootOf( const CanonicalForm & mipo, char name )
185{
186    ASSERT( legal_mipo( mipo ), "not a legal extension" );
187
188    int l;
189    if ( var_names_ext == 0 ) {
190        var_names_ext = new char [3];
191        var_names_ext[0] = '@';
192        var_names_ext[1] = name;
193        var_names_ext[2] = '\0';
194        l = 1;
195        Variable result( -l, true );
196        algextensions = new ext_entry [2];
197        algextensions[1] = ext_entry( 0, false );
198        algextensions[1] = ext_entry( (InternalPoly*)(conv2mipo( mipo, result ).getval()), true );
199        return result;
200    }
201    else {
202        int i, n = strlen( var_names_ext );
203        char * newvarnames = new char [n+2];
204        for ( i = 0; i < n; i++ )
205            newvarnames[i] = var_names_ext[i];
206        newvarnames[n] = name;
207        newvarnames[n+1] = 0;
208        delete [] var_names_ext;
209        var_names_ext = newvarnames;
210        l = n;
211        Variable result( -l, true );
212        ext_entry * newalgext = new ext_entry [n+1];
213        for ( i = 0; i < n; i++ )
214            newalgext[i] = algextensions[i];
215        newalgext[n] = ext_entry( 0, false );
216        delete [] algextensions;
217        algextensions = newalgext;
218        algextensions[n] = ext_entry( (InternalPoly*)(conv2mipo( mipo, result ).getval()), true );
219        return result;
220    }
221}
222
223InternalPoly * getInternalMipo ( const Variable & alpha )
224{
225    ASSERT( alpha.level() < 0 && alpha.level() != LEVELBASE, "illegal extension" );
226    return algextensions[-alpha.level()].mipo();
227}
228
229CanonicalForm getMipo( const Variable & alpha, const Variable & x )
230{
231    ASSERT( alpha.level() < 0 && alpha.level() != LEVELBASE, "illegal extension" );
232    return CanonicalForm( algextensions[-alpha.level()].mipo()->copyObject() )(x,alpha);
233}
234
235CanonicalForm getMipo( const Variable & alpha )
236{
237    ASSERT( alpha.level() < 0 && alpha.level() != LEVELBASE, "illegal extension" );
238    return CanonicalForm( algextensions[-alpha.level()].mipo()->copyObject() );
239}
240
241bool getReduce( const Variable & alpha )
242{
243    ASSERT( alpha.level() < 0 && alpha.level() != LEVELBASE, "illegal extension" );
244    return algextensions[-alpha.level()].reduce();
245}
246
247void setReduce( const Variable & alpha, bool reduce )
248{
249    ASSERT( alpha.level() < 0 && alpha.level() != LEVELBASE, "illegal extension" );
250    algextensions[-alpha.level()].reduce() = reduce;
251}
252
253char getDefaultVarName()
254{
255    return default_name;
256}
257
258char getDefaultExtName()
259{
260    return default_name_ext;
261}
Note: See TracBrowser for help on using the repository browser.