Changeset ec16f0 in git for factory/facFqFactorize.cc


Ignore:
Timestamp:
Dec 5, 2011, 3:43:07 PM (12 years ago)
Author:
Martin Lee <martinlee84@…>
Branches:
(u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', '38dfc5131670d387a89455159ed1e071997eec94')
Children:
ce21bd8d333faf7c8f2fcdbd11fa57c0b6ec7776
Parents:
4fe8a30d668fa6f87de68f0c0207d54767119a52
git-author:
Martin Lee <martinlee84@web.de>2011-12-05 15:43:07+01:00
git-committer:
Oleksandr Motsak <motsak@mathematik.uni-kl.de>2011-12-12 18:00:42+01:00
Message:
chg: use sparse heuristic in precomputation of leading coefficients
File:
1 edited

Legend:

Unmodified
Added
Removed
  • factory/facFqFactorize.cc

    r4fe8a3 rec16f0  
    16051605  }
    16061606
     1607  CFList interMedResult;
     1608  CanonicalForm oldSqrfPartF= sqrfPartF;
    16071609  sqrfPartF= shift2Zero (sqrfPartF, evalSqrfPartF, evaluation2, 1);
    16081610  if (factors.length() > 1)
    16091611  {
    1610     CanonicalForm LC1= LC (evalSqrfPartF.getFirst(), 1);
    1611 
    1612     CFArray leadingCoeffs= CFArray (factors.length());
     1612    CanonicalForm LC1= LC (oldSqrfPartF, 1);
     1613    CFList leadingCoeffs;
    16131614    for (int i= 0; i < factors.length(); i++)
    1614       leadingCoeffs[i]= LC1;
    1615 
    1616     for (CFListIterator i= factors; i.hasItem(); i++)
    1617     {
    1618       i.getItem()= i.getItem() (x + evaluation2.getLast(), x);
    1619       i.getItem() *= LC1 (0,2)/Lc (i.getItem());
    1620     }
    1621     factors.insert (1);
    1622 
    1623     CanonicalForm
    1624     newSqrfPartF= evalSqrfPartF.getFirst()*power (LC1, factors.length() - 2);
    1625 
    1626     int liftBound= degree (newSqrfPartF,2) + 1;
    1627 
    1628     CFMatrix M= CFMatrix (liftBound, factors.length() - 1);
    1629     CFArray Pi;
    1630     CFList diophant;
    1631     henselLift122 (newSqrfPartF, factors, liftBound, Pi, diophant, M,
    1632                    leadingCoeffs, false);
    1633 
    1634     if (sqrfPartF.level() > 2)
    1635     {
    1636       int* liftBounds= new int [sqrfPartF.level() - 1];
    1637       liftBounds [0]= liftBound;
    1638       bool noOneToOne= false;
    1639       CFList *leadingCoeffs2= new CFList [sqrfPartF.level()-2];
    1640       LC1= LC (evalSqrfPartF.getLast(), 1);
    1641       CFList LCs;
     1615      leadingCoeffs.append (LC1);
     1616
     1617    CFList LC1eval= evaluateAtEval (LC1, evaluation2, 1);
     1618    CFList oldFactors= factors;
     1619    for (CFListIterator i= oldFactors; i.hasItem(); i++)
     1620      i.getItem() *= LC1eval.getFirst()/Lc (i.getItem());
     1621
     1622    bool success= false;
     1623    if (LucksWangSparseHeuristic (oldSqrfPartF*power (LC1, factors.length()-1),
     1624                                  oldFactors, 1, leadingCoeffs, factors))
     1625    {
     1626      interMedResult= recoverFactors (oldSqrfPartF, factors);
     1627      if (oldFactors.length() == interMedResult.length())
     1628        success= true;
     1629    }
     1630    if (!success)
     1631    {
     1632      LC1= LC (evalSqrfPartF.getFirst(), 1);
     1633
     1634      CFArray leadingCoeffs= CFArray (factors.length());
    16421635      for (int i= 0; i < factors.length(); i++)
    1643         LCs.append (LC1);
    1644       leadingCoeffs2 [sqrfPartF.level() - 3]= LCs;
    1645       for (int i= sqrfPartF.level() - 1; i > 2; i--)
    1646       {
    1647         for (CFListIterator j= LCs; j.hasItem(); j++)
    1648           j.getItem()= j.getItem() (0, i + 1);
    1649         leadingCoeffs2 [i - 3]= LCs;
    1650       }
    1651       sqrfPartF= sqrfPartF*power (LC1, factors.length()-1);
    1652 
    1653       int liftBoundsLength= sqrfPartF.level() - 1;
    1654       for (int i= 1; i < liftBoundsLength; i++)
    1655         liftBounds [i]= degree (sqrfPartF, i + 2) + 1;
    1656       evalSqrfPartF= evaluateAtZero (sqrfPartF);
    1657       evalSqrfPartF.removeFirst();
    1658       factors= nonMonicHenselLift (evalSqrfPartF, factors, leadingCoeffs2,
    1659                diophant, Pi, liftBounds, sqrfPartF.level() - 1, noOneToOne);
    1660       delete [] leadingCoeffs2;
    1661       delete [] liftBounds;
     1636        leadingCoeffs[i]= LC1;
     1637
     1638      for (CFListIterator i= factors; i.hasItem(); i++)
     1639      {
     1640        i.getItem()= i.getItem() (x + evaluation2.getLast(), x);
     1641        i.getItem() *= LC1 (0,2)/Lc (i.getItem());
     1642      }
     1643      factors.insert (1);
     1644
     1645      CanonicalForm
     1646      newSqrfPartF= evalSqrfPartF.getFirst()*power (LC1, factors.length() - 2);
     1647
     1648      int liftBound= degree (newSqrfPartF,2) + 1;
     1649
     1650      CFMatrix M= CFMatrix (liftBound, factors.length() - 1);
     1651      CFArray Pi;
     1652      CFList diophant;
     1653      henselLift122 (newSqrfPartF, factors, liftBound, Pi, diophant, M,
     1654                     leadingCoeffs, false);
     1655
     1656      if (sqrfPartF.level() > 2)
     1657      {
     1658        int* liftBounds= new int [sqrfPartF.level() - 1];
     1659        liftBounds [0]= liftBound;
     1660        bool noOneToOne= false;
     1661        CFList *leadingCoeffs2= new CFList [sqrfPartF.level()-2];
     1662        LC1= LC (evalSqrfPartF.getLast(), 1);
     1663        CFList LCs;
     1664        for (int i= 0; i < factors.length(); i++)
     1665          LCs.append (LC1);
     1666        leadingCoeffs2 [sqrfPartF.level() - 3]= LCs;
     1667        for (int i= sqrfPartF.level() - 1; i > 2; i--)
     1668        {
     1669          for (CFListIterator j= LCs; j.hasItem(); j++)
     1670            j.getItem()= j.getItem() (0, i + 1);
     1671          leadingCoeffs2 [i - 3]= LCs;
     1672        }
     1673        sqrfPartF *= power (LC1, factors.length()-1);
     1674
     1675        int liftBoundsLength= sqrfPartF.level() - 1;
     1676        for (int i= 1; i < liftBoundsLength; i++)
     1677          liftBounds [i]= degree (sqrfPartF, i + 2) + 1;
     1678        evalSqrfPartF= evaluateAtZero (sqrfPartF);
     1679        evalSqrfPartF.removeFirst();
     1680        factors= nonMonicHenselLift (evalSqrfPartF, factors, leadingCoeffs2,
     1681                 diophant, Pi, liftBounds, sqrfPartF.level() - 1, noOneToOne);
     1682        delete [] leadingCoeffs2;
     1683        delete [] liftBounds;
     1684      }
     1685      for (CFListIterator iter= factors; iter.hasItem(); iter++)
     1686        iter.getItem()= reverseShift (iter.getItem(), evaluation2, 1);
     1687
     1688      interMedResult=
     1689      recoverFactors (reverseShift(evalSqrfPartF.getLast(),evaluation2,1),
     1690                      factors);
    16621691    }
    16631692  }
    16641693  else
    1665     factors= evalSqrfPartF.getLast();
    1666 
    1667   for (CFListIterator iter= factors; iter.hasItem(); iter++)
    1668     iter.getItem()= reverseShift (iter.getItem(), evaluation2, 1);
    1669 
    1670   CFList interMedResult=
    1671   recoverFactors (reverseShift(evalSqrfPartF.getLast(),evaluation2,1), factors);
     1694  {
     1695    factors= CFList (oldSqrfPartF);
     1696    interMedResult= recoverFactors (oldSqrfPartF, factors);
     1697  }
    16721698
    16731699  CFList result;
Note: See TracChangeset for help on using the changeset viewer.