Changeset b30017 in git for factory/facFqFactorize.cc
- Timestamp:
- Aug 22, 2012, 11:16:18 AM (12 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 903f87563d5c7fb02893c3f85c6e728757b7106b
- Parents:
- c89740c263a7f55af9bd2cdbff4e77573d7eb82e
- git-author:
- Martin Lee <martinlee84@web.de>2012-08-22 11:16:18+02:00
- git-committer:
- Martin Lee <martinlee84@web.de>2012-09-04 18:01:19+02:00
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
factory/facFqFactorize.cc
rc89740 rb30017 2593 2593 CFList bufFactors= CFList(); 2594 2594 bool LCheuristic= false; 2595 if (LucksWangSparseHeuristic (A, biFactors, 2, leadingCoeffs2 2595 if (LucksWangSparseHeuristic (A, biFactors, 2, leadingCoeffs2[lengthAeval2-1], 2596 2596 factors)) 2597 2597 { … … 2604 2604 { 2605 2605 if (extension) 2606 factors= extNonMonicFactorRecombination (factors, bufA, info); //TODO brauche hier ein bufA statt A2606 factors= extNonMonicFactorRecombination (factors, bufA, info); 2607 2607 2608 2608 if (v.level() != 1) … … 2646 2646 factors= CFList(); 2647 2647 } 2648 else if (!LCmultiplierIsConst && factors.length() == 0) 2649 { 2650 LCheuristic= true; 2651 factors= oldFactors; 2652 CanonicalForm cont; 2653 CFList contents, LCs; 2654 int index=1; 2655 bool foundTrueMultiplier= false; 2656 for (iter= factors; iter.hasItem(); iter++, index++) 2657 { 2658 cont= content (iter.getItem(), 1); 2659 cont= gcd (cont , LCmultiplier); 2660 contents.append (cont); 2661 if (cont.inCoeffDomain()) // trivial content->LCmultiplier needs to go there 2662 { 2663 foundTrueMultiplier= true; 2664 int index2= 1; 2665 for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); iter2++, 2666 index2++) 2667 { 2668 if (index2 == index) 2669 continue; 2670 iter2.getItem() /= LCmultiplier; 2671 } 2672 A= oldA; 2673 leadingCoeffs= leadingCoeffs2[lengthAeval2-1]; 2674 for (int i= lengthAeval2-1; i > -1; i--) 2675 leadingCoeffs2[i]= CFList(); 2676 prepareLeadingCoeffs (leadingCoeffs2, A.level(), leadingCoeffs, 2677 biFactors, evaluation ); 2678 Aeval= evaluateAtEval (A, evaluation, 2); 2679 2680 hh= Lc (Aeval.getFirst()); 2681 2682 for (iter2= Aeval; iter2.hasItem(); iter2++) 2683 iter2.getItem() /= hh; 2684 2685 A /= hh; 2686 break; 2687 } 2688 else 2689 LCs.append (LC (iter.getItem()/cont, 1)); 2690 } 2691 if (!foundTrueMultiplier) 2692 { 2693 index= 1; 2694 iter2= factors; 2695 bool foundMultiplier= false; 2696 for (iter= contents; iter.hasItem(); iter++, iter2++, index++) 2697 { 2698 if (fdivides (iter.getItem(), LCmultiplier)) 2699 { 2700 if ((LCmultiplier/iter.getItem()).inCoeffDomain() && 2701 !isOnlyLeadingCoeff(iter2.getItem())) //content divides LCmultiplier completely and factor consists of more terms than just the leading coeff 2702 { 2703 int index2= 1; 2704 for (CFListIterator iter3= leadingCoeffs2[lengthAeval2-1]; 2705 iter3.hasItem(); iter3++, index2++) 2706 { 2707 if (index2 == index) 2708 { 2709 iter3.getItem() /= LCmultiplier; 2710 break; 2711 } 2712 } 2713 A /= LCmultiplier; 2714 foundMultiplier= true; 2715 iter.getItem()= 1; 2716 } 2717 } 2718 } 2719 // coming from above: divide out more LCmultiplier if possible 2720 if (foundMultiplier) 2721 { 2722 foundMultiplier= false; 2723 index=1; 2724 iter2= factors; 2725 for (iter= contents; iter.hasItem(); iter++, iter2++, index++) 2726 { 2727 if (!iter.getItem().isOne() && 2728 fdivides (iter.getItem(), LCmultiplier)) 2729 { 2730 if (!isOnlyLeadingCoeff (iter2.getItem())) // factor is more than just leading coeff 2731 { 2732 int index2= 1; 2733 for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); 2734 iter2++, index2++) 2735 { 2736 if (index2 == index) 2737 { 2738 iter2.getItem() /= iter.getItem(); 2739 foundMultiplier= true; 2740 break; 2741 } 2742 } 2743 A /= iter.getItem(); 2744 LCmultiplier /= iter.getItem(); 2745 iter.getItem()= 1; 2746 } 2747 else if (fdivides (getVars (LCmultiplier), testVars))//factor consists of just leading coeff 2748 { 2749 //TODO maybe use a sqrffree decomposition of LCmultiplier as below 2750 Variable xx= Variable (2); 2751 CanonicalForm vars; 2752 vars= power (xx, degree (LC (getItem(oldBiFactors, index),1), 2753 xx)); 2754 for (int i= 0; i < lengthAeval2; i++) 2755 { 2756 if (oldAeval[i].isEmpty()) 2757 continue; 2758 xx= oldAeval[i].getFirst().mvar(); 2759 vars *= power (xx, degree (LC (getItem(oldAeval[i], index),1), 2760 xx)); 2761 } 2762 if (myGetVars(content(getItem(leadingCoeffs2[lengthAeval2-1],index),1)) 2763 /myGetVars (LCmultiplier) == vars) 2764 { 2765 int index2= 1; 2766 for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); 2767 iter2++, index2++) 2768 { 2769 if (index2 == index) 2770 { 2771 iter2.getItem() /= LCmultiplier; 2772 foundMultiplier= true; 2773 break; 2774 } 2775 } 2776 A /= LCmultiplier; 2777 iter.getItem()= 1; 2778 } 2779 } 2780 } 2781 } 2782 } 2783 else 2784 { 2785 CanonicalForm pLCs= prod (LCs); 2786 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 2787 { 2788 A= oldA; 2789 iter2= leadingCoeffs2[lengthAeval2-1]; 2790 for (iter= contents; iter.hasItem(); iter++, iter2++) 2791 iter2.getItem() /= iter.getItem(); 2792 foundMultiplier= true; 2793 } 2794 if (!foundMultiplier && fdivides (getVars (LCmultiplier), testVars)) 2795 { 2796 Variable xx; 2797 CFList vars1; 2798 CFFList sqrfMultiplier= sqrFree (LCmultiplier); 2799 if (sqrfMultiplier.getFirst().factor().inCoeffDomain()) 2800 sqrfMultiplier.removeFirst(); 2801 sqrfMultiplier= sortCFFListByNumOfVars (sqrfMultiplier); 2802 xx= Variable (2); 2803 for (iter= oldBiFactors; iter.hasItem(); iter++) 2804 vars1.append (power (xx, degree (LC (iter.getItem(),1), xx))); 2805 for (int i= 0; i < lengthAeval2; i++) 2806 { 2807 if (oldAeval[i].isEmpty()) 2808 continue; 2809 xx= oldAeval[i].getFirst().mvar(); 2810 iter2= vars1; 2811 for (iter= oldAeval[i]; iter.hasItem(); iter++, iter2++) 2812 iter2.getItem() *= power(xx,degree (LC (iter.getItem(),1), xx)); 2813 } 2814 CanonicalForm tmp; 2815 iter2= vars1; 2816 for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++, 2817 iter2++) 2818 { 2819 tmp= iter.getItem()/LCmultiplier; 2820 for (int i=1; i <= tmp.level(); i++) 2821 { 2822 if (degree (tmp, i) > 0) 2823 iter2.getItem() /= power (Variable (i), degree (tmp,i)); 2824 } 2825 } 2826 int multi; 2827 for (CFFListIterator ii= sqrfMultiplier; ii.hasItem(); ii++) 2828 { 2829 multi= 0; 2830 for (iter= vars1; iter.hasItem(); iter++) 2831 { 2832 tmp= iter.getItem(); 2833 while (fdivides (myGetVars (ii.getItem().factor()), tmp)) 2834 { 2835 multi++; 2836 tmp /= myGetVars (ii.getItem().factor()); 2837 } 2838 } 2839 if (multi == ii.getItem().exp()) 2840 { 2841 index= 1; 2842 for (iter= vars1; iter.hasItem(); iter++, index++) 2843 { 2844 while (fdivides (myGetVars(ii.getItem().factor()), 2845 iter.getItem() 2846 ) 2847 ) 2848 { 2849 int index2= 1; 2850 for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); 2851 iter2++, index2++) 2852 { 2853 if (index2 == index) 2854 continue; 2855 else 2856 { 2857 tmp= ii.getItem().factor(); 2858 iter2.getItem() /= tmp; 2859 CFListIterator iter3= evaluation; 2860 for (int jj= A.level(); jj > 2; jj--, iter3++) 2861 tmp= tmp (iter3.getItem(), jj); 2862 if (!tmp.inCoeffDomain()) 2863 { 2864 int index3= 1; 2865 for (iter3= biFactors; iter3.hasItem(); iter3++, 2866 index3++) 2867 { 2868 if (index3 == index2) 2869 { 2870 iter3.getItem() /= tmp; 2871 iter3.getItem() /= Lc (iter3.getItem()); 2872 break; 2873 } 2874 } 2875 } 2876 A /= ii.getItem().factor(); 2877 } 2878 } 2879 iter.getItem() /= getVars (ii.getItem().factor()); 2880 } 2881 } 2882 } 2883 else 2884 { 2885 index= 1; 2886 for (iter= vars1; iter.hasItem(); iter++, index++) 2887 { 2888 if (!fdivides (myGetVars (ii.getItem().factor()), 2889 iter.getItem() 2890 ) 2891 ) 2892 { 2893 int index2= 1; 2894 for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); 2895 iter2++, index2++) 2896 { 2897 if (index2 == index) 2898 { 2899 tmp= power (ii.getItem().factor(), ii.getItem().exp()); 2900 iter2.getItem() /= tmp; 2901 A /= tmp; 2902 CFListIterator iter3= evaluation; 2903 for (int jj= A.level(); jj > 2; jj--, iter3++) 2904 tmp= tmp (iter3.getItem(), jj); 2905 if (!tmp.inCoeffDomain()) 2906 { 2907 int index3= 1; 2908 for (iter3= biFactors; iter3.hasItem(); iter3++, 2909 index3++) 2910 { 2911 if (index3 == index2) 2912 { 2913 iter3.getItem() /= tmp; 2914 iter3.getItem() /= Lc (iter3.getItem()); 2915 break; 2916 } 2917 } 2918 } 2919 } 2920 } 2921 } 2922 } 2923 } 2924 } 2925 } 2926 } 2927 2928 // patch everything together again 2929 leadingCoeffs= leadingCoeffs2[lengthAeval2-1]; 2930 for (int i= lengthAeval2-1; i > -1; i--) 2931 leadingCoeffs2[i]= CFList(); 2932 prepareLeadingCoeffs (leadingCoeffs2,A.level(),leadingCoeffs, biFactors, 2933 evaluation); 2934 Aeval= evaluateAtEval (A, evaluation, 2); 2935 2936 hh= Lc (Aeval.getFirst()); 2937 2938 for (CFListIterator i= Aeval; i.hasItem(); i++) 2939 i.getItem() /= hh; 2940 2941 A /= hh; 2942 } 2943 factors= CFList(); 2944 if (!fdivides (LC (oldA,1),prod (leadingCoeffs2[lengthAeval2-1]))) 2945 { 2946 LCheuristic= false; 2947 A= bufA; 2948 biFactors= bufBiFactors; 2949 leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2; 2950 LCmultiplier= bufLCmultiplier; 2951 } 2952 } 2648 2953 else 2649 2954 factors= CFList(); … … 2651 2956 } 2652 2957 2958 if (!LCheuristic && !LCmultiplierIsConst && bufFactors.isEmpty() 2959 && fdivides (getVars (LCmultiplier), testVars)) 2960 { 2961 int index; 2962 Variable xx; 2963 CFList vars1; 2964 CFFList sqrfMultiplier= sqrFree (LCmultiplier); 2965 if (sqrfMultiplier.getFirst().factor().inCoeffDomain()) 2966 sqrfMultiplier.removeFirst(); 2967 sqrfMultiplier= sortCFFListByNumOfVars (sqrfMultiplier); 2968 xx= Variable (2); 2969 for (iter= oldBiFactors; iter.hasItem(); iter++) 2970 vars1.append (power (xx, degree (LC (iter.getItem(),1), xx))); 2971 for (int i= 0; i < lengthAeval2; i++) 2972 { 2973 if (oldAeval[i].isEmpty()) 2974 continue; 2975 xx= oldAeval[i].getFirst().mvar(); 2976 iter2= vars1; 2977 for (iter= oldAeval[i]; iter.hasItem(); iter++, iter2++) 2978 iter2.getItem() *= power (xx, degree (LC (iter.getItem(),1), xx)); 2979 } 2980 CanonicalForm tmp; 2981 iter2= vars1; 2982 for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++, iter2++) 2983 { 2984 tmp= iter.getItem()/LCmultiplier; 2985 for (int i=1; i <= tmp.level(); i++) 2986 { 2987 if (degree (tmp, i) > 0) 2988 iter2.getItem() /= power (Variable (i), degree (tmp,i)); 2989 } 2990 } 2991 int multi; 2992 for (CFFListIterator ii= sqrfMultiplier; ii.hasItem(); ii++) 2993 { 2994 multi= 0; 2995 for (iter= vars1; iter.hasItem(); iter++) 2996 { 2997 tmp= iter.getItem(); 2998 while (fdivides (myGetVars (ii.getItem().factor()), tmp)) 2999 { 3000 multi++; 3001 tmp /= myGetVars (ii.getItem().factor()); 3002 } 3003 } 3004 if (multi == ii.getItem().exp()) 3005 { 3006 index= 1; 3007 for (iter= vars1; iter.hasItem(); iter++, index++) 3008 { 3009 while (fdivides (myGetVars (ii.getItem().factor()), iter.getItem())) 3010 { 3011 int index2= 1; 3012 for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();iter2++, 3013 index2++) 3014 { 3015 if (index2 == index) 3016 continue; 3017 else 3018 { 3019 tmp= ii.getItem().factor(); 3020 iter2.getItem() /= tmp; 3021 CFListIterator iter3= evaluation; 3022 for (int jj= A.level(); jj > 2; jj--, iter3++) 3023 tmp= tmp (iter3.getItem(), jj); 3024 if (!tmp.inCoeffDomain()) 3025 { 3026 int index3= 1; 3027 for (iter3= biFactors; iter3.hasItem(); iter3++, index3++) 3028 { 3029 if (index3 == index2) 3030 { 3031 iter3.getItem() /= tmp; 3032 iter3.getItem() /= Lc (iter3.getItem()); 3033 break; 3034 } 3035 } 3036 } 3037 A /= ii.getItem().factor(); 3038 } 3039 } 3040 iter.getItem() /= getVars (ii.getItem().factor()); 3041 } 3042 } 3043 } 3044 else 3045 { 3046 index= 1; 3047 for (iter= vars1; iter.hasItem(); iter++, index++) 3048 { 3049 if (!fdivides (myGetVars (ii.getItem().factor()), iter.getItem())) 3050 { 3051 int index2= 1; 3052 for (iter2= leadingCoeffs2[lengthAeval2-1];iter2.hasItem();iter2++, 3053 index2++) 3054 { 3055 if (index2 == index) 3056 { 3057 tmp= power (ii.getItem().factor(), ii.getItem().exp()); 3058 iter2.getItem() /= tmp; 3059 A /= tmp; 3060 CFListIterator iter3= evaluation; 3061 for (int jj= A.level(); jj > 2; jj--, iter3++) 3062 tmp= tmp (iter3.getItem(), jj); 3063 if (!tmp.inCoeffDomain()) 3064 { 3065 int index3= 1; 3066 for (iter3= biFactors; iter3.hasItem(); iter3++, index3++) 3067 { 3068 if (index3 == index2) 3069 { 3070 iter3.getItem() /= tmp; 3071 iter3.getItem() /= Lc (iter3.getItem()); 3072 break; 3073 } 3074 } 3075 } 3076 } 3077 } 3078 } 3079 } 3080 } 3081 } 3082 3083 leadingCoeffs= leadingCoeffs2[lengthAeval2-1]; 3084 for (int i= lengthAeval2-1; i > -1; i--) 3085 leadingCoeffs2[i]= CFList(); 3086 prepareLeadingCoeffs (leadingCoeffs2,A.level(),leadingCoeffs, biFactors, 3087 evaluation); 3088 Aeval= evaluateAtEval (A, evaluation, 2); 3089 3090 hh= Lc (Aeval.getFirst()); 3091 3092 for (CFListIterator i= Aeval; i.hasItem(); i++) 3093 i.getItem() /= hh; 3094 3095 A /= hh; 3096 } 3097 3098 tryAgainWithoutHeu: 2653 3099 A= shift2Zero (A, Aeval, evaluation); 2654 3100 … … 2697 3143 if (noOneToOne) 2698 3144 { 3145 3146 if (!LCmultiplierIsConst && LCheuristic) 3147 { 3148 A= bufA; 3149 biFactors= bufBiFactors; 3150 leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2; 3151 delete [] liftBounds; 3152 LCheuristic= false; 3153 goto tryAgainWithoutHeu; 3154 //something probably went wrong in the heuristic 3155 } 3156 2699 3157 A= shift2Zero (oldA, Aeval, evaluation); 2700 3158 biFactors= oldBiFactors;
Note: See TracChangeset
for help on using the changeset viewer.