source: git/kernel/fglmgauss.cc @ 338842d

spielwiese
Last change on this file since 338842d was 35aab3, checked in by Hans Schönemann <hannes@…>, 20 years ago
This commit was generated by cvs2svn to compensate for changes in r6879, which included commits to RCS files with non-trunk default branches. git-svn-id: file:///usr/local/Singular/svn/trunk@6880 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 5.4 KB
Line 
1// emacs edit mode for this file is -*- C++ -*-
2// $Id: fglmgauss.cc,v 1.1.1.1 2003-10-06 12:15:52 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
14#ifdef  HAVE_FACTORY
15#include "structs.h"
16#include "numbers.h"
17#include "omalloc.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
35#ifndef HAVE_EXPLICIT_CONSTR
36  gaussElem() : v(), p(), pdenom(NULL), fac(NULL) {}
37
38  void mac_gaussElem( const fglmVector newv, const fglmVector newp, number & newpdenom, number & newfac )
39    {
40    v= newv;
41    p= newp;
42    pdenom=newpdenom;
43    fac=newfac;
44        newpdenom= NULL;
45        newfac= NULL;
46    }
47#endif
48
49    ~gaussElem()
50    {
51        nDelete( & pdenom );
52        nDelete( & fac );
53    }
54};
55
56gaussReducer::gaussReducer( int dimen )
57{
58    int k;
59    size= 0;
60    max= dimen;
61#ifndef HAVE_EXPLICIT_CONSTR
62    elems= new gaussElem[ max+1 ];
63#else
64    elems= (gaussElem *)omAlloc( (max+1)*sizeof( gaussElem ) );
65#endif
66    isPivot= (BOOLEAN *)omAlloc( (max+1)*sizeof( BOOLEAN ) );
67    for ( k= max; k > 0; k-- )
68            isPivot[k]= FALSE;
69    perm= (int *)omAlloc( (max+1)*sizeof( int ) );
70}
71
72gaussReducer::~gaussReducer()
73{
74    int k;
75
76#ifndef HAVE_EXPLICIT_CONSTR
77    delete [] elems;
78#else
79    for ( k= size; k > 0; k-- )
80        elems[k].~gaussElem();
81    omFreeSize( (ADDRESS)elems, (max+1)*sizeof( gaussElem ) );
82#endif
83
84    omFreeSize( (ADDRESS)isPivot, (max+1)*sizeof( BOOLEAN ) );
85    omFreeSize( (ADDRESS)perm, (max+1)*sizeof( int ) );
86}
87
88BOOLEAN
89gaussReducer::reduce( fglmVector thev )
90{
91    number fac1, fac2;
92    number temp;
93    // Hier ueberlegen, ob thev als referenz, oder wie wann was kopiert usw.
94    v= thev;
95    p= fglmVector( size + 1, size + 1 );
96    // fglmASSERT( pdenom == NULL );
97    pdenom= nInit( 1 );
98    number vdenom = v.clearDenom();
99    if ( ! nIsOne( vdenom ) && ! nIsZero( vdenom ) ) {
100        p.setelem( p.size(), vdenom );
101    }
102    else {
103        nDelete( & vdenom );
104    }
105    number gcd = v.gcd();
106    if ( ! nIsOne( gcd ) && ! nIsZero( gcd ) ) {
107        v /= gcd;
108        number temp= nMult( pdenom, gcd );
109        nDelete( & pdenom );
110        pdenom= temp;
111    }
112    nDelete( & gcd );
113
114    int k;
115    for ( k= 1; k <= size; k++ ) {
116        if ( ! v.elemIsZero( perm[k] ) ) {
117            fac1= elems[k].fac;
118            fac2= nCopy( v.getconstelem( perm[k] ) );
119            v.nihilate( fac1, fac2, elems[k].v );
120            fac1= nMult( fac1, elems[k].pdenom );
121            temp= nMult( fac2, pdenom );
122            nDelete( & fac2 );
123            fac2= temp;
124            p.nihilate( fac1, fac2, elems[k].p );
125            temp= nMult( pdenom, elems[k].pdenom );
126            nDelete( & pdenom );
127            pdenom= temp;
128
129            nDelete( & fac1 );
130            nDelete( & fac2 );
131            number gcd = v.gcd();
132            if ( ! nIsOne( gcd ) && ! nIsZero( gcd ) ) {
133                v/= gcd;
134                number temp = nMult( pdenom, gcd );
135                nDelete( & pdenom );
136                pdenom= temp;
137            }
138            nDelete( & gcd );
139            gcd= p.gcd();
140            temp= nGcd( pdenom, gcd, currRing );
141            nDelete( & gcd );
142            gcd= temp;
143            if ( ! nIsZero( gcd ) && ! nIsOne( gcd ) ) {
144                p/= gcd;
145                temp= nDiv( pdenom, gcd );
146                nDelete( & pdenom );
147                pdenom= temp;
148                nNormalize( pdenom );
149            }
150            nDelete( & gcd );
151        }
152    }
153    return ( v.isZero() );
154}
155
156void
157gaussReducer::store()
158{
159    // fglmASSERT( size < max );
160    number fac;
161    // find the pivot-element in v:
162
163    size++;
164    int k= 1;
165    while ( nIsZero(v.getconstelem(k)) || isPivot[k] ) {
166        k++;
167    }
168    // fglmASSERT( k <= dimen, "Error(1) in fglmDdata::pivot-search");
169    number pivot= v.getconstelem( k );
170    int pivotcol = k;
171    k++;
172    while ( k <= max ) {
173        if ( ! nIsZero( v.getconstelem(k) ) && ! isPivot[k] ) {
174            if ( nGreater( v.getconstelem( k ), pivot ) ) {
175                pivot= v.getconstelem( k );
176                pivotcol= k;
177            }
178        }
179        k++;
180    }
181    // fglmASSERT( ! nIsZero( pivot ), "Error(2) fglmDdata::Pivotelement ist Null" );
182    isPivot[ pivotcol ]= TRUE;
183    perm[size]= pivotcol;
184
185    pivot= nCopy( v.getconstelem( pivotcol ) );
186#ifndef HAVE_EXPLICIT_CONSTR
187    elems[size].mac_gaussElem( v, p, pdenom, pivot );
188#else
189    elems[size].gaussElem( v, p, pdenom, pivot );
190#endif
191}
192
193fglmVector
194gaussReducer::getDependence()
195{
196    nDelete( & pdenom );
197    // hier kann p noch gekuerzt werden, je nach Charakteristik
198    fglmVector result = p;
199    p= fglmVector();
200    return ( result );
201}
202// ================================================================================
203
204// ----------------------------------------------------------------------------
205// Local Variables: ***
206// compile-command: "make Singular" ***
207// page-delimiter: "^\\(\\|//!\\)" ***
208// fold-internal-margins: nil ***
209// End: ***
210#endif // HAVE_FACTORY
Note: See TracBrowser for help on using the repository browser.