Changeset 5295f9 in git


Ignore:
Timestamp:
Aug 9, 2012, 11:33:24 AM (10 years ago)
Author:
Martin Lee <martinlee84@…>
Branches:
(u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', '96ce329119711a2b80858c8365abd29f8460bbfa')
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
Message:
chg: more heuristics to detect right leading coeff
File:
1 edited

Legend:

Unmodified
Added
Removed
  • factory/facFactorize.cc

    r79592ac r5295f9  
    889889  }
    890890
     891  CanonicalForm LCmultiplier= leadingCoeffs.getFirst();
    891892  leadingCoeffs.removeFirst();
    892893
     
    956957      factors= CFList();
    957958    }
     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    }
    9581153    else
    9591154      factors= CFList();
Note: See TracChangeset for help on using the changeset viewer.