Changeset 6918d65 in git for factory/cf_algorithm.cc
- Timestamp:
- May 16, 2008, 3:10:43 PM (16 years ago)
- Branches:
- (u'spielwiese', '379ec2d037299db64c43fe3550b5ba8fe508dbe5')
- Children:
- ef20c7f187d2cee703db198bb13baadf2e349296
- Parents:
- f0aec5f202b35e6e5b438f20d75f4b4259253ecd
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
factory/cf_algorithm.cc
rf0aec5 r6918d65 1 1 /* emacs edit mode for this file is -*- C++ -*- */ 2 /* $Id: cf_algorithm.cc,v 1.1 1 2006-05-16 13:43:18Singular Exp $ */2 /* $Id: cf_algorithm.cc,v 1.12 2008-05-16 13:10:14 Singular Exp $ */ 3 3 4 4 //{{{ docu … … 86 86 psr ( const CanonicalForm & f, const CanonicalForm & g, const Variable & x ) 87 87 { 88 88 89 89 ASSERT( x.level() > 0, "type error: polynomial variable expected" ); 90 90 ASSERT( ! g.isZero(), "math error: division by zero" ); … … 101 101 int gDegree = degree( G, X ); 102 102 if ( fDegree < 0 || fDegree < gDegree ) 103 103 return f; 104 104 else { 105 106 107 105 CanonicalForm xresult = (power( LC( G, X ), fDegree-gDegree+1 ) * F) ; 106 CanonicalForm result = xresult -(xresult/G)*G; 107 return swapvar( result, x, X ); 108 108 } 109 109 } … … 174 174 int gDegree = degree( G, X ); 175 175 if ( fDegree < 0 || fDegree < gDegree ) 176 176 return 0; 177 177 else { 178 179 178 CanonicalForm result = (power( LC( G, X ), fDegree-gDegree+1 ) * F) / G; 179 return swapvar( result, x, X ); 180 180 } 181 181 } … … 224 224 int gDegree = degree( G, X ); 225 225 if ( fDegree < 0 || fDegree < gDegree ) { 226 226 q = 0; r = f; 227 227 } else { 228 229 230 228 divrem( power( LC( G, X ), fDegree-gDegree+1 ) * F, G, q, r ); 229 q = swapvar( q, x, X ); 230 r = swapvar( r, x, X ); 231 231 } 232 232 } … … 251 251 { 252 252 if ( f.inBaseDomain() ) 253 253 return f.den(); 254 254 else { 255 256 257 258 255 CanonicalForm result = 1; 256 for ( CFIterator i = f; i.hasTerms(); i++ ) 257 result = blcm( result, internalBCommonDen( i.coeff() ) ); 258 return result; 259 259 } 260 260 } … … 283 283 { 284 284 if ( getCharacteristic() == 0 && isOn( SW_RATIONAL ) ) { 285 286 287 288 289 285 // otherwise `bgcd()' returns one 286 Off( SW_RATIONAL ); 287 CanonicalForm result = internalBCommonDen( f ); 288 On( SW_RATIONAL ); 289 return result; 290 290 } else 291 291 return CanonicalForm( 1 ); 292 292 } 293 293 //}}} … … 330 330 // trivial cases 331 331 if ( g.isZero() ) 332 332 return true; 333 333 else if ( f.isZero() ) 334 334 return false; 335 335 336 336 if ( (f.inCoeffDomain() || g.inCoeffDomain()) 337 338 339 340 341 342 343 344 337 && ((getCharacteristic() == 0 && isOn( SW_RATIONAL )) 338 || (getCharacteristic() > 0 && CFFactory::gettype() != PrimePowerDomain)) ) 339 // if we are in a field all elements not equal to zero are units 340 if ( f.inCoeffDomain() ) 341 return true; 342 else 343 // g.inCoeffDomain() 344 return false; 345 345 346 346 // we may assume now that both levels either equal LEVELBASE … … 349 349 int gLevel = g.level(); 350 350 if ( gLevel > 0 && fLevel == gLevel ) 351 352 353 354 355 356 357 358 359 351 // f and g are polynomials in the same main variable 352 if ( degree( f ) <= degree( g ) 353 && fdivides( f.tailcoeff(), g.tailcoeff() ) 354 && fdivides( f.LC(), g.LC() ) ) { 355 CanonicalForm q, r; 356 return divremt( g, f, q, r ) && r.isZero(); 357 } 358 else 359 return false; 360 360 else if ( gLevel < fLevel ) 361 362 361 // g is a coefficient w.r.t. f 362 return false; 363 363 else { 364 365 366 367 368 364 // either f is a coefficient w.r.t. polynomial g or both 365 // f and g are from a base domain (should be Z or Z/p^n, 366 // then) 367 CanonicalForm q, r; 368 return divremt( g, f, q, r ) && r.isZero(); 369 369 } 370 370 } … … 391 391 { 392 392 if ( f.inBaseDomain() ) 393 393 return abs( f ); 394 394 else { 395 396 397 398 399 400 401 395 CanonicalForm result = 0; 396 for ( CFIterator i = f; i.hasTerms(); i++ ) { 397 CanonicalForm coeffMaxNorm = maxNorm( i.coeff() ); 398 if ( coeffMaxNorm > result ) 399 result = coeffMaxNorm; 400 } 401 return result; 402 402 } 403 403 } … … 421 421 { 422 422 ASSERT( (f.inBaseDomain() || f.isUnivariate()) && f.LC().inZ(), 423 423 "type error: univariate poly over Z expected" ); 424 424 425 425 CanonicalForm result = 0; 426 426 for ( CFIterator i = f; i.hasTerms(); i++ ) { 427 428 427 CanonicalForm coeff = i.coeff(); 428 result += coeff*coeff; 429 429 } 430 430 return sqrt( result );
Note: See TracChangeset
for help on using the changeset viewer.