Changeset 5812c69 in git for Singular/fglmgauss.cc
- Timestamp:
- Sep 24, 1998, 11:59:51 AM (26 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 56c52a7879fbc6de62cefba1da86b2edf2aadd4c
- Parents:
- 073d2edeb03013a5c6ed0913687b024305a1427d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/fglmgauss.cc
r073d2e r5812c69 1 1 // emacs edit mode for this file is -*- C++ -*- 2 // $Id: fglmgauss.cc,v 1. 9 1998-06-04 13:39:21 wichmannExp $2 // $Id: fglmgauss.cc,v 1.10 1998-09-24 09:59:38 Singular Exp $ 3 3 4 4 /**************************************** 5 5 * Computer Algebra System SINGULAR * 6 6 ****************************************/ 7 /* 7 /* 8 8 * ABSTRACT - class gaussReducer. Used in fglmzero.cc and fglmhom.cc 9 9 * to find linear dependecies of fglmVectors. … … 27 27 number pdenom; 28 28 number fac; 29 gaussElem( const fglmVector newv, const fglmVector newp, number & newpdenom, number & newfac ) : v( newv ), p( newp ), pdenom( newpdenom ), fac( newfac ) 29 gaussElem( const fglmVector newv, const fglmVector newp, number & newpdenom, number & newfac ) : v( newv ), p( newp ), pdenom( newpdenom ), fac( newfac ) 30 30 { 31 32 31 newpdenom= NULL; 32 newfac= NULL; 33 33 } 34 34 … … 42 42 pdenom=newpdenom; 43 43 fac=newfac; 44 45 46 } 47 #endif 48 49 ~gaussElem() 44 newpdenom= NULL; 45 newfac= NULL; 46 } 47 #endif 48 49 ~gaussElem() 50 50 { 51 52 51 nDelete( & pdenom ); 52 nDelete( & fac ); 53 53 } 54 54 }; 55 55 56 gaussReducer::gaussReducer( int dimen ) 56 gaussReducer::gaussReducer( int dimen ) 57 57 { 58 58 int k; … … 65 65 #endif 66 66 isPivot= (BOOLEAN *)Alloc( (max+1)*sizeof( BOOLEAN ) ); 67 for ( k= max; k > 0; k-- ) 68 67 for ( k= max; k > 0; k-- ) 68 isPivot[k]= FALSE; 69 69 perm= (int *)Alloc( (max+1)*sizeof( int ) ); 70 70 } 71 71 72 gaussReducer::~gaussReducer() 72 gaussReducer::~gaussReducer() 73 73 { 74 74 int k; … … 77 77 delete [] elems; 78 78 #else 79 for ( k= size; k > 0; k-- ) 80 79 for ( k= size; k > 0; k-- ) 80 elems[k].~gaussElem(); 81 81 Free( (ADDRESS)elems, (max+1)*sizeof( gaussElem ) ); 82 82 #endif … … 87 87 88 88 BOOLEAN 89 gaussReducer::reduce( fglmVector thev ) 89 gaussReducer::reduce( fglmVector thev ) 90 90 { 91 91 number fac1, fac2; … … 98 98 number vdenom = v.clearDenom(); 99 99 if ( ! nIsOne( vdenom ) && ! nIsZero( vdenom ) ) { 100 100 p.setelem( p.size(), vdenom ); 101 101 } 102 102 else { 103 103 nDelete( & vdenom ); 104 104 } 105 105 number gcd = v.gcd(); 106 106 if ( ! nIsOne( gcd ) && ! nIsZero( gcd ) ) { 107 108 109 110 107 v /= gcd; 108 number temp= nMult( pdenom, gcd ); 109 nDelete( & pdenom ); 110 pdenom= temp; 111 111 } 112 112 nDelete( & gcd ); 113 113 114 114 int k; 115 115 for ( k= 1; k <= size; k++ ) { 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 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 ); 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 152 } 153 153 return ( v.isZero() ); 154 154 } 155 155 156 void 157 gaussReducer::store() 156 void 157 gaussReducer::store() 158 158 { 159 159 // fglmASSERT( size < max ); 160 160 number fac; 161 161 // find the pivot-element in v: 162 162 163 163 size++; 164 164 int k= 1; 165 165 while ( nIsZero(v.getconstelem(k)) || isPivot[k] ) { 166 166 k++; 167 167 } 168 168 // fglmASSERT( k <= dimen, "Error(1) in fglmDdata::pivot-search"); … … 171 171 k++; 172 172 while ( k <= max ) { 173 174 175 176 177 178 179 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 180 } 181 181 // fglmASSERT( ! nIsZero( pivot ), "Error(2) fglmDdata::Pivotelement ist Null" ); 182 182 isPivot[ pivotcol ]= TRUE; 183 183 perm[size]= pivotcol; 184 184 185 185 pivot= nCopy( v.getconstelem( pivotcol ) ); 186 186 #ifndef HAVE_EXPLICIT_CONSTR … … 191 191 } 192 192 193 fglmVector 194 gaussReducer::getDependence() 193 fglmVector 194 gaussReducer::getDependence() 195 195 { 196 196 nDelete( & pdenom );
Note: See TracChangeset
for help on using the changeset viewer.