Changeset 77ed181 in git for factory/facFactorize.cc
- Timestamp:
- Feb 18, 2013, 6:25:59 PM (11 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- de27d825ef8e6c2bf0bebcf1629935b1d5a3412f
- Parents:
- 65148c4d2a607796fbd578ae2f3219965019aaae520eaa58f37075554f45501fdb328bb9c37f7f48
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
factory/facFactorize.cc
r520eaa5 r77ed181 413 413 414 414 if (w.level() != 1) 415 { 416 A= swapvar (A, y, w); 417 int i= A.level(); 418 CanonicalForm evalPoint; 419 for (CFListIterator iter= evaluation; iter.hasItem(); iter++, i--) 420 { 421 if (i == w.level()) 422 { 423 evalPoint= iter.getItem(); 424 iter.getItem()= evaluation.getLast(); 425 evaluation.removeLast(); 426 evaluation.append (evalPoint); 427 break; 428 } 429 } 430 for (i= 0; i < lengthAeval2; i++) 431 { 432 if (oldAeval[i].isEmpty()) 433 continue; 434 if (oldAeval[i].getFirst().level() == w.level()) 435 { 436 CFArray tmp= copy (oldAeval[i]); 437 oldAeval[i]= biFactors; 438 for (CFListIterator iter= oldAeval[i]; iter.hasItem(); iter++) 439 iter.getItem()= swapvar (iter.getItem(), w, y); 440 for (int ii= 0; ii < tmp.size(); ii++) 441 tmp[ii]= swapvar (tmp[ii], w, y); 442 CFArray tmp2= CFArray (tmp.size()); 443 CanonicalForm buf; 444 for (int ii= 0; ii < tmp.size(); ii++) 445 { 446 buf= tmp[ii] (evaluation.getLast(),y); 447 buf /= Lc (buf); 448 tmp2[findItem (uniFactors, buf)-1]=tmp[ii]; 449 } 450 biFactors= CFList(); 451 for (int j= 0; j < tmp2.size(); j++) 452 biFactors.append (tmp2[j]); 453 } 454 } 455 } 456 457 CFListIterator iter; 415 changeSecondVariable (A, biFactors, evaluation, oldAeval, lengthAeval2, 416 uniFactors, w); 417 458 418 CanonicalForm oldA= A; 459 419 CFList oldBiFactors= biFactors; 460 if (!leadingCoeffs.getFirst().inCoeffDomain())461 {462 CanonicalForm tmp= power (leadingCoeffs.getFirst(), biFactors.length() - 1);463 A *= tmp;464 tmp= leadingCoeffs.getFirst();465 iter= evaluation;466 for (int i= A.level(); i > 2; i--, iter++)467 tmp= tmp (iter.getItem(), i);468 if (!tmp.inCoeffDomain())469 {470 for (CFListIterator i= biFactors; i.hasItem(); i++)471 {472 i.getItem() *= tmp/LC (i.getItem(), 1);473 i.getItem() /= Lc (i.getItem());474 }475 }476 }477 420 478 421 CanonicalForm LCmultiplier= leadingCoeffs.getFirst(); … … 480 423 leadingCoeffs.removeFirst(); 481 424 425 if (!LCmultiplierIsConst) 426 distributeLCmultiplier (A, leadingCoeffs, biFactors, evaluation, LCmultiplier); 427 482 428 //prepare leading coefficients 483 429 CFList* leadingCoeffs2= new CFList [lengthAeval2]; 484 prepareLeadingCoeffs (leadingCoeffs2, A.level(), leadingCoeffs, biFactors, 485 evaluation); 486 487 488 Aeval= evaluateAtEval (A, evaluation, 2); 489 490 CanonicalForm hh= 1/Lc (Aeval.getFirst()); 491 492 for (iter= Aeval; iter.hasItem(); iter++) 493 iter.getItem() *= hh; 494 495 A *= hh; 496 497 CFListIterator iter2; 430 prepareLeadingCoeffs (leadingCoeffs2, A, Aeval, A.level(), leadingCoeffs, 431 biFactors, evaluation); 432 433 CFListIterator iter; 498 434 CFList bufLeadingCoeffs2= leadingCoeffs2[lengthAeval2-1]; 499 435 bufBiFactors= biFactors; 500 436 bufA= A; 501 CanonicalForm bufLCmultiplier= LCmultiplier; 502 CanonicalForm testVars; 437 CanonicalForm testVars, bufLCmultiplier= LCmultiplier; 503 438 if (!LCmultiplierIsConst) 504 439 { … … 571 506 LCheuristic= true; 572 507 factors= oldFactors; 573 CanonicalForm cont;574 508 CFList contents, LCs; 575 int index=1;576 509 bool foundTrueMultiplier= false; 577 for (iter= factors; iter.hasItem(); iter++, index++) 578 { 579 cont= content (iter.getItem(), 1); 580 cont= gcd (cont , LCmultiplier); 581 contents.append (cont); 582 if (cont.inCoeffDomain()) // trivial content->LCmultiplier needs to go there 583 { 584 foundTrueMultiplier= true; 585 int index2= 1; 586 for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); iter2++, 587 index2++) 588 { 589 if (index2 == index) 590 continue; 591 iter2.getItem() /= LCmultiplier; 592 } 510 LCHeuristic2 (LCmultiplier, factors, leadingCoeffs2[lengthAeval2-1], 511 contents, LCs, foundTrueMultiplier); 512 if (foundTrueMultiplier) 513 { 593 514 A= oldA; 594 515 leadingCoeffs= leadingCoeffs2[lengthAeval2-1]; 595 516 for (int i= lengthAeval2-1; i > -1; i--) 596 517 leadingCoeffs2[i]= CFList(); 597 prepareLeadingCoeffs (leadingCoeffs2, A.level(), leadingCoeffs, 598 biFactors, evaluation ); 599 Aeval= evaluateAtEval (A, evaluation, 2); 600 601 hh= 1/Lc (Aeval.getFirst()); 602 603 for (iter2= Aeval; iter2.hasItem(); iter2++) 604 iter2.getItem() *= hh; 605 606 A *= hh; 607 break; 608 } 609 else 610 LCs.append (LC (iter.getItem()/cont, 1)); 611 } 612 if (!foundTrueMultiplier) 613 { 614 index= 1; 615 iter2= factors; 518 prepareLeadingCoeffs (leadingCoeffs2, A, Aeval, A.level(), 519 leadingCoeffs, biFactors, evaluation); 520 } 521 else 522 { 616 523 bool foundMultiplier= false; 617 for (iter= contents; iter.hasItem(); iter++, iter2++, index++) 618 { 619 if (fdivides (iter.getItem(), LCmultiplier)) 620 { 621 if ((LCmultiplier/iter.getItem()).inCoeffDomain() && 622 !isOnlyLeadingCoeff(iter2.getItem())) //content divides LCmultiplier completely and factor consists of more terms than just the leading coeff 623 { 624 Variable xx= Variable (2); 625 CanonicalForm vars; 626 vars= power (xx, degree (LC (getItem(oldBiFactors, index),1), 627 xx)); 628 for (int i= 0; i < lengthAeval2; i++) 629 { 630 if (oldAeval[i].isEmpty()) 631 continue; 632 xx= oldAeval[i].getFirst().mvar(); 633 vars *= power (xx, degree (LC (getItem(oldAeval[i], index),1), 634 xx)); 635 } 636 if (vars.level() <= 2) 637 { 638 int index2= 1; 639 for (CFListIterator iter3= leadingCoeffs2[lengthAeval2-1]; 640 iter3.hasItem(); iter3++, index2++) 641 { 642 if (index2 == index) 643 { 644 iter3.getItem() /= LCmultiplier; 645 break; 646 } 647 } 648 A /= LCmultiplier; 649 foundMultiplier= true; 650 iter.getItem()= 1; 651 } 652 } 653 } 654 } 524 LCHeuristic3 (LCmultiplier, factors, oldBiFactors, contents, oldAeval, 525 A, leadingCoeffs2, lengthAeval2, foundMultiplier); 655 526 // coming from above: divide out more LCmultiplier if possible 656 527 if (foundMultiplier) 657 528 { 658 529 foundMultiplier= false; 659 index=1; 660 iter2= factors; 661 for (iter= contents; iter.hasItem(); iter++, iter2++, index++) 662 { 663 if (!iter.getItem().isOne() && 664 fdivides (iter.getItem(), LCmultiplier)) 665 { 666 if (!isOnlyLeadingCoeff (iter2.getItem())) // factor is more than just leading coeff 667 { 668 int index2= 1; 669 for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); 670 iter2++, index2++) 671 { 672 if (index2 == index) 673 { 674 iter2.getItem() /= iter.getItem(); 675 foundMultiplier= true; 676 break; 677 } 678 } 679 A /= iter.getItem(); 680 LCmultiplier /= iter.getItem(); 681 iter.getItem()= 1; 682 } 683 else if (fdivides (getVars (LCmultiplier), testVars))//factor consists of just leading coeff 684 { 685 Variable xx= Variable (2); 686 CanonicalForm vars; 687 vars= power (xx, degree (LC (getItem(oldBiFactors, index),1), 688 xx)); 689 for (int i= 0; i < lengthAeval2; i++) 690 { 691 if (oldAeval[i].isEmpty()) 692 continue; 693 xx= oldAeval[i].getFirst().mvar(); 694 vars *= power (xx, degree (LC (getItem(oldAeval[i], index),1), 695 xx)); 696 } 697 if (myGetVars(content(getItem(leadingCoeffs2[lengthAeval2-1],index),1)) 698 /myGetVars (LCmultiplier) == vars) 699 { 700 int index2= 1; 701 for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); 702 iter2++, index2++) 703 { 704 if (index2 == index) 705 { 706 iter2.getItem() /= LCmultiplier; 707 foundMultiplier= true; 708 break; 709 } 710 } 711 A /= LCmultiplier; 712 iter.getItem()= 1; 713 } 714 } 715 } 716 } 530 LCHeuristic4 (oldBiFactors, oldAeval, contents, factors, testVars, 531 lengthAeval2, leadingCoeffs2, A, LCmultiplier, 532 foundMultiplier); 717 533 } 718 534 else 719 535 { 720 CanonicalForm pLCs= prod (LCs); 721 if (fdivides (pLCs, LC (oldA,1)) && (LC(oldA,1)/pLCs).inCoeffDomain()) // check if the product of the lead coeffs of the primitive factors equals the lead coeff of the old A 722 { 723 A= oldA; 724 iter2= leadingCoeffs2[lengthAeval2-1]; 725 for (iter= contents; iter.hasItem(); iter++, iter2++) 726 iter2.getItem() /= iter.getItem(); 727 foundMultiplier= true; 728 } 536 LCHeuristicCheck (LCs, contents, A, oldA, 537 leadingCoeffs2[lengthAeval2-1], foundMultiplier); 729 538 if (!foundMultiplier && fdivides (getVars (LCmultiplier), testVars)) 730 539 { 731 Variable xx; 732 CFList vars1; 733 CFFList sqrfMultiplier= sqrFree (LCmultiplier); 734 if (sqrfMultiplier.getFirst().factor().inCoeffDomain()) 735 sqrfMultiplier.removeFirst(); 736 sqrfMultiplier= sortCFFListByNumOfVars (sqrfMultiplier); 737 xx= Variable (2); 738 for (iter= oldBiFactors; iter.hasItem(); iter++) 739 vars1.append (power (xx, degree (LC (iter.getItem(),1), xx))); 740 for (int i= 0; i < lengthAeval2; i++) 741 { 742 if (oldAeval[i].isEmpty()) 743 continue; 744 xx= oldAeval[i].getFirst().mvar(); 745 iter2= vars1; 746 for (iter= oldAeval[i]; iter.hasItem(); iter++, iter2++) 747 iter2.getItem() *= power(xx,degree (LC (iter.getItem(),1), xx)); 748 } 749 CanonicalForm tmp; 750 iter2= vars1; 751 for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++, 752 iter2++) 753 { 754 tmp= iter.getItem()/LCmultiplier; 755 for (int i=1; i <= tmp.level(); i++) 756 { 757 if (degree(tmp,i) > 0 && 758 (degree(iter2.getItem(),i) > degree (tmp,i))) 759 iter2.getItem() /= power (Variable (i), degree (tmp,i)); 760 } 761 } 762 int multi; 763 for (CFFListIterator ii= sqrfMultiplier; ii.hasItem(); ii++) 764 { 765 multi= 0; 766 for (iter= vars1; iter.hasItem(); iter++) 767 { 768 tmp= iter.getItem(); 769 while (fdivides (myGetVars (ii.getItem().factor()), tmp)) 770 { 771 multi++; 772 tmp /= myGetVars (ii.getItem().factor()); 773 } 774 } 775 if (multi == ii.getItem().exp()) 776 { 777 index= 1; 778 for (iter= vars1; iter.hasItem(); iter++, index++) 779 { 780 while (fdivides (myGetVars(ii.getItem().factor()), 781 iter.getItem() 782 ) 783 ) 784 { 785 int index2= 1; 786 for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); 787 iter2++, index2++) 788 { 789 if (index2 == index) 790 continue; 791 else 792 { 793 tmp= ii.getItem().factor(); 794 iter2.getItem() /= tmp; 795 CFListIterator iter3= evaluation; 796 for (int jj= A.level(); jj > 2; jj--, iter3++) 797 tmp= tmp (iter3.getItem(), jj); 798 if (!tmp.inCoeffDomain()) 799 { 800 int index3= 1; 801 for (iter3= biFactors; iter3.hasItem(); iter3++, 802 index3++) 803 { 804 if (index3 == index2) 805 { 806 iter3.getItem() /= tmp; 807 iter3.getItem() /= Lc (iter3.getItem()); 808 break; 809 } 810 } 811 } 812 A /= ii.getItem().factor(); 813 } 814 } 815 iter.getItem() /= getVars (ii.getItem().factor()); 816 } 817 } 818 } 819 else 820 { 821 index= 1; 822 for (iter= vars1; iter.hasItem(); iter++, index++) 823 { 824 if (!fdivides (myGetVars (ii.getItem().factor()), 825 iter.getItem() 826 ) 827 ) 828 { 829 int index2= 1; 830 for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); 831 iter2++, index2++) 832 { 833 if (index2 == index) 834 { 835 tmp= power (ii.getItem().factor(), ii.getItem().exp()); 836 iter2.getItem() /= tmp; 837 A /= tmp; 838 CFListIterator iter3= evaluation; 839 for (int jj= A.level(); jj > 2; jj--, iter3++) 840 tmp= tmp (iter3.getItem(), jj); 841 if (!tmp.inCoeffDomain()) 842 { 843 int index3= 1; 844 for (iter3= biFactors; iter3.hasItem(); iter3++, 845 index3++) 846 { 847 if (index3 == index2) 848 { 849 iter3.getItem() /= tmp; 850 iter3.getItem() /= Lc (iter3.getItem()); 851 break; 852 } 853 } 854 } 855 } 856 } 857 } 858 } 859 } 860 } 540 LCHeuristic (A, LCmultiplier, biFactors, leadingCoeffs2, oldAeval, 541 lengthAeval2, evaluation, oldBiFactors); 861 542 } 862 543 } … … 866 547 for (int i= lengthAeval2-1; i > -1; i--) 867 548 leadingCoeffs2[i]= CFList(); 868 prepareLeadingCoeffs (leadingCoeffs2,A.level(),leadingCoeffs, biFactors, 869 evaluation); 870 Aeval= evaluateAtEval (A, evaluation, 2); 871 872 hh= 1/Lc (Aeval.getFirst()); 873 874 for (CFListIterator i= Aeval; i.hasItem(); i++) 875 i.getItem() *= hh; 876 877 A *= hh; 549 prepareLeadingCoeffs (leadingCoeffs2, A, Aeval, A.level(),leadingCoeffs, 550 biFactors, evaluation); 878 551 } 879 552 factors= CFList(); … … 898 571 { 899 572 LCheuristic= true; 900 int index; 901 Variable xx; 902 CFList vars1; 903 CFFList sqrfMultiplier= sqrFree (LCmultiplier); 904 if (sqrfMultiplier.getFirst().factor().inCoeffDomain()) 905 sqrfMultiplier.removeFirst(); 906 sqrfMultiplier= sortCFFListByNumOfVars (sqrfMultiplier); 907 xx= Variable (2); 908 for (iter= oldBiFactors; iter.hasItem(); iter++) 909 vars1.append (power (xx, degree (LC (iter.getItem(),1), xx))); 910 for (int i= 0; i < lengthAeval2; i++) 911 { 912 if (oldAeval[i].isEmpty()) 913 continue; 914 xx= oldAeval[i].getFirst().mvar(); 915 iter2= vars1; 916 for (iter= oldAeval[i]; iter.hasItem(); iter++, iter2++) 917 iter2.getItem() *= power (xx, degree (LC (iter.getItem(),1), xx)); 918 } 919 CanonicalForm tmp; 920 iter2= vars1; 921 for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++, iter2++) 922 { 923 tmp= iter.getItem()/LCmultiplier; 924 for (int i=1; i <= tmp.level(); i++) 925 { 926 if (degree(tmp,i) > 0 && (degree(iter2.getItem(),i) > degree (tmp,i))) 927 iter2.getItem() /= power (Variable (i), degree (tmp,i)); 928 } 929 } 930 int multi; 931 for (CFFListIterator ii= sqrfMultiplier; ii.hasItem(); ii++) 932 { 933 multi= 0; 934 for (iter= vars1; iter.hasItem(); iter++) 935 { 936 tmp= iter.getItem(); 937 while (fdivides (myGetVars (ii.getItem().factor()), tmp)) 938 { 939 multi++; 940 tmp /= myGetVars (ii.getItem().factor()); 941 } 942 } 943 if (multi == ii.getItem().exp()) 944 { 945 index= 1; 946 for (iter= vars1; iter.hasItem(); iter++, index++) 947 { 948 while (fdivides (myGetVars (ii.getItem().factor()), iter.getItem())) 949 { 950 int index2= 1; 951 for (iter2= leadingCoeffs2[lengthAeval2-1];iter2.hasItem();iter2++, 952 index2++) 953 { 954 if (index2 == index) 955 continue; 956 else 957 { 958 tmp= ii.getItem().factor(); 959 iter2.getItem() /= tmp; 960 CFListIterator iter3= evaluation; 961 for (int jj= A.level(); jj > 2; jj--, iter3++) 962 tmp= tmp (iter3.getItem(), jj); 963 if (!tmp.inCoeffDomain()) 964 { 965 int index3= 1; 966 for (iter3= biFactors; iter3.hasItem(); iter3++, index3++) 967 { 968 if (index3 == index2) 969 { 970 iter3.getItem() /= tmp; 971 iter3.getItem() /= Lc (iter3.getItem()); 972 break; 973 } 974 } 975 } 976 A /= ii.getItem().factor(); 977 } 978 } 979 iter.getItem() /= getVars (ii.getItem().factor()); 980 } 981 } 982 } 983 else 984 { 985 index= 1; 986 for (iter= vars1; iter.hasItem(); iter++, index++) 987 { 988 if (!fdivides (myGetVars (ii.getItem().factor()), iter.getItem())) 989 { 990 int index2= 1; 991 for (iter2= leadingCoeffs2[lengthAeval2-1];iter2.hasItem();iter2++, 992 index2++) 993 { 994 if (index2 == index) 995 { 996 tmp= power (ii.getItem().factor(), ii.getItem().exp()); 997 iter2.getItem() /= tmp; 998 A /= tmp; 999 CFListIterator iter3= evaluation; 1000 for (int jj= A.level(); jj > 2; jj--, iter3++) 1001 tmp= tmp (iter3.getItem(), jj); 1002 if (!tmp.inCoeffDomain()) 1003 { 1004 int index3= 1; 1005 for (iter3= biFactors; iter3.hasItem(); iter3++, index3++) 1006 { 1007 if (index3 == index2) 1008 { 1009 iter3.getItem() /= tmp; 1010 iter3.getItem() /= Lc (iter3.getItem()); 1011 break; 1012 } 1013 } 1014 } 1015 } 1016 } 1017 } 1018 } 1019 } 1020 } 573 LCHeuristic (A, LCmultiplier, biFactors, leadingCoeffs2, oldAeval, 574 lengthAeval2, evaluation, oldBiFactors); 1021 575 1022 576 leadingCoeffs= leadingCoeffs2[lengthAeval2-1]; 1023 577 for (int i= lengthAeval2-1; i > -1; i--) 1024 578 leadingCoeffs2[i]= CFList(); 1025 prepareLeadingCoeffs (leadingCoeffs2,A.level(),leadingCoeffs, biFactors, 1026 evaluation); 1027 Aeval= evaluateAtEval (A, evaluation, 2); 1028 1029 hh= 1/Lc (Aeval.getFirst()); 1030 1031 for (CFListIterator i= Aeval; i.hasItem(); i++) 1032 i.getItem() *= hh; 1033 1034 A *= hh; 579 prepareLeadingCoeffs (leadingCoeffs2, A, Aeval, A.level(),leadingCoeffs, 580 biFactors, evaluation); 1035 581 1036 582 if (!fdivides (LC (oldA,1),prod (leadingCoeffs2[lengthAeval2-1]))) … … 1087 633 commonDenominators.append (bCommonDen (iter.getItem())); 1088 634 CanonicalForm tmp1, tmp2, tmp3=1; 635 CFListIterator iter2; 1089 636 for (int i= 0; i < lengthAeval2; i++) 1090 637 {
Note: See TracChangeset
for help on using the changeset viewer.