CanonicalForm gcd_poly ( const CanonicalForm & f, const CanonicalForm & g ) * * gcd_poly() - calculate polynomial gcd. * * This is the dispatcher for polynomial gcd calculation. * Different gcd variants get called depending the input, characteristic, and * on switches (cf_defs.h) * * With the current settings from Singular (i.e. SW_USE_EZGCD= on, * SW_USE_EZGCD_P= on, SW_USE_CHINREM_GCD=
| 490 | * |
| 491 | **/ |
| 492 | CanonicalForm gcd_poly ( const CanonicalForm & f, const CanonicalForm & g ) |
| 493 | { |
| 494 | CanonicalForm fc, gc; |
| 495 | bool fc_isUnivariate=f.isUnivariate(); |
| 496 | bool gc_isUnivariate=g.isUnivariate(); |
| 497 | bool fc_and_gc_Univariate=fc_isUnivariate && gc_isUnivariate; |
| 498 | fc = f; |
| 499 | gc = g; |
| 500 | int ch=getCharacteristic(); |
| 501 | if ( ch != 0 ) |
| 502 | { |
| 503 | if (0) {} // dummy, to be able to build without NTL and FLINT |
| 504 | #if defined(HAVE_FLINT) && ( __FLINT_RELEASE >= 20503) |
| 505 | if ( isOn( SW_USE_FL_GCD_P) |
| 506 | && (CFFactory::gettype() != GaloisFieldDomain) |
| 507 | #ifdef HAVE_NTL |
| 508 | && (ch>10) // if we have NTL: it is better for char <11 |
| 509 | #endif |
| 510 | &&(!hasAlgVar(fc)) && (!hasAlgVar(gc))) |
| 511 | { |
| 512 | return gcdFlintMP_Zp(fc,gc); |
| 513 | } |
| 514 | #endif |
| 515 | #ifdef HAVE_NTL |
| 516 | if ((!fc_and_gc_Univariate) && (isOn( SW_USE_EZGCD_P ))) |
| 517 | { |
| 518 | fc= EZGCD_P (fc, gc); |
| 519 | } |
| 520 | #endif |
| 521 | #if defined(HAVE_NTL) || defined(HAVE_FLINT) |
| 522 | else if (isOn(SW_USE_FF_MOD_GCD) && !fc_and_gc_Univariate) |
| 523 | { |
| 524 | Variable a; |
| 525 | if (hasFirstAlgVar (fc, a) || hasFirstAlgVar (gc, a)) |
| 526 | fc=modGCDFq (fc, gc, a); |
| 527 | else if (CFFactory::gettype() == GaloisFieldDomain) |
| 528 | fc=modGCDGF (fc, gc); |
| 529 | else |
| 530 | fc=modGCDFp (fc, gc); |
| 531 | } |
| 532 | #endif |
| 533 | else |
| 534 | fc = gcd_poly_p( fc, gc ); |
| 535 | } |
| 536 | else if (!fc_and_gc_Univariate) /* && char==0*/ |
| 537 | { |
| 538 | #if defined(HAVE_FLINT) && ( __FLINT_RELEASE >= 20503) |
| 539 | if (( isOn( SW_USE_FL_GCD_0) ) |
| 540 | &&(!hasAlgVar(fc)) && (!hasAlgVar(gc))) |
| 541 | { |
| 542 | return gcdFlintMP_QQ(fc,gc); |
| 543 | } |
| 544 | else |
| 545 | #endif |
| 546 | #ifdef HAVE_NTL |
| 547 | if ( isOn( SW_USE_EZGCD ) ) |
| 548 | fc= ezgcd (fc, gc); |
| 549 | else |
no test coverage detected