Changeset 094eed in git
- Timestamp:
- Dec 9, 2005, 4:00:59 PM (18 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 9b8fb3afe331341de66b351480d365bf44d4bee3
- Parents:
- c6ed6f55d03d3ddc39f98de45cab426a2f727023
- Location:
- factory
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
factory/canonicalform.cc
rc6ed6f r094eed 1 1 /* emacs edit mode for this file is -*- C++ -*- */ 2 /* $Id: canonicalform.cc,v 1.3 7 2005-12-09 09:12:53 pohlExp $ */2 /* $Id: canonicalform.cc,v 1.38 2005-12-09 15:00:59 Singular Exp $ */ 3 3 4 4 #include <config.h> … … 37 37 if ( ! initialized ) { 38 38 #if (defined (USE_MEMUTIL) && ! defined (USE_OLD_MEMMAN)) || defined (SINGULAR) 39 39 (void)mmInit(); 40 40 #endif 41 41 42 43 44 45 42 (void)initializeCharacteristic(); 43 (void)initializeGMP(); 44 initPT(); 45 initialized = true; 46 46 } 47 47 return 1; … … 58 58 { 59 59 if ( is_imm( value ) ) 60 61 else 62 60 return value; 61 else 62 return value->copyObject(); 63 63 } 64 64 … … 67 67 { 68 68 if ( is_imm( value ) ) 69 70 else 71 69 return *this; 70 else 71 return CanonicalForm( value->deepCopyObject() ); 72 72 } 73 73 //}}} … … 86 86 { 87 87 if ( is_imm( value ) == INTMARK ) 88 88 return true; 89 89 else if ( is_imm( value ) ) 90 91 else 92 90 return false; 91 else 92 return value->levelcoeff() == IntegerDomain; 93 93 } 94 94 … … 97 97 { 98 98 if ( is_imm( value ) == INTMARK ) 99 99 return true; 100 100 else if ( is_imm( value ) ) 101 102 else 103 104 101 return false; 102 else 103 return value->levelcoeff() == IntegerDomain || 104 value->levelcoeff() == RationalDomain; 105 105 } 106 106 … … 127 127 { 128 128 if ( is_imm( value ) ) 129 130 else 131 129 return true; 130 else 131 return value->inBaseDomain(); 132 132 } 133 133 … … 136 136 { 137 137 if ( is_imm( value ) ) 138 139 else 140 138 return false; 139 else 140 return value->inExtension(); 141 141 } 142 142 … … 145 145 { 146 146 if ( is_imm( value ) ) 147 148 else 149 147 return true; 148 else 149 return value->inCoeffDomain(); 150 150 } 151 151 … … 154 154 { 155 155 if ( is_imm( value ) ) 156 157 else 158 156 return false; 157 else 158 return value->inPolyDomain(); 159 159 } 160 160 … … 163 163 { 164 164 if ( is_imm( value ) ) 165 166 else 167 165 return false; 166 else 167 return value->inQuotDomain(); 168 168 } 169 169 … … 178 178 { 179 179 if ( is_imm( value ) ) 180 181 else 182 180 return false; 181 else 182 return value->isUnivariate(); 183 183 } 184 184 … … 223 223 { 224 224 if ( is_imm( value ) ) 225 226 else 227 225 return imm_intval( value ); 226 else 227 return value->intval(); 228 228 } 229 229 … … 233 233 ASSERT( is_imm( value ) || ! value->inExtension(), "cannot map into different Extension" ); 234 234 if ( is_imm( value ) ) 235 236 237 238 239 240 241 242 243 244 245 246 247 235 if ( getCharacteristic() == 0 ) 236 if ( is_imm( value ) == FFMARK ) 237 return CanonicalForm( int2imm( ff_symmetric( imm2int( value ) ) ) ); 238 else if ( is_imm( value ) == GFMARK ) 239 return CanonicalForm( int2imm( ff_symmetric( gf_gf2ff( imm2int( value ) ) ) ) ); 240 else 241 return *this; 242 else if ( CFFactory::gettype() == PrimePowerDomain ) 243 return CanonicalForm( CFFactory::basic( imm2int( value ) ) ); 244 else if ( getGFDegree() == 1 ) 245 return CanonicalForm( int2imm_p( ff_norm( imm2int( value ) ) ) ); 246 else 247 return CanonicalForm( int2imm_gf( gf_int2gf( imm2int( value ) ) ) ); 248 248 else if ( value->inBaseDomain() ) 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 249 if ( getCharacteristic() == 0 ) 250 if ( value->levelcoeff() == PrimePowerDomain ) 251 return CFFactory::basic( getmpi( value, true ) ); 252 else 253 return *this; 254 else if ( CFFactory::gettype() == PrimePowerDomain ) { 255 ASSERT( value->levelcoeff() == PrimePowerDomain || value->levelcoeff() == IntegerDomain, "no proper map defined" ); 256 if ( value->levelcoeff() == PrimePowerDomain ) 257 return *this; 258 else 259 return CFFactory::basic( getmpi( value ) ); 260 } 261 else { 262 int val; 263 if ( value->levelcoeff() == IntegerDomain ) 264 val = value->intmod( ff_prime ); 265 else if ( value->levelcoeff() == RationalDomain ) 266 return num().mapinto() / den().mapinto(); 267 else { 268 ASSERT( 0, "illegal domain" ); 269 return 0; 270 } 271 if ( getGFDegree() > 1 ) 272 return CanonicalForm( int2imm_gf( gf_int2gf( val ) ) ); 273 else 274 return CanonicalForm( int2imm_p( val ) ); 275 } 276 276 else { 277 278 279 280 281 277 Variable x = value->variable(); 278 CanonicalForm result; 279 for ( CFIterator i = *this; i.hasTerms(); i++ ) 280 result += power( x, i.exp() ) * i.coeff().mapinto(); 281 return result; 282 282 } 283 283 } … … 301 301 // algebraic extension are considered coefficients so Lc() always 302 302 // returns a leading coefficient in a coefficient domain. 303 // 303 // 304 304 // LC() returns the leading coefficient of CO where CO is 305 305 // considered a univariate polynomial in its main variable. An … … 335 335 { 336 336 if ( is_imm( value ) ) 337 338 else 339 337 return *this; 338 else 339 return value->lc(); 340 340 } 341 341 … … 344 344 { 345 345 if ( is_imm( value ) || value->inCoeffDomain() ) 346 347 else 348 346 return *this; 347 else 348 return value->Lc(); 349 349 } 350 350 … … 353 353 { 354 354 if ( is_imm( value ) ) 355 356 else 357 355 return *this; 356 else 357 return value->LC(); 358 358 } 359 359 … … 362 362 { 363 363 if ( is_imm( value ) || value->inCoeffDomain() ) 364 364 return *this; 365 365 366 366 Variable x = value->variable(); 367 367 if ( v > x ) 368 368 return *this; 369 369 else if ( v == x ) 370 370 return value->LC(); 371 371 else { 372 373 374 375 376 377 372 CanonicalForm f = swapvar( *this, v, x ); 373 if ( f.mvar() == x ) 374 return swapvar( f.value->LC(), v, x ); 375 else 376 // v did not occur in f 377 return *this; 378 378 } 379 379 } … … 404 404 int what = is_imm( value ); 405 405 if ( what ) 406 407 408 409 410 411 412 else 413 406 if ( what == FFMARK ) 407 return imm_iszero_p( value ) ? -1 : 0; 408 else if ( what == INTMARK ) 409 return imm_iszero( value ) ? -1 : 0; 410 else 411 return imm_iszero_gf( value ) ? -1 : 0; 412 else 413 return value->degree(); 414 414 } 415 415 … … 419 419 int what = is_imm( value ); 420 420 if ( what ) 421 422 423 424 425 426 421 if ( what == FFMARK ) 422 return imm_iszero_p( value ) ? -1 : 0; 423 else if ( what == INTMARK ) 424 return imm_iszero( value ) ? -1 : 0; 425 else 426 return imm_iszero_gf( value ) ? -1 : 0; 427 427 else if ( value->inBaseDomain() ) 428 428 return value->degree(); 429 429 430 430 Variable x = value->variable(); 431 431 if ( v == x ) 432 432 return value->degree(); 433 433 else if ( v > x ) 434 435 434 // relatively to v, f is in a coefficient ring 435 return 0; 436 436 else { 437 438 439 440 441 442 443 444 437 int coeffdeg, result = 0; 438 // search for maximum of coefficient degree 439 for ( CFIterator i = *this; i.hasTerms(); i++ ) { 440 coeffdeg = i.coeff().degree( v ); 441 if ( coeffdeg > result ) 442 result = coeffdeg; 443 } 444 return result; 445 445 } 446 446 } … … 474 474 { 475 475 if ( is_imm( value ) || value->inCoeffDomain() ) 476 477 else 478 476 return *this; 477 else 478 return value->tailcoeff(); 479 479 } 480 480 … … 484 484 int what = is_imm( value ); 485 485 if ( what ) 486 487 488 489 490 491 492 else 493 486 if ( what == FFMARK ) 487 return imm_iszero_p( value ) ? -1 : 0; 488 else if ( what == INTMARK ) 489 return imm_iszero( value ) ? -1 : 0; 490 else 491 return imm_iszero_gf( value ) ? -1 : 0; 492 else 493 return value->taildegree(); 494 494 } 495 495 //}}} … … 509 509 // InternalPoly::level(), InternalPoly::variable(), ::level(), 510 510 // ::mvar() 511 // 511 // 512 512 //}}} 513 513 int … … 515 515 { 516 516 if ( is_imm( value ) ) 517 518 else 519 517 return LEVELBASE; 518 else 519 return value->level(); 520 520 } 521 521 … … 524 524 { 525 525 if ( is_imm( value ) ) 526 527 else 528 526 return Variable(); 527 else 528 return value->variable(); 529 529 } 530 530 //}}} … … 550 550 { 551 551 if ( is_imm( value ) ) 552 553 else 554 552 return *this; 553 else 554 return CanonicalForm( value->num() ); 555 555 } 556 556 … … 559 559 { 560 560 if ( is_imm( value ) ) 561 562 else 563 561 return CanonicalForm( 1 ); 562 else 563 return CanonicalForm( value->den() ); 564 564 } 565 565 //}}} … … 571 571 int what = is_imm( value ); 572 572 if ( what ) { 573 574 575 576 577 578 579 580 581 582 583 573 ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" ); 574 if ( (what = is_imm( cf.value )) == FFMARK ) 575 value = imm_add_p( value, cf.value ); 576 else if ( what == GFMARK ) 577 value = imm_add_gf( value, cf.value ); 578 else if ( what ) 579 value = imm_add( value, cf.value ); 580 else { 581 InternalCF * dummy = cf.value->copyObject(); 582 value = dummy->addcoeff( value ); 583 } 584 584 } 585 585 else if ( is_imm( cf.value ) ) 586 586 value = value->addcoeff( cf.value ); 587 587 else if ( value->level() == cf.value->level() ) { 588 589 590 591 592 593 594 595 596 597 588 if ( value->levelcoeff() == cf.value->levelcoeff() ) 589 value = value->addsame( cf.value ); 590 else if ( value->levelcoeff() > cf.value->levelcoeff() ) 591 value = value->addcoeff( cf.value ); 592 else { 593 InternalCF * dummy = cf.value->copyObject(); 594 dummy = dummy->addcoeff( value ); 595 if ( value->deleteObject() ) delete value; 596 value = dummy; 597 } 598 598 } 599 599 else if ( level() > cf.level() ) 600 600 value = value->addcoeff( cf.value ); 601 601 else { 602 603 604 605 602 InternalCF * dummy = cf.value->copyObject(); 603 dummy = dummy->addcoeff( value ); 604 if ( value->deleteObject() ) delete value; 605 value = dummy; 606 606 } 607 607 return *this; … … 613 613 int what = is_imm( value ); 614 614 if ( what ) { 615 616 617 618 619 620 621 622 623 624 625 615 ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" ); 616 if ( (what = is_imm( cf.value )) == FFMARK ) 617 value = imm_sub_p( value, cf.value ); 618 else if ( what == GFMARK ) 619 value = imm_sub_gf( value, cf.value ); 620 else if ( what ) 621 value = imm_sub( value, cf.value ); 622 else { 623 InternalCF * dummy = cf.value->copyObject(); 624 value = dummy->subcoeff( value, true ); 625 } 626 626 } 627 627 else if ( is_imm( cf.value ) ) 628 628 value = value->subcoeff( cf.value, false ); 629 629 else if ( value->level() == cf.value->level() ) { 630 631 632 633 634 635 636 637 638 639 630 if ( value->levelcoeff() == cf.value->levelcoeff() ) 631 value = value->subsame( cf.value ); 632 else if ( value->levelcoeff() > cf.value->levelcoeff() ) 633 value = value->subcoeff( cf.value, false ); 634 else { 635 InternalCF * dummy = cf.value->copyObject(); 636 dummy = dummy->subcoeff( value, true ); 637 if ( value->deleteObject() ) delete value; 638 value = dummy; 639 } 640 640 } 641 641 else if ( level() > cf.level() ) 642 642 value = value->subcoeff( cf.value, false ); 643 643 else { 644 645 646 647 644 InternalCF * dummy = cf.value->copyObject(); 645 dummy = dummy->subcoeff( value, true ); 646 if ( value->deleteObject() ) delete value; 647 value = dummy; 648 648 } 649 649 return *this; … … 655 655 int what = is_imm( value ); 656 656 if ( what ) { 657 658 659 660 661 662 663 664 665 666 667 657 ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" ); 658 if ( (what = is_imm( cf.value )) == FFMARK ) 659 value = imm_mul_p( value, cf.value ); 660 else if ( what == GFMARK ) 661 value = imm_mul_gf( value, cf.value ); 662 else if ( what ) 663 value = imm_mul( value, cf.value ); 664 else { 665 InternalCF * dummy = cf.value->copyObject(); 666 value = dummy->mulcoeff( value ); 667 } 668 668 } 669 669 else if ( is_imm( cf.value ) ) 670 670 value = value->mulcoeff( cf.value ); 671 671 else if ( value->level() == cf.value->level() ) { 672 673 674 675 676 677 678 679 680 681 672 if ( value->levelcoeff() == cf.value->levelcoeff() ) 673 value = value->mulsame( cf.value ); 674 else if ( value->levelcoeff() > cf.value->levelcoeff() ) 675 value = value->mulcoeff( cf.value ); 676 else { 677 InternalCF * dummy = cf.value->copyObject(); 678 dummy = dummy->mulcoeff( value ); 679 if ( value->deleteObject() ) delete value; 680 value = dummy; 681 } 682 682 } 683 683 else if ( level() > cf.level() ) 684 684 value = value->mulcoeff( cf.value ); 685 685 else { 686 687 688 689 686 InternalCF * dummy = cf.value->copyObject(); 687 dummy = dummy->mulcoeff( value ); 688 if ( value->deleteObject() ) delete value; 689 value = dummy; 690 690 } 691 691 return *this; … … 697 697 int what = is_imm( value ); 698 698 if ( what ) { 699 700 701 702 703 704 705 706 707 708 709 699 ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" ); 700 if ( (what = is_imm( cf.value )) == FFMARK ) 701 value = imm_div_p( value, cf.value ); 702 else if ( what == GFMARK ) 703 value = imm_div_gf( value, cf.value ); 704 else if ( what ) 705 value = imm_divrat( value, cf.value ); 706 else { 707 InternalCF * dummy = cf.value->copyObject(); 708 value = dummy->dividecoeff( value, true ); 709 } 710 710 } 711 711 else if ( is_imm( cf.value ) ) 712 712 value = value->dividecoeff( cf.value, false ); 713 713 else if ( value->level() == cf.value->level() ) { 714 715 716 717 718 719 720 721 722 723 714 if ( value->levelcoeff() == cf.value->levelcoeff() ) 715 value = value->dividesame( cf.value ); 716 else if ( value->levelcoeff() > cf.value->levelcoeff() ) 717 value = value->dividecoeff( cf.value, false ); 718 else { 719 InternalCF * dummy = cf.value->copyObject(); 720 dummy = dummy->dividecoeff( value, true ); 721 if ( value->deleteObject() ) delete value; 722 value = dummy; 723 } 724 724 } 725 725 else if ( level() > cf.level() ) 726 726 value = value->dividecoeff( cf.value, false ); 727 727 else { 728 729 730 731 728 InternalCF * dummy = cf.value->copyObject(); 729 dummy = dummy->dividecoeff( value, true ); 730 if ( value->deleteObject() ) delete value; 731 value = dummy; 732 732 } 733 733 return *this; … … 739 739 int what = is_imm( value ); 740 740 if ( what ) { 741 742 743 744 745 746 747 748 749 750 751 741 ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" ); 742 if ( (what = is_imm( cf.value )) == FFMARK ) 743 value = imm_div_p( value, cf.value ); 744 else if ( what == GFMARK ) 745 value = imm_div_gf( value, cf.value ); 746 else if ( what ) 747 value = imm_div( value, cf.value ); 748 else { 749 InternalCF * dummy = cf.value->copyObject(); 750 value = dummy->divcoeff( value, true ); 751 } 752 752 } 753 753 else if ( is_imm( cf.value ) ) 754 754 value = value->divcoeff( cf.value, false ); 755 755 else if ( value->level() == cf.value->level() ) { 756 757 758 759 760 761 762 763 764 765 756 if ( value->levelcoeff() == cf.value->levelcoeff() ) 757 value = value->divsame( cf.value ); 758 else if ( value->levelcoeff() > cf.value->levelcoeff() ) 759 value = value->divcoeff( cf.value, false ); 760 else { 761 InternalCF * dummy = cf.value->copyObject(); 762 dummy = dummy->divcoeff( value, true ); 763 if ( value->deleteObject() ) delete value; 764 value = dummy; 765 } 766 766 } 767 767 else if ( level() > cf.level() ) 768 768 value = value->divcoeff( cf.value, false ); 769 769 else { 770 771 772 773 770 InternalCF * dummy = cf.value->copyObject(); 771 dummy = dummy->divcoeff( value, true ); 772 if ( value->deleteObject() ) delete value; 773 value = dummy; 774 774 } 775 775 return *this; … … 781 781 int what = is_imm( value ); 782 782 if ( what ) { 783 784 785 786 787 788 789 790 791 792 793 783 ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" ); 784 if ( (what = is_imm( cf.value )) == FFMARK ) 785 value = imm_mod_p( value, cf.value ); 786 else if ( what == GFMARK ) 787 value = imm_mod_gf( value, cf.value ); 788 else if ( what ) 789 value = imm_mod( value, cf.value ); 790 else { 791 InternalCF * dummy = cf.value->copyObject(); 792 value = dummy->modulocoeff( value, true ); 793 } 794 794 } 795 795 else if ( is_imm( cf.value ) ) 796 796 value = value->modulocoeff( cf.value, false ); 797 797 else if ( value->level() == cf.value->level() ) { 798 799 800 801 802 803 804 805 806 807 798 if ( value->levelcoeff() == cf.value->levelcoeff() ) 799 value = value->modulosame( cf.value ); 800 else if ( value->levelcoeff() > cf.value->levelcoeff() ) 801 value = value->modulocoeff( cf.value, false ); 802 else { 803 InternalCF * dummy = cf.value->copyObject(); 804 dummy = dummy->modulocoeff( value, true ); 805 if ( value->deleteObject() ) delete value; 806 value = dummy; 807 } 808 808 } 809 809 else if ( level() > cf.level() ) 810 810 value = value->modulocoeff( cf.value, false ); 811 811 else { 812 813 814 815 812 InternalCF * dummy = cf.value->copyObject(); 813 dummy = dummy->modulocoeff( value, true ); 814 if ( value->deleteObject() ) delete value; 815 value = dummy; 816 816 } 817 817 return *this; … … 823 823 int what = is_imm( value ); 824 824 if ( what ) { 825 826 827 828 829 830 831 832 833 834 835 825 ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" ); 826 if ( (what = is_imm( cf.value )) == FFMARK ) 827 value = imm_mod_p( value, cf.value ); 828 else if ( what == GFMARK ) 829 value = imm_mod_gf( value, cf.value ); 830 else if ( what ) 831 value = imm_mod( value, cf.value ); 832 else { 833 InternalCF * dummy = cf.value->copyObject(); 834 value = dummy->modcoeff( value, true ); 835 } 836 836 } 837 837 else if ( is_imm( cf.value ) ) 838 838 value = value->modcoeff( cf.value, false ); 839 839 else if ( value->level() == cf.value->level() ) { 840 841 842 843 844 845 846 847 848 849 840 if ( value->levelcoeff() == cf.value->levelcoeff() ) 841 value = value->modsame( cf.value ); 842 else if ( value->levelcoeff() > cf.value->levelcoeff() ) 843 value = value->modcoeff( cf.value, false ); 844 else { 845 InternalCF * dummy = cf.value->copyObject(); 846 dummy = dummy->modcoeff( value, true ); 847 if ( value->deleteObject() ) delete value; 848 value = dummy; 849 } 850 850 } 851 851 else if ( level() > cf.level() ) 852 852 value = value->modcoeff( cf.value, false ); 853 853 else { 854 855 856 857 854 InternalCF * dummy = cf.value->copyObject(); 855 dummy = dummy->modcoeff( value, true ); 856 if ( value->deleteObject() ) delete value; 857 value = dummy; 858 858 } 859 859 return *this; … … 866 866 int what = is_imm( f.value ); 867 867 if ( what ) 868 869 870 871 872 873 874 875 876 877 868 if ( is_imm( g.value ) ) { 869 if ( what == FFMARK ) 870 imm_divrem_p( f.value, g.value, qq, rr ); 871 else if ( what == GFMARK ) 872 imm_divrem_gf( f.value, g.value, qq, rr ); 873 else 874 imm_divrem( f.value, g.value, qq, rr ); 875 } 876 else 877 g.value->divremcoeff( f.value, qq, rr, true ); 878 878 else if ( (what=is_imm( g.value )) ) 879 879 f.value->divremcoeff( g.value, qq, rr, false ); 880 880 else if ( f.value->level() == g.value->level() ) 881 882 883 884 885 886 881 if ( f.value->levelcoeff() == g.value->levelcoeff() ) 882 f.value->divremsame( g.value, qq, rr ); 883 else if ( f.value->levelcoeff() > g.value->levelcoeff() ) 884 f.value->divremcoeff( g.value, qq, rr, false ); 885 else 886 g.value->divremcoeff( f.value, qq, rr, true ); 887 887 else if ( f.value->level() > g.value->level() ) 888 889 else 890 888 f.value->divremcoeff( g.value, qq, rr, false ); 889 else 890 g.value->divremcoeff( f.value, qq, rr, true ); 891 891 ASSERT( qq != 0 && rr != 0, "error in divrem" ); 892 892 q = CanonicalForm( qq ); … … 901 901 bool result = true; 902 902 if ( what ) 903 904 905 906 907 908 909 910 911 912 903 if ( is_imm( g.value ) ) { 904 if ( what == FFMARK ) 905 imm_divrem_p( f.value, g.value, qq, rr ); 906 else if ( what == GFMARK ) 907 imm_divrem_gf( f.value, g.value, qq, rr ); 908 else 909 imm_divrem( f.value, g.value, qq, rr ); 910 } 911 else 912 result = g.value->divremcoefft( f.value, qq, rr, true ); 913 913 else if ( (what=is_imm( g.value )) ) 914 914 result = f.value->divremcoefft( g.value, qq, rr, false ); 915 915 else if ( f.value->level() == g.value->level() ) 916 917 918 919 920 921 916 if ( f.value->levelcoeff() == g.value->levelcoeff() ) 917 result = f.value->divremsamet( g.value, qq, rr ); 918 else if ( f.value->levelcoeff() > g.value->levelcoeff() ) 919 result = f.value->divremcoefft( g.value, qq, rr, false ); 920 else 921 result = g.value->divremcoefft( f.value, qq, rr, true ); 922 922 else if ( f.value->level() > g.value->level() ) 923 924 else 925 923 result = f.value->divremcoefft( g.value, qq, rr, false ); 924 else 925 result = g.value->divremcoefft( f.value, qq, rr, true ); 926 926 if ( result ) { 927 928 929 927 ASSERT( qq != 0 && rr != 0, "error in divrem" ); 928 q = CanonicalForm( qq ); 929 r = CanonicalForm( rr ); 930 930 } 931 931 else { 932 932 q = 0; r = 0; 933 933 } 934 934 return result; … … 956 956 { 957 957 if ( is_imm( value ) || value->inBaseDomain() ) 958 958 return *this; 959 959 else { 960 960 #if 0 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 961 CFIterator i = *this; 962 int lastExp = i.exp(); 963 CanonicalForm result = i.coeff(); 964 i++; 965 while ( i.hasTerms() ) { 966 if ( (lastExp - i.exp()) == 1 ) 967 result *= f; 968 else 969 result *= power( f, lastExp - i.exp() ); 970 result += i.coeff(); 971 lastExp = i.exp(); 972 i++; 973 } 974 if ( lastExp != 0 ) 975 result *= power( f, lastExp ); 976 976 #else 977 978 979 980 981 977 CFIterator i = *this; 978 int lastExp = i.exp(); 979 CanonicalForm result = i.coeff(); 980 i++; 981 while ( i.hasTerms() ) 982 982 { 983 983 int i_exp=i.exp(); 984 985 986 987 988 989 990 991 992 993 984 if ( (lastExp - i_exp /* i.exp()*/) == 1 ) 985 result *= f; 986 else 987 result *= power( f, lastExp - i_exp /*i.exp()*/ ); 988 result += i.coeff(); 989 lastExp = i_exp /*i.exp()*/; 990 i++; 991 } 992 if ( lastExp != 0 ) 993 result *= power( f, lastExp ); 994 994 #endif 995 995 return result; 996 996 } 997 997 } … … 1001 1001 { 1002 1002 if ( is_imm( value ) || value->inBaseDomain() ) 1003 1003 return *this; 1004 1004 1005 1005 Variable x = value->variable(); 1006 1006 if ( v > x ) 1007 1007 return *this; 1008 1008 else if ( v == x ) 1009 1009 return (*this)( f ); 1010 1010 else { 1011 1012 1013 1014 1015 1011 // v is less than main variable of f 1012 CanonicalForm result = 0; 1013 for ( CFIterator i = *this; i.hasTerms(); i++ ) 1014 result += i.coeff()( f, v ) * power( x, i.exp() ); 1015 return result; 1016 1016 } 1017 1017 } … … 1056 1056 ASSERT( i >= 0, "index to operator [] less than zero" ); 1057 1057 if ( is_imm( value ) ) 1058 1059 1060 1061 1062 else 1063 1058 if ( i == 0 ) 1059 return *this; 1060 else 1061 return CanonicalForm( 0 ); 1062 else 1063 return value->coeff( i ); 1064 1064 } 1065 1065 //}}} … … 1084 1084 { 1085 1085 if ( is_imm( value ) || value->inCoeffDomain() ) 1086 1086 return CanonicalForm( 0 ); 1087 1087 else { 1088 1089 1090 1091 1092 1093 1088 CanonicalForm result = 0; 1089 Variable x = value->variable(); 1090 for ( CFIterator i = *this; i.hasTerms(); i++ ) 1091 if ( i.exp() > 0 ) 1092 result += power( x, i.exp()-1 ) * i.coeff() * i.exp(); 1093 return result; 1094 1094 } 1095 1095 } … … 1100 1100 ASSERT( x.level() > 0, "cannot derive with respect to algebraic variables" ); 1101 1101 if ( is_imm( value ) || value->inCoeffDomain() ) 1102 1102 return CanonicalForm( 0 ); 1103 1103 1104 1104 Variable y = value->variable(); 1105 1105 if ( x > y ) 1106 1106 return CanonicalForm( 0 ); 1107 1107 else if ( x == y ) 1108 1108 return deriv(); 1109 1109 else { 1110 1111 1112 1113 1110 CanonicalForm result = 0; 1111 for ( CFIterator i = *this; i.hasTerms(); i++ ) 1112 result += i.coeff().deriv( x ) * power( y, i.exp() ); 1113 return result; 1114 1114 } 1115 1115 } … … 1141 1141 { 1142 1142 if ( is_imm( value ) ) 1143 1144 else 1145 1143 return imm_sign( value ); 1144 else 1145 return value->sign(); 1146 1146 } 1147 1147 //}}} … … 1166 1166 { 1167 1167 if ( is_imm( value ) ) { 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 } 1184 else 1185 1168 ASSERT( is_imm( value ) == INTMARK, "sqrt() not implemented" ); 1169 int n = imm2int( value ); 1170 ASSERT( n >= 0, "arg to sqrt() less than zero" ); 1171 if ( n == 0 || n == 1 ) 1172 return CanonicalForm( n ); 1173 else { 1174 int x, y = n; 1175 do { 1176 x = y; 1177 // the intermediate result may not fit into an 1178 // integer, but the result does 1179 y = (unsigned int)(x + n/x)/2; 1180 } while ( y < x ); 1181 return CanonicalForm( x ); 1182 } 1183 } 1184 else 1185 return CanonicalForm( value->sqrt() ); 1186 1186 } 1187 1187 //}}} … … 1202 1202 { 1203 1203 if ( is_imm( value ) ) { 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 } 1214 else 1215 1204 ASSERT( is_imm( value ) == INTMARK, "ilog2() not implemented" ); 1205 int a = imm2int( value ); 1206 ASSERT( a > 0, "arg to ilog2() less or equal zero" ); 1207 int n = -1; 1208 while ( a != 0 ) { 1209 n++; 1210 a /= 2; 1211 } 1212 return n; 1213 } 1214 else 1215 return value->ilog2(); 1216 1216 } 1217 1217 //}}} … … 1259 1259 { 1260 1260 if ( lhs.value == rhs.value ) 1261 1261 return true; 1262 1262 else if ( is_imm( rhs.value ) || is_imm( lhs.value ) ) { 1263 1264 1265 1266 1267 1263 ASSERT( ! is_imm( rhs.value ) || 1264 ! is_imm( lhs.value ) || 1265 is_imm( rhs.value ) == is_imm( lhs.value ), 1266 "incompatible operands" ); 1267 return false; 1268 1268 } 1269 1269 else if ( lhs.value->level() != rhs.value->level() ) 1270 1270 return false; 1271 1271 else if ( lhs.value->levelcoeff() != rhs.value->levelcoeff() ) 1272 1273 else 1274 1272 return false; 1273 else 1274 return rhs.value->comparesame( lhs.value ) == 0; 1275 1275 } 1276 1276 … … 1279 1279 { 1280 1280 if ( lhs.value == rhs.value ) 1281 1281 return false; 1282 1282 else if ( is_imm( rhs.value ) || is_imm( lhs.value ) ) { 1283 1284 1285 1286 1287 1283 ASSERT( ! is_imm( rhs.value ) || 1284 ! is_imm( lhs.value ) || 1285 is_imm( rhs.value ) == is_imm( lhs.value ), 1286 "incompatible operands" ); 1287 return true; 1288 1288 } 1289 1289 else if ( lhs.value->level() != rhs.value->level() ) 1290 1290 return true; 1291 1291 else if ( lhs.value->levelcoeff() != rhs.value->levelcoeff() ) 1292 1293 else 1292 return true; 1293 else return rhs.value->comparesame( lhs.value ) != 0; 1294 1294 } 1295 1295 //}}} … … 1321 1321 // w.r.t. lexicographic ordering, then f < g. For more details, 1322 1322 // refer to the documentation of `InternalPoly::operator <()'. 1323 // 1323 // 1324 1324 // Both operands should have coefficients from the same base domain. 1325 1325 // … … 1345 1345 int what = is_imm( rhs.value ); 1346 1346 if ( is_imm( lhs.value ) ) { 1347 1348 1349 1350 1351 1352 1353 1354 1355 1347 ASSERT( ! what || (what == is_imm( lhs.value )), "incompatible operands" ); 1348 if ( what == 0 ) 1349 return rhs.value->comparecoeff( lhs.value ) < 0; 1350 else if ( what == INTMARK ) 1351 return imm_cmp( lhs.value, rhs.value ) > 0; 1352 else if ( what == FFMARK ) 1353 return imm_cmp_p( lhs.value, rhs.value ) > 0; 1354 else 1355 return imm_cmp_gf( lhs.value, rhs.value ) > 0; 1356 1356 } 1357 1357 else if ( what ) 1358 1358 return lhs.value->comparecoeff( rhs.value ) > 0; 1359 1359 else if ( lhs.value->level() == rhs.value->level() ) 1360 1361 1362 1363 1364 1365 1366 else 1367 1360 if ( lhs.value->levelcoeff() == rhs.value->levelcoeff() ) 1361 return lhs.value->comparesame( rhs.value ) > 0; 1362 else if ( lhs.value->levelcoeff() > rhs.value->levelcoeff() ) 1363 return lhs.value->comparecoeff( rhs.value ) > 0; 1364 else 1365 return rhs.value->comparecoeff( lhs.value ) < 0; 1366 else 1367 return lhs.value->level() > rhs.value->level(); 1368 1368 } 1369 1369 … … 1373 1373 int what = is_imm( rhs.value ); 1374 1374 if ( is_imm( lhs.value ) ) { 1375 1376 1377 1378 1379 1380 1381 1382 1383 1375 ASSERT( ! what || (what == is_imm( lhs.value )), "incompatible operands" ); 1376 if ( what == 0 ) 1377 return rhs.value->comparecoeff( lhs.value ) > 0; 1378 else if ( what == INTMARK ) 1379 return imm_cmp( lhs.value, rhs.value ) < 0; 1380 else if ( what == FFMARK ) 1381 return imm_cmp_p( lhs.value, rhs.value ) < 0; 1382 else 1383 return imm_cmp_gf( lhs.value, rhs.value ) < 0; 1384 1384 } 1385 1385 else if ( what ) 1386 1386 return lhs.value->comparecoeff( rhs.value ) < 0; 1387 1387 else if ( lhs.value->level() == rhs.value->level() ) 1388 1389 1390 1391 1392 1393 1394 else 1395 1388 if ( lhs.value->levelcoeff() == rhs.value->levelcoeff() ) 1389 return lhs.value->comparesame( rhs.value ) < 0; 1390 else if ( lhs.value->levelcoeff() > rhs.value->levelcoeff() ) 1391 return lhs.value->comparecoeff( rhs.value ) < 0; 1392 else 1393 return rhs.value->comparecoeff( lhs.value ) > 0; 1394 else 1395 return lhs.value->level() < rhs.value->level(); 1396 1396 } 1397 1397 //}}} … … 1411 1411 // the prime power domain. 1412 1412 // 1413 // Implementation: 1413 // Implementation: 1414 1414 // 1415 1415 // CanonicalForm::bgcd() handles the immediate case with a … … 1438 1438 int what = is_imm( g.value ); 1439 1439 if ( is_imm( f.value ) ) { 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1440 ASSERT( ! what || (what == is_imm( f.value )), "incompatible operands" ); 1441 if ( what == 0 ) 1442 return g.value->bgcdcoeff( f.value ); 1443 else if ( what == INTMARK && ! cf_glob_switches.isOn( SW_RATIONAL ) ) { 1444 // calculate gcd using standard integer 1445 // arithmetic 1446 int fInt = imm2int( f.value ); 1447 int gInt = imm2int( g.value ); 1448 1449 if ( fInt < 0 ) fInt = -fInt; 1450 if ( gInt < 0 ) gInt = -gInt; 1451 // swap fInt and gInt 1452 if ( gInt > fInt ) { 1453 int swap = gInt; 1454 gInt = fInt; 1455 fInt = swap; 1456 } 1457 1458 // now, 0 <= gInt <= fInt. Start the loop. 1459 while ( gInt ) { 1460 // calculate (fInt, gInt) = (gInt, fInt%gInt) 1461 int r = fInt % gInt; 1462 fInt = gInt; 1463 gInt = r; 1464 } 1465 1466 return CanonicalForm( fInt ); 1467 } else 1468 // we do not go for maximal speed for these stupid 1469 // special cases 1470 return CanonicalForm( f.isZero() && g.isZero() ? 0 : 1 ); 1471 1471 } 1472 1472 else if ( what ) 1473 1473 return f.value->bgcdcoeff( g.value ); 1474 1474 1475 1475 int fLevel = f.value->level(); … … 1478 1478 // check levels 1479 1479 if ( fLevel == gLevel ) { 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1480 fLevel = f.value->levelcoeff(); 1481 gLevel = g.value->levelcoeff(); 1482 1483 // check levelcoeffs 1484 if ( fLevel == gLevel ) 1485 return f.value->bgcdsame( g.value ); 1486 else if ( fLevel < gLevel ) 1487 return g.value->bgcdcoeff( f.value ); 1488 else 1489 return f.value->bgcdcoeff( g.value ); 1490 1490 } 1491 1491 else if ( fLevel < gLevel ) 1492 1493 else 1494 1492 return g.value->bgcdcoeff( f.value ); 1493 else 1494 return f.value->bgcdcoeff( g.value ); 1495 1495 } 1496 1496 //}}} … … 1508 1508 int what = is_imm( g.value ); 1509 1509 if ( is_imm( f.value ) ) { 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1510 ASSERT( ! what || (what == is_imm( f.value )), "incompatible operands" ); 1511 if ( what == 0 ) 1512 return g.value->bextgcdcoeff( f.value, b, a ); 1513 else if ( what == INTMARK && ! cf_glob_switches.isOn( SW_RATIONAL ) ) { 1514 // calculate extended gcd using standard integer 1515 // arithmetic 1516 int fInt = imm2int( f.value ); 1517 int gInt = imm2int( g.value ); 1518 1519 // to avoid any system dpendencies with `%', we work 1520 // with positive numbers only. To a pity, we have to 1521 // redo all the checks when assigning to a and b. 1522 if ( fInt < 0 ) fInt = -fInt; 1523 if ( gInt < 0 ) gInt = -gInt; 1524 // swap fInt and gInt 1525 if ( gInt > fInt ) { 1526 int swap = gInt; 1527 gInt = fInt; 1528 fInt = swap; 1529 } 1530 1531 int u = 1; int v = 0; 1532 int uNext = 0; int vNext = 1; 1533 1534 // at any step, we have: 1535 // fInt_0 * u + gInt_0 * v = fInt 1536 // fInt_0 * uNext + gInt_0 * vNext = gInt 1537 // where fInt_0 and gInt_0 denote the values of fint 1538 // and gInt, resp., at the beginning 1539 while ( gInt ) { 1540 int r = fInt % gInt; 1541 int q = fInt / gInt; 1542 int uSwap = u - q * uNext; 1543 int vSwap = v - q * vNext; 1544 1545 // update variables 1546 fInt = gInt; 1547 gInt = r; 1548 u = uNext; v = vNext; 1549 uNext = uSwap; vNext = vSwap; 1550 } 1551 1552 // now, assign to a and b 1553 int fTest = imm2int( f.value ); 1554 int gTest = imm2int( g.value ); 1555 if ( gTest > fTest ) { 1556 a = v; b = u; 1557 } else { 1558 a = u; b = v; 1559 } 1560 if ( fTest < 0 ) a = -a; 1561 if ( gTest < 0 ) b = -b; 1562 return CanonicalForm( fInt ); 1563 } else 1564 // stupid special cases 1565 if ( ! f.isZero() ) { 1566 a = 1/f; b = 0; return CanonicalForm( 1 ); 1567 } else if ( ! g.isZero() ) { 1568 a = 0; b = 1/g; return CanonicalForm( 1 ); 1569 } else { 1570 a = 0; b = 0; return CanonicalForm( 0 ); 1571 } 1572 1572 } 1573 1573 else if ( what ) 1574 1574 return f.value->bextgcdcoeff( g.value, a, b ); 1575 1575 1576 1576 int fLevel = f.value->level(); … … 1579 1579 // check levels 1580 1580 if ( fLevel == gLevel ) { 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1581 fLevel = f.value->levelcoeff(); 1582 gLevel = g.value->levelcoeff(); 1583 1584 // check levelcoeffs 1585 if ( fLevel == gLevel ) 1586 return f.value->bextgcdsame( g.value, a, b ); 1587 else if ( fLevel < gLevel ) 1588 return g.value->bextgcdcoeff( f.value, b, a ); 1589 else 1590 return f.value->bextgcdcoeff( g.value, a, b ); 1591 1591 } 1592 1592 else if ( fLevel < gLevel ) 1593 1594 else 1595 1593 return g.value->bextgcdcoeff( f.value, b, a ); 1594 else 1595 return f.value->bextgcdcoeff( g.value, a, b ); 1596 1596 } 1597 1597 //}}} … … 1601 1601 { 1602 1602 if ( f.isZero() || g.isZero() ) 1603 1603 return CanonicalForm( 0 ); 1604 1604 /* 1605 1605 else if (f.isOne()) … … 1609 1609 */ 1610 1610 else 1611 1611 return (f / bgcd( f, g )) * g; 1612 1612 } 1613 1613 … … 1618 1618 { 1619 1619 if ( is_imm( value ) ) 1620 1621 else 1622 1620 imm_print( os, value, str ); 1621 else 1622 value->print( os, str ); 1623 1623 } 1624 1624 … … 1627 1627 { 1628 1628 if ( is_imm( value ) ) 1629 1630 else 1631 1629 imm_print( os, value, "" ); 1630 else 1631 value->print( os, "" ); 1632 1632 } 1633 1633 … … 1664 1664 int what = is_imm( value ); 1665 1665 if ( what == FFMARK ) 1666 1666 return CanonicalForm( CFFactory::basic( FiniteFieldDomain, 0 ) ); 1667 1667 else if ( what == GFMARK ) 1668 1668 return CanonicalForm( CFFactory::basic( GaloisFieldDomain, 0 ) ); 1669 1669 else if ( what ) 1670 1671 else 1672 1670 return CanonicalForm( CFFactory::basic( IntegerDomain, 0 ) ); 1671 else 1672 return CanonicalForm( value->genZero() ); 1673 1673 } 1674 1674 … … 1678 1678 int what = is_imm( value ); 1679 1679 if ( what == FFMARK ) 1680 1680 return CanonicalForm( CFFactory::basic( FiniteFieldDomain, 1 ) ); 1681 1681 else if ( what == GFMARK ) 1682 1682 return CanonicalForm( CFFactory::basic( GaloisFieldDomain, 1 ) ); 1683 1683 else if ( what ) 1684 1685 else 1686 1684 return CanonicalForm( CFFactory::basic( IntegerDomain, 1 ) ); 1685 else 1686 return CanonicalForm( value->genOne() ); 1687 1687 } 1688 1688 //}}} … … 1694 1694 ASSERT( n >= 0, "illegal exponent" ); 1695 1695 if ( f.isZero() || f.isOne() ) 1696 return f; 1697 else if ( (-f).isOne() ) { 1698 if ( n % 2 == 0 ) 1699 return -f; 1700 else 1701 return f; 1696 return f; 1697 else if ( (-f).isOne() ) 1698 { 1699 if ( n % 2 == 0 ) 1700 return -f; 1701 else 1702 return f; 1702 1703 } 1703 1704 else if ( n == 0 ) 1704 1705 return f.genOne(); 1705 1706 //else if (f.inGF()) 1706 1707 //{ 1707 1708 //} 1708 else { 1709 else 1710 { 1709 1711 CanonicalForm g,h; 1710 1712 h=f; … … 1731 1733 ASSERT( n >= 0, "illegal exponent" ); 1732 1734 if ( n == 0 ) 1733 1735 return 1; 1734 1736 else if ( n == 1 ) 1735 return v; 1736 else if ( v.level() < 0 ) { 1737 CanonicalForm result( v, n-1 ); 1738 return result * v; 1739 } 1740 else 1741 return CanonicalForm( v, n ); 1737 return v; 1738 else if ( v.level() < 0 ) 1739 { 1740 CanonicalForm result( v, n-1 ); 1741 return result * v; 1742 } 1743 else 1744 return CanonicalForm( v, n ); 1742 1745 } 1743 1746 //}}} -
factory/cf_gcd.cc
rc6ed6f r094eed 1 1 /* emacs edit mode for this file is -*- C++ -*- */ 2 /* $Id: cf_gcd.cc,v 1.3 4 2005-12-09 09:49:28 pohlExp $ */2 /* $Id: cf_gcd.cc,v 1.35 2005-12-09 15:00:59 Singular Exp $ */ 3 3 4 4 #include <config.h> … … 444 444 #else 445 445 return N( ezgcd( M(f), M(g) ) ); 446 #endif 446 #endif 447 447 } 448 448 else if ( isOn( SW_USE_SPARSEMOD ) … … 455 455 if (si_factor_reminder) 456 456 printf("sparsemod failed, trying gcd_poly1\n"); 457 457 return r; 458 458 //return gcd_poly1( f, g, modularflag); 459 459 } … … 494 494 } 495 495 else 496 { 497 ASSERT(g==0,"invalid call of cf_gcd"); 496 498 if ( f.sign() < 0 ) 497 499 return -f; 498 500 else 499 501 return f; 502 } 500 503 } 501 504 //}}} … … 588 591 { 589 592 if ( f.isZero() ) 590 if ( g.lc().sign() < 0 ) 591 return -g; 592 else 593 return g; 593 { 594 if ( g.lc().sign() < 0 ) 595 return -g; 596 else 597 return g; 598 } 594 599 else if ( g.isZero() ) 595 if ( f.lc().sign() < 0 ) 596 return -f; 597 else 598 return f; 600 { 601 if ( f.lc().sign() < 0 ) 602 return -f; 603 else 604 return f; 605 } 599 606 else if ( f.inBaseDomain() ) 600 607 return bcontent( g, f );
Note: See TracChangeset
for help on using the changeset viewer.