Changeset c28ecf in git for libpolys/polys


Ignore:
Timestamp:
May 19, 2011, 2:52:08 PM (13 years ago)
Author:
Frank Seelisch <seelisch@…>
Branches:
(u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', 'b50cc4fc80fdf2a2005655a08d9229aa4b32d4a5')
Children:
4a2260efc22c19ac8eaf58d529af8decbb9420bb
Parents:
f0b01f1bf67efed9ec49d9df0d55f75284f5d968
git-author:
Frank Seelisch <seelisch@mathematik.uni-kl.de>2011-05-19 14:52:08+02:00
git-committer:
Mohamed Barakat <mohamed.barakat@rwth-aachen.de>2011-11-09 12:36:12+01:00
Message:
alg ext implementation now passing all coeffs and polys tests
Location:
libpolys/polys
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • libpolys/polys/ext_fields/algext.cc

    rf0b01f rc28ecf  
    7575  assume(getCoeffType(cf) == naID);
    7676  if (a == NULL) return TRUE;
    77   p_Test((poly)a, naRing); // cannot use omCheckAddrSize(a, sizeof(*a)) here
     77  p_Test((poly)a, naRing);
    7878  assume(p_Deg((poly)a, naRing) <= p_Deg(naMinpoly, naRing));
    7979  return TRUE;
     
    9090}
    9191
    92 void naDelete(number *a, const coeffs cf)
    93 {
    94   if (a == NULL) return;
    95   p_Delete((poly *)a, naRing);
     92void naDelete(number * a, const coeffs cf)
     93{
     94  if (*a == NULL) return;
     95  poly aAsPoly = (poly)(*a);
     96  p_Delete(&aAsPoly, naRing);
    9697  *a = NULL;
    9798}
     
    339340{
    340341  #ifdef LDEBUG
    341   omCheckAddr(p); omCheckAddr(reducer);
     342  p_Test((poly)p, naRing);
     343  p_Test((poly)reducer, naRing);
    342344  #endif
    343345  if (p_Deg(p, naRing) > 10 * p_Deg(reducer, naRing))
     
    427429{
    428430  #ifdef LDEBUG
    429   omCheckAddr(p); omCheckAddr(reducer);
     431  p_Test((poly)p, naRing);
     432  p_Test((poly)reducer, naRing);
    430433  #endif
    431434  p_PolyDiv(p, reducer, FALSE, naRing);
     
    443446  naTest(a);
    444447  if (a == NULL) WerrorS(nDivBy0);
    445   poly aFactor; poly mFactor;
     448  poly aFactor = NULL; poly mFactor = NULL;
    446449  poly theGcd = p_ExtGcd((poly)a, aFactor, naMinpoly, mFactor, naRing);
    447   /* the gcd must be one since naMinpoly is irreducible and a != NULL: */
     450  /* the gcd must be 1 since naMinpoly is irreducible and a != NULL: */
    448451  assume(naIsOne((number)theGcd, cf));     
    449452  p_Delete(&theGcd, naRing);
    450453  p_Delete(&mFactor, naRing);
     454  /* printf("naInvers\n");
     455     p_Write((poly)a, naRing);
     456     p_Write(aFactor, naRing); */
    451457  return (number)(aFactor);
    452458}
     
    566572 
    567573  #ifdef LDEBUG
    568   omCheckAddr(naMinpoly);
     574  p_Test((poly)naMinpoly, naRing);
    569575  #endif
    570576 
  • libpolys/polys/ext_fields/algext.h

    rf0b01f rc28ecf  
    6969number   naLcm(number a, number b, const coeffs cf);
    7070number   naSize(number a, const coeffs cf);
    71 void     naDelete(number *a, const coeffs cf);
     71void     naDelete(number * a, const coeffs cf);
    7272void     naCoeffWrite(const coeffs cf);
    7373number   naIntDiv(number a, number b, const coeffs cf);
  • libpolys/polys/monomials/p_polys.cc

    rf0b01f rc28ecf  
    14531453  int divisorLE = p_GetExp(divisor, 1, r);
    14541454//p_Write(p, r); p_Write(divisor, r);
    1455   while ((p != NULL) && (p_Deg(p, r) > p_Deg(divisor, r)))
     1455  while ((p != NULL) && (p_Deg(p, r) >= p_Deg(divisor, r)))
    14561456  {
    14571457    /* determine t = LT(p) / LT(divisor) */
     
    14621462    p_SetExp(t, 1, e, r);
    14631463    p_Setm(t, r);
    1464 //printf("t\n"); p_Write(t, r);
    14651464    if (needResult) result = p_Add_q(result, p_Copy(t, r), r);
    1466 //t = p_Mult_q(t, p_Copy(divisor, r), r); p_Write(t, r);
    1467 //t = p_Neg(t, r); p_Write(t, r);
    1468 //printf("p\n"); p_Write(p, r);
    1469 //t = p_Add_q(p, t, r); p_Write(t, r);
    1470 //p = t;
    14711465    p = p_Add_q(p, p_Neg(p_Mult_q(t, p_Copy(divisor, r), r), r), r);
    1472 //printf("EXECUTION STOPPED\n"); while (1) { };
    14731466  }
    14741467  n_Delete(&divisorLC, r->cf);
     1468//printf("p_PolyDiv result:\n");
     1469//p_Write(result, r);
    14751470  return result;
     1471}
     1472
     1473/* returns NULL if p == NULL, otherwise makes p monic by dividing
     1474   by its leading coefficient (only done if this is not already 1);
     1475   this assumes that we are over a ground field so that division
     1476   is well-defined;
     1477   modifies p */
     1478void p_Monic(poly &p, ring r)
     1479{
     1480  if (p == NULL) return;
     1481  poly pp = p;
     1482  number lc = p_GetCoeff(p, r);
     1483  if (n_IsOne(lc, r->cf)) return;
     1484  number n = n_Init(1, r->cf);
     1485  p_SetCoeff(p, n, r);
     1486  p = pIter(p);
     1487  while (p != NULL)
     1488  {
     1489    number c = p_GetCoeff(p, r);
     1490    number n = n_Div(c, lc, r->cf);
     1491    n_Delete(&c, r->cf);
     1492    p_SetCoeff(p, n, r);
     1493    p = pIter(p);
     1494  }
     1495  n_Delete(&lc, r->cf);
     1496  p = pp;
    14761497}
    14771498
     
    14811502poly p_GcdHelper(poly &p, poly &q, ring r)
    14821503{
    1483   if (q == NULL) return p;
     1504  if (q == NULL)
     1505  {
     1506    /* We have to make p monic before we return it, so that if the
     1507       gcd is a unit in the ground field, we will actually return 1. */
     1508    p_Monic(p, r);
     1509    return p;
     1510  }
    14841511  else
    14851512  {
     
    15111538                    ring r)
    15121539{
    1513 //printf("p_ExtGcdHelper:\n");
    15141540  if (q == NULL)
    15151541  {
    1516     qFactor = NULL; pFactor = p_ISet(1, r); return p;
     1542    qFactor = NULL;
     1543    pFactor = p_ISet(1, r);
     1544    number n = p_GetCoeff(pFactor, r);
     1545    p_SetCoeff(pFactor, n_Invers(p_GetCoeff(p, r), r->cf), r);
     1546    n_Delete(&n, r->cf);
     1547    p_Monic(p, r);
     1548    return p;
    15171549  }
    15181550  else
    15191551  {
     1552//printf("p_ExtGcdHelper1:\n");
    15201553//p_Write(p, r); p_Write(q, r);
    15211554    poly pDivQ = p_PolyDiv(p, q, TRUE, r);
    1522     poly ppFactor; poly qqFactor;
    1523     poly theGcd = p_ExtGcdHelper(q, ppFactor, p, qqFactor, r);
    1524     pFactor = qqFactor;
    1525     qFactor = p_Add_q(ppFactor,
    1526                       p_Neg(p_Mult_q(pDivQ, p_Copy(qqFactor, r), r), r),
     1555    poly ppFactor = NULL; poly qqFactor = NULL;
     1556//printf("p_ExtGcdHelper2:\n");
     1557//p_Write(p, r); p_Write(ppFactor, r);
     1558//p_Write(q, r); p_Write(qqFactor, r);
     1559    poly theGcd = p_ExtGcdHelper(q, qqFactor, p, ppFactor, r);
     1560//printf("p_ExtGcdHelper3:\n");
     1561//p_Write(q, r); p_Write(qqFactor, r);
     1562//p_Write(p, r); p_Write(ppFactor, r);
     1563//p_Write(theGcd, r);
     1564    pFactor = ppFactor;
     1565    qFactor = p_Add_q(qqFactor,
     1566                      p_Neg(p_Mult_q(pDivQ, p_Copy(ppFactor, r), r), r),
    15271567                      r);
     1568//printf("p_ExtGcdHelper4:\n");
     1569//p_Write(pFactor, r); p_Write(qFactor, r);
    15281570    return theGcd;
    15291571  }
     
    15401582poly p_ExtGcd(poly p, poly &pFactor, poly q, poly &qFactor, ring r)
    15411583{
    1542 //printf("p_ExtGcd:\n");
     1584//printf("p_ExtGcd1:\n");
    15431585//p_Write(p, r); p_Write(q, r);
    15441586  assume((p != NULL) || (q != NULL)); 
    1545   poly a = p; poly b = q;
    1546   poly aFactor = pFactor; poly bFactor = qFactor;
     1587  poly a = p; poly b = q; BOOLEAN aCorrespondsToP = TRUE;
    15471588  if (p_Deg(a, r) < p_Deg(b, r))
    1548   { a = q; b = p; aFactor = qFactor, bFactor = pFactor; }
     1589  { a = q; b = p; aCorrespondsToP = FALSE; }
    15491590  a = p_Copy(a, r); b = p_Copy(b, r);
    1550   return p_ExtGcdHelper(a, aFactor, b, bFactor, r);
     1591  poly aFactor = NULL; poly bFactor = NULL;
     1592  poly theGcd = p_ExtGcdHelper(a, aFactor, b, bFactor, r);
     1593  if (aCorrespondsToP) { pFactor = aFactor; qFactor = bFactor; }
     1594  else                 { pFactor = bFactor; qFactor = aFactor; }
     1595  return theGcd;
    15511596}
    15521597
  • libpolys/polys/monomials/p_polys.h

    rf0b01f rc28ecf  
    18391839poly      p_PolyDiv(poly &p, poly divisor, BOOLEAN needResult, ring r);
    18401840
     1841/* returns NULL if p == NULL, otherwise makes p monic by dividing
     1842   by its leading coefficient (only done if this is not already 1);
     1843   this assumes that we are over a ground field so that division
     1844   is well-defined;
     1845   modifies p */
     1846void      p_Monic(poly &p, ring r);
     1847
    18411848/* assumes that p and q are univariate polynomials in r,
    18421849   mentioning the same variable;
Note: See TracChangeset for help on using the changeset viewer.