Changeset 5295f9 in git for factory/facFactorize.cc
- Timestamp:
- Aug 9, 2012, 11:33:24 AM (10 years ago)
- Branches:
- (u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', '2234726c50d679d6664181a5c72f75a6fd64a787')
- Children:
- 1a2d6611738ea83b676a2b906a53986d841f8957
- Parents:
- 79592ac0413bc31f4675cd016eba92870cff9765
- git-author:
- Martin Lee <martinlee84@web.de>2012-08-09 11:33:24+02:00
- git-committer:
- Martin Lee <martinlee84@web.de>2012-09-04 18:01:17+02:00
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
factory/facFactorize.cc
r79592ac r5295f9 889 889 } 890 890 891 CanonicalForm LCmultiplier= leadingCoeffs.getFirst(); 891 892 leadingCoeffs.removeFirst(); 892 893 … … 956 957 factors= CFList(); 957 958 } 959 else if (!LCmultiplier.inCoeffDomain() && factors.length() == 0) 960 { 961 factors= oldFactors; 962 CanonicalForm cont; 963 CFList contents, LCs; 964 CFListIterator iter2; 965 int index=1; 966 bool foundTrueMultiplier= false; 967 for (iter= factors; iter.hasItem(); iter++, index++) 968 { 969 cont= content (iter.getItem(), 1); 970 cont= gcd (cont , LCmultiplier); 971 contents.append (cont); 972 if (cont.inCoeffDomain()) // trivial content->LCmultiplier needs to go there 973 { 974 foundTrueMultiplier= true; 975 int index2= 1; 976 for (iter2= leadingCoeffs2[A.level()-3]; iter2.hasItem(); iter2++, 977 index2++) 978 { 979 if (index2 == index) 980 continue; 981 iter2.getItem() /= LCmultiplier; 982 } 983 A /= power (LCmultiplier, biFactors.length() -1); 984 leadingCoeffs= leadingCoeffs2[A.level()-3]; 985 for (int i= A.level()-3; i > -1; i--) 986 leadingCoeffs2[i]= CFList(); 987 prepareLeadingCoeffs (leadingCoeffs2, A.level(), leadingCoeffs, 988 biFactors, evaluation ); 989 Aeval= evaluateAtEval (A, evaluation, 2); 990 991 hh= Lc (Aeval.getFirst()); 992 993 for (iter2= Aeval; iter2.hasItem(); iter2++) 994 iter2.getItem() /= hh; 995 996 A /= hh; 997 break; 998 } 999 else 1000 LCs.append (LC (iter.getItem()/cont, 1)); 1001 } 1002 if (!foundTrueMultiplier) 1003 { 1004 index= 1; 1005 iter2= factors; 1006 bool foundMultiplier= false; 1007 for (iter= contents; iter.hasItem(); iter++, iter2++, index++) 1008 { 1009 if (fdivides (iter.getItem(), LCmultiplier)) 1010 { 1011 if ((LCmultiplier/iter.getItem()).inCoeffDomain() && 1012 !isOnlyLeadingCoeff(iter2.getItem())) //content divides LCmultiplier completely and factor consists of more terms than just the leading coeff 1013 { 1014 int index2= 1; 1015 for (CFListIterator iter3= leadingCoeffs2[A.level()-3]; 1016 iter3.hasItem(); iter3++, index2++) 1017 { 1018 if (index2 == index) 1019 { 1020 iter3.getItem() /= LCmultiplier; 1021 break; 1022 } 1023 } 1024 A /= LCmultiplier; 1025 foundMultiplier= true; 1026 iter.getItem()= 1; 1027 break; 1028 } 1029 } 1030 } 1031 // coming from above: divide out more LCmultiplier if possible 1032 if (foundMultiplier) 1033 { 1034 foundMultiplier= false; 1035 index=1; 1036 iter2= factors; 1037 for (iter= contents; iter.hasItem(); iter++, iter2++, index++) 1038 { 1039 if (!(iter.getItem().isOne()) && 1040 fdivides (iter.getItem(), LCmultiplier)) 1041 { 1042 if (!isOnlyLeadingCoeff (iter2.getItem())) // factor is more than just leading coeff 1043 { 1044 int index2= 1; 1045 for (iter2= leadingCoeffs2[A.level()-3]; iter2.hasItem(); 1046 iter2++, index2++) 1047 { 1048 if (index2 == index) 1049 { 1050 iter2.getItem() /= iter.getItem(); 1051 foundMultiplier= true; 1052 break; 1053 } 1054 } 1055 A /= iter.getItem(); 1056 LCmultiplier /= iter.getItem(); 1057 iter.getItem()= 1; 1058 break; 1059 } 1060 else //factor is consists of just leading coeff 1061 { 1062 CanonicalForm vars=getVars (iter.getItem()); 1063 CanonicalForm factor; 1064 Variable xx; 1065 bool oneVariableNotInCommon= false; 1066 for (int i= 0; i < A.level()-2; i++) 1067 { 1068 if (oldAeval[i].isEmpty()) 1069 continue; 1070 xx= oldAeval[i].getFirst().mvar(); 1071 factor= LC (getItem (oldAeval[i], index),1); 1072 if ((factor.inCoeffDomain() && degree (vars,xx) > 0) || 1073 (degree (factor,xx) > 0 && degree (vars,xx) < 0)) //scan for bivariate factors with leading coeff that does not contain variables which occur in LCmultiplier 1074 { 1075 oneVariableNotInCommon= true; 1076 break; 1077 } 1078 } 1079 if (oneVariableNotInCommon) 1080 { 1081 int index2= 1; 1082 for (iter2= leadingCoeffs2[A.level()-3]; iter2.hasItem(); 1083 iter2++, index2++) 1084 { 1085 if (index2 == index) 1086 { 1087 iter2.getItem() /= iter.getItem(); 1088 foundMultiplier= true; 1089 break; 1090 } 1091 } 1092 A /= iter.getItem(); 1093 LCmultiplier /= iter.getItem(); 1094 iter.getItem()= 1; 1095 break; 1096 } 1097 } 1098 } 1099 } 1100 // wipe out the last LCmultiplier 1101 if (foundMultiplier) 1102 { 1103 index= 1; 1104 for (iter= contents; iter.hasItem(); iter++, index++) 1105 { 1106 if (!iter.getItem().isOne() && 1107 fdivides (LCmultiplier, iter.getItem())) 1108 { 1109 int index2= 1; 1110 for (iter2= leadingCoeffs2[A.level()-3]; iter2.hasItem(); 1111 iter2++, index2++) 1112 { 1113 if (index2 == index) 1114 { 1115 iter2.getItem() /= LCmultiplier; 1116 A /= LCmultiplier; 1117 iter.getItem() /= LCmultiplier; 1118 } 1119 } 1120 } 1121 } 1122 } 1123 } 1124 else 1125 { 1126 CanonicalForm pLCs= prod (LCs); 1127 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 1128 { 1129 A= oldA; 1130 iter2= leadingCoeffs2[A.level()-3]; 1131 for (iter= contents; iter.hasItem(); iter++, iter2++) 1132 iter2.getItem() /= iter.getItem(); 1133 } 1134 } 1135 1136 // patch everything together again 1137 leadingCoeffs= leadingCoeffs2[A.level()-3]; 1138 for (int i= A.level()-3; i > -1; i--) 1139 leadingCoeffs2[i]= CFList(); 1140 prepareLeadingCoeffs (leadingCoeffs2,A.level(),leadingCoeffs, biFactors, 1141 evaluation); 1142 Aeval= evaluateAtEval (A, evaluation, 2); 1143 1144 hh= Lc (Aeval.getFirst()); 1145 1146 for (CFListIterator i= Aeval; i.hasItem(); i++) 1147 i.getItem() /= hh; 1148 1149 A /= hh; 1150 } 1151 factors= CFList(); 1152 } 958 1153 else 959 1154 factors= CFList();
Note: See TracChangeset
for help on using the changeset viewer.