source: git/Singular/fglmgauss.cc @ 771533

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