Changeset 412bedd in git
- Timestamp:
- Jul 30, 2002, 5:25:26 PM (22 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 93a6da3eaf8fc40ffcff3a3aaf2362483b162046
- Parents:
- 7af0e48f701a2fdb52f616fcd71856372b39e69f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
factory/fac_util.cc
r7af0e48 r412bedd 1 1 /* emacs edit mode for this file is -*- C++ -*- */ 2 /* $Id: fac_util.cc,v 1. 8 1998-03-12 14:31:02 schmidtExp $ */2 /* $Id: fac_util.cc,v 1.9 2002-07-30 15:25:26 Singular Exp $ */ 3 3 4 4 #include <config.h> … … 46 46 { 47 47 if ( this != &m ) { 48 49 50 51 48 p = m.p; 49 k = m.k; 50 pk = m.pk; 51 pkhalf = m.pkhalf; 52 52 } 53 53 return *this; … … 59 59 CanonicalForm u, r0 = this->operator()( f, false ), r1 = pk, q0 = 1, q1 = 0; 60 60 while ( ( r0 > 0 ) && ( r1 > 0 ) ) { 61 62 63 64 65 66 67 68 61 u = r0 / r1; 62 r0 = r0 % r1; 63 q0 = u*q1 + q0; 64 if ( r0 > 0 ) { 65 u = r1 / r0; 66 r1 = r1 % r0; 67 q1 = u*q0 + q1; 68 } 69 69 } 70 70 if ( r0 == 0 ) 71 72 else 73 71 return this->operator()( pk-q1, symmetric ); 72 else 73 return this->operator()( q0, symmetric ); 74 74 } 75 75 … … 80 80 PK = pk; 81 81 if ( symmetric ) 82 83 else 84 82 return mapdomain( f, mappksymmetric ); 83 else 84 return mapdomain( f, mappk ); 85 85 }; 86 86 … … 89 89 { 90 90 if ( f.inCoeffDomain() ) 91 92 else 93 91 return c; 92 else 93 return f + ( c - LC( f ) ) * power( f.mvar(), degree( f ) ); 94 94 } 95 95 … … 99 99 ASSERT( (f.inCoeffDomain() || f.isUnivariate()) && (g.inCoeffDomain() || g.isUnivariate()) && (f.inCoeffDomain() || g.inCoeffDomain() || f.mvar() == g.mvar()), "can not build remainder" ); 100 100 if ( f.inCoeffDomain() ) 101 102 103 104 101 if ( g.inCoeffDomain() ) 102 return pk( f % g ); 103 else 104 return pk( f ); 105 105 else { 106 Variable x = f.mvar(); 107 CanonicalForm invlcg = pk.inverse( g.lc() ); 108 CanonicalForm result = f; 109 int degg = g.degree(); 110 while ( result.degree() >= degg ) { 111 result = pk( result - lc( result ) * invlcg * g * power( x, result.degree() - degg ) ); 112 } 113 return result; 106 Variable x = f.mvar(); 107 CanonicalForm result = f; 108 int degg = g.degree(); 109 CanonicalForm invlcg = pk.inverse( g.lc() ); 110 CanonicalForm gg = pk( g*invlcg ); 111 if((gg.lc().isOne())) 112 { 113 while ( result.degree() >= degg ) 114 { 115 result -= pk(lc( result ) * gg) * power( x, result.degree() - degg ); 116 result=pk(result); 117 } 118 } 119 else 120 // no inverse found 121 { 122 CanonicalForm ic=icontent(g); 123 if (!ic.isOne()) 124 { 125 gg=g/ic; 126 return remainder(f,gg,pk); 127 } 128 while ( result.degree() >= degg ) 129 { 130 if (gg.lc().isZero()) return result; 131 CanonicalForm lcgf = result.lc() / gg.lc(); 132 if (lcgf.inZ()) 133 gg = pk( g*lcgf ); 134 else 135 { 136 //printf("!\n\n"); 137 return result; 138 } 139 result -= gg * power( x, result.degree() - degg ); 140 result=pk(result); 141 } 142 } 143 return result; 114 144 } 115 145 } … … 120 150 ASSERT( (f.inCoeffDomain() || f.isUnivariate()) && (g.inCoeffDomain() || g.isUnivariate()) && (f.inCoeffDomain() || g.inCoeffDomain() || f.mvar() == g.mvar()), "can not build remainder" ); 121 151 if ( f.inCoeffDomain() ) 122 123 124 125 126 127 128 129 130 152 if ( g.inCoeffDomain() ) { 153 divrem( f, g, quot, rem ); 154 quot = pk( quot ); 155 rem = pk( rem ); 156 } 157 else { 158 quot = 0; 159 rem = pk( f ); 160 } 131 161 else { 132 133 134 135 136 137 138 139 162 Variable x = f.mvar(); 163 CanonicalForm invlcg = pk.inverse( g.lc() ); 164 rem = f; 165 int degg = g.degree(); 166 while ( rem.degree() >= degg ) { 167 quot += pk( lc( rem ) * invlcg ) * power( x, rem.degree() - degg ); 168 rem = pk( rem - lc( rem ) * invlcg * g * power( x, rem.degree() - degg ) ); 169 } 140 170 } 141 171 } … … 146 176 CanonicalForm result = mod( f, PK ); 147 177 if ( result > PKHALF ) 148 149 else 150 178 return result - PK; 179 else 180 return result; 151 181 } 152 182 … … 166 196 setCharacteristic( p ); 167 197 { 168 169 198 amodp = mapinto( a ); bmodp = mapinto( b ); 199 (void)extgcd( amodp, bmodp, smodp, tmodp ); 170 200 } 171 201 setCharacteristic( 0 ); … … 173 203 174 204 for ( j = 1; j < k; j++ ) { 175 176 177 178 179 180 181 182 183 184 185 186 187 205 e = ( 1 - s * a - t * b ) / modulus; 206 setCharacteristic( p ); 207 { 208 e = mapinto( e ); 209 sigmat = smodp * e; 210 taut = tmodp * e; 211 divrem( sigmat, bmodp, q, sigma ); 212 tau = taut + q * amodp; 213 } 214 setCharacteristic( 0 ); 215 s += mapinto( sigma ) * modulus; 216 t += mapinto( tau ) * modulus; 217 modulus *= p; 188 218 } 189 219 S = s; T = t; … … 197 227 CanonicalForm s = 0; 198 228 for ( int i = f; i <= l; i++ ) 199 229 s += a[i]; 200 230 return s; 201 231 } … … 208 238 CanonicalForm p = 1; 209 239 for ( int i = f; i <= l; i++ ) 210 240 p *= a[i]; 211 241 return p; 212 242 } … … 233 263 int n = a.max(); 234 264 for ( ; fa <= n; fa++, fb++ ) 235 265 s += a[fa] * b[fb]; 236 266 return s; 237 267 }
Note: See TracChangeset
for help on using the changeset viewer.