source: git/Singular/fglmgauss.cc @ 5480da

spielwiese
Last change on this file since 5480da was 69bba6, checked in by Wilfred Pohl <pohl@…>, 26 years ago
constructor for mac git-svn-id: file:///usr/local/Singular/svn/trunk@1095 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 4.7 KB
Line 
1// emacs edit mode for this file is -*- C++ -*-
2// $Id: fglmgauss.cc,v 1.5 1998-01-27 16:47:29 pohl Exp $
3
4/****************************************
5*  Computer Algebra System SINGULAR     *
6****************************************/
7/*
8* ABSTRACT - class gaussReducer. Used in fglmzero.cc and fglmhom.cc
9*  to find linear dependecies of fglmVectors.
10*/
11
12#include "mod2.h"
13
14#ifdef  HAVE_FACTORY
15#include "structs.h"
16#include "numbers.h"
17#include "mmemory.h"
18
19#include "fglmvec.h"
20#include "fglmgauss.h"
21
22class gaussElem
23{
24public:
25    fglmVector v;
26    fglmVector p;
27    number pdenom;
28    number fac;
29    gaussElem( const fglmVector newv, const fglmVector newp, number & newpdenom, number & newfac ) : v( newv ), p( newp ), pdenom( newpdenom ), fac( newfac ) 
30    {
31        newpdenom= NULL;
32        newfac= NULL;
33    }
34#ifdef macintosh
35    void mac_gaussElem( const fglmVector newv, const fglmVector newp, number & newpdenom, number & newfac )
36    {
37    v= newv;
38    p= newp;
39    pdenom=newpdenom;
40    fac=newfac;
41        newpdenom= NULL;
42        newfac= NULL;
43    }
44#endif
45    ~gaussElem() 
46    {
47        nDelete( & pdenom );
48        nDelete( & fac );
49    }
50};
51
52gaussReducer::gaussReducer( int dimen ) 
53{
54    int k;
55    size= 0;
56    max= dimen;
57    elems= (gaussElem *)Alloc( (max+1)*sizeof( gaussElem ) );
58    isPivot= (BOOLEAN *)Alloc( (max+1)*sizeof( BOOLEAN ) );
59    for ( k= max; k > 0; k-- ) 
60            isPivot[k]= FALSE;
61    perm= (int *)Alloc( (max+1)*sizeof( int ) );
62}
63
64gaussReducer::~gaussReducer() 
65{
66    int k;
67    for ( k= size; k > 0; k-- ) 
68        elems[k].~gaussElem();
69    Free( (ADDRESS)elems, (max+1)*sizeof( gaussElem ) );
70    Free( (ADDRESS)isPivot, (max+1)*sizeof( BOOLEAN ) );
71    Free( (ADDRESS)perm, (max+1)*sizeof( int ) );
72}
73
74BOOLEAN
75gaussReducer::reduce( fglmVector thev ) 
76{
77    number fac1, fac2;
78    number temp;
79    // Hier ueberlegen, ob thev als referenz, oder wie wann was kopiert usw.
80    v= thev;
81    p= fglmVector( size + 1, size + 1 );
82    // fglmASSERT( pdenom == NULL );
83    pdenom= nInit( 1 );
84    number vdenom = v.clearDenom();
85    if ( ! nIsOne( vdenom ) && ! nIsZero( vdenom ) ) {
86        p.setelem( p.size(), vdenom );
87    }
88    else {
89        nDelete( & vdenom );
90    }
91    number gcd = v.gcd();
92    if ( ! nIsOne( gcd ) && ! nIsZero( gcd ) ) {
93        v /= gcd;
94        number temp= nMult( pdenom, gcd );
95        nDelete( & pdenom );
96        pdenom= temp;
97    }
98    nDelete( & gcd );
99   
100    int k;
101    for ( k= 1; k <= size; k++ ) {
102        if ( ! v.elemIsZero( perm[k] ) ) {
103            fac1= elems[k].fac;
104            fac2= nCopy( v.getconstelem( perm[k] ) );
105            v.nihilate( fac1, fac2, elems[k].v );
106            fac1= nMult( fac1, elems[k].pdenom );
107            temp= nMult( fac2, pdenom );
108            nDelete( & fac2 );
109            fac2= temp;
110            p.nihilate( fac1, fac2, elems[k].p );
111            temp= nMult( pdenom, elems[k].pdenom );
112            nDelete( & pdenom );
113            pdenom= temp;
114           
115            nDelete( & fac1 );
116            nDelete( & fac2 );
117            number gcd = v.gcd();
118            if ( ! nIsOne( gcd ) && ! nIsZero( gcd ) ) {
119                v/= gcd;
120                number temp = nMult( pdenom, gcd );
121                nDelete( & pdenom );
122                pdenom= temp;
123            }
124            nDelete( & gcd );
125            gcd= p.gcd();
126            temp= nGcd( pdenom, gcd );
127            nDelete( & gcd );
128            gcd= temp;
129            if ( ! nIsZero( gcd ) && ! nIsOne( gcd ) ) {
130                p/= gcd;
131                temp= nDiv( pdenom, gcd );
132                nDelete( & pdenom );
133                pdenom= temp;
134                nNormalize( pdenom );
135            }
136            nDelete( & gcd );
137        }
138    }
139    return ( v.isZero() );
140}
141
142void 
143gaussReducer::store() 
144{
145    // fglmASSERT( size < max );
146    number fac;
147    // find the pivot-element in v:
148   
149    size++;
150    int k= 1;
151    while ( nIsZero(v.getconstelem(k)) || isPivot[k] ) {
152        k++;
153    }
154    // fglmASSERT( k <= dimen, "Error(1) in fglmDdata::pivot-search");
155    number pivot= v.getconstelem( k );
156    int pivotcol = k;
157    k++;
158    while ( k <= max ) {
159        if ( ! nIsZero( v.getconstelem(k) ) && ! isPivot[k] ) {
160            if ( nGreater( v.getconstelem( k ), pivot ) ) {
161                pivot= v.getconstelem( k );
162                pivotcol= k;
163            }
164        }
165        k++;
166    }
167    // fglmASSERT( ! nIsZero( pivot ), "Error(2) fglmDdata::Pivotelement ist Null" );
168    isPivot[ pivotcol ]= TRUE;
169    perm[size]= pivotcol;
170   
171    pivot= nCopy( v.getconstelem( pivotcol ) );
172#ifdef macintosh
173    elems[size].mac_gaussElem( v, p, pdenom, pivot );
174#else
175    elems[size].gaussElem( v, p, pdenom, pivot );
176#endif
177}
178
179fglmVector
180gaussReducer::getDependence() 
181{
182    nDelete( & pdenom );
183    // hier kann p noch gekuerzt werden, je nach Charakteristik
184    fglmVector result = p;
185    p= fglmVector();
186    return ( result );
187}
188// ================================================================================
189
190// ----------------------------------------------------------------------------
191// Local Variables: ***
192// compile-command: "make Singular" ***
193// page-delimiter: "^\\(\\|//!\\)" ***
194// fold-internal-margins: nil ***
195// End: ***
196#endif // HAVE_FACTORY
Note: See TracBrowser for help on using the repository browser.