Changeset 327efa2 in git for factory/facFactorize.cc


Ignore:
Timestamp:
Sep 14, 2011, 2:38:38 PM (13 years ago)
Author:
Martin Lee <martinlee84@…>
Branches:
(u'spielwiese', '17f1d200f27c5bd38f5dfc6e8a0879242279d1d8')
Children:
09723d9937585aae280f53597c2c61b2b3e6304a
Parents:
725e6002e0b07ad1474e14f72296c0c85a47ae4d
Message:
different lifting  in precomputeLeadingCoeff
extend henselLift122 to lift more than two factors


git-svn-id: file:///usr/local/Singular/svn/trunk@14382 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • factory/facFactorize.cc

    r725e600 r327efa2  
    202202      for (iter= bufSqrfFactors [i]; iter.hasItem(); iter++)
    203203      {
     204        if (iter.getItem().factor().inCoeffDomain())
     205          continue;
    204206        iter.getItem()= CFFactor (iter.getItem().factor()/
    205207                                  Lc (iter.getItem().factor()),
     
    212214      for (iter= bufSqrfFactors [i]; iter.hasItem(); iter++)
    213215      {
     216        if (iter.getItem().factor().inCoeffDomain())
     217          continue;
    214218        iter.getItem()= CFFactor (iter.getItem().factor()/
    215219                               Lc (iter.getItem().factor()),
     
    388392    factors= bufFactors;
    389393
    390   int liftBound= degree (sqrfPartF,2) + degree (LC (sqrfPartF, 1), 2) + 1;
    391 
    392   int* liftBounds= liftingBounds (sqrfPartF, liftBound);
    393394
    394395  bufFactors= factors;
    395   factors.insert (LC (evalSqrfPartF.getFirst(), 1));
    396   CFMatrix M= CFMatrix (liftBound, factors.length() - 1);
    397   CFArray Pi;
    398   CFList diophant;
    399   henselLift12 (evalSqrfPartF.getFirst(), factors, liftBound, Pi, diophant, M,
    400                 false);
    401 
    402   if (sqrfPartF.level() > 2)
    403     factors= henselLift (evalSqrfPartF, factors, liftBounds,
    404                          sqrfPartF.level() - 1, false);
    405 
    406   CFList MOD;
    407   for (int i= 0; i < sqrfPartF.level() - 1; i++)
    408     MOD.append (power (Variable (i + 2), liftBounds [i]));
    409 
    410   CFList interMedResult= leadingCoeffReconstruction (evalSqrfPartF.getLast(),
    411                                                      factors, MOD);
     396
     397  if (factors.length() > 1)
     398  {
     399    CanonicalForm LC1= LC (evalSqrfPartF.getFirst(), 1);
     400
     401    CFArray leadingCoeffs= CFArray (factors.length());
     402    for (int i= 0; i < factors.length(); i++)
     403      leadingCoeffs[i]= LC1;
     404    for (CFListIterator i= factors; i.hasItem(); i++)
     405      i.getItem() *= LC1 (0,2)/Lc (i.getItem());
     406    factors.insert (1);
     407
     408    CanonicalForm
     409    newSqrfPartF= evalSqrfPartF.getFirst()*power (LC1, factors.length() - 2);
     410
     411    int liftBound= degree (newSqrfPartF,2) + 1;
     412
     413    CFMatrix M= CFMatrix (liftBound, factors.length() - 1);
     414    CFArray Pi;
     415    CFList diophant;
     416    henselLift122 (newSqrfPartF, factors, liftBound, Pi, diophant, M,
     417                   leadingCoeffs, false);
     418
     419    if (sqrfPartF.level() > 2)
     420    {
     421      int* liftBounds= new int [sqrfPartF.level() - 1];
     422      liftBounds [0]= liftBound;
     423      bool noOneToOne= false;
     424      CFList *leadingCoeffs2= new CFList [sqrfPartF.level()-2];
     425      LC1= LC (evalSqrfPartF.getLast(), 1);
     426      CFList LCs;
     427      for (int i= 0; i < factors.length(); i++)
     428        LCs.append (LC1);
     429      leadingCoeffs2 [sqrfPartF.level() - 3]= LCs;
     430      for (int i= sqrfPartF.level() - 1; i > 2; i--)
     431      {
     432        for (CFListIterator j= LCs; j.hasItem(); j++)
     433          j.getItem()= j.getItem() (0, i + 1);
     434        leadingCoeffs2 [i - 3]= LCs;
     435      }
     436      sqrfPartF= sqrfPartF*power (LC1, factors.length()-1);
     437
     438      int liftBoundsLength= sqrfPartF.level() - 1;
     439      for (int i= 1; i < liftBoundsLength; i++)
     440        liftBounds [i]= degree (sqrfPartF, i + 2) + 1;
     441      evalSqrfPartF= evaluateAtZero (sqrfPartF);
     442      evalSqrfPartF.removeFirst();
     443      factors= nonMonicHenselLift (evalSqrfPartF, factors, leadingCoeffs2,
     444               diophant, Pi, liftBounds, sqrfPartF.level() - 1, noOneToOne);
     445      delete [] leadingCoeffs2;
     446      delete [] liftBounds;
     447    }
     448  }
     449  else
     450    factors= evalSqrfPartF.getLast();
     451
     452  CFList interMedResult= recoverFactors (evalSqrfPartF.getLast(), factors);
    412453
    413454  CFList result;
Note: See TracChangeset for help on using the changeset viewer.