Changeset 057578 in git


Ignore:
Timestamp:
May 25, 1999, 6:49:39 PM (25 years ago)
Author:
Olaf Bachmann <obachman@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
9fd5f8a67b2159d3a039d7b0b34e704f6a617dfb
Parents:
1fff4b3fea4648d7e6b6639ecde260fdd4148b06
Message:
* better implementation of pSubst


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

Legend:

Unmodified
Added
Removed
  • Singular/polys.cc

    r1fff4b r057578  
    22*  Computer Algebra System SINGULAR     *
    33****************************************/
    4 /* $Id: polys.cc,v 1.37 1999-04-30 10:39:54 obachman Exp $ */
     4/* $Id: polys.cc,v 1.38 1999-05-25 16:49:39 obachman Exp $ */
    55
    66/*
     
    21102110static poly pSubst1 (poly p,int n)
    21112111{
    2112   poly qq,result = NULL;
    2113 
    2114   while (p != NULL)
    2115   {
    2116     qq = p;
     2112  if (p == NULL) return NULL;
     2113  if (pNext(p) == NULL)
     2114  {
     2115    if (pGetExp(p, n) != 0)
     2116    {
     2117      pSetExp(p, n, 0);
     2118      pSetm(p);
     2119    }
     2120    return p;
     2121  }
     2122
     2123  int l = pLength(p) - 1;
     2124  poly* monoms = (poly*) Alloc(l*sizeof(poly));
     2125  int i;
     2126 
     2127  for (i=0; i<l; i++)
     2128  {
     2129    if (pGetExp(p, n) != 0)
     2130    {
     2131      pSetExp(p, n, 0);
     2132      pSetm(p);
     2133    }
     2134    monoms[i] = p;
    21172135    pIter(p);
    2118     qq->next = NULL;
    2119     pSetExp(qq,n,0);
    2120     pSetm(qq);
    2121     result = pAdd(result,qq);
    2122   }
    2123   return result;
     2136  }
     2137  if (pGetExp(p, n) != 0)
     2138  {
     2139    pSetExp(p, n, 0);
     2140    pSetm(p);
     2141  }
     2142  for (i = l-1; i >= 0; i--)
     2143  {
     2144    pNext(monoms[i]) = NULL;
     2145    p = pAdd(p, monoms[i]);
     2146  }
     2147  pTest(p);
     2148  Free(monoms, l*sizeof(poly));
     2149  return p;
     2150}
     2151
     2152/*3
     2153* substitute the n-th variable by number e in p
     2154* destroy p
     2155*/
     2156static poly pSubst2 (poly p,int n, number e)
     2157{
     2158  number nn, nm;
     2159  int exp;
     2160  assume( ! nIsZero(e) );
     2161 
     2162  if (p == NULL) return NULL;
     2163  if (pNext(p) == NULL)
     2164  {
     2165    exp = pGetExp(p, n);
     2166    if (exp != 0)
     2167    {
     2168      nPower(e, exp, &nn);
     2169      nm = nMult(nn, pGetCoeff(p));
     2170      pSetCoeff(p, nm);
     2171      nDelete(&nn);
     2172      pSetExp(p, n, 0);
     2173      pSetm(p);
     2174    }
     2175    return p;
     2176  }
     2177
     2178  int l = pLength(p) - 1;
     2179  poly* monoms = (poly*) Alloc(l*sizeof(poly));
     2180  int i;
     2181 
     2182  for (i=0; i<l; i++)
     2183  {
     2184    exp = pGetExp(p, n);
     2185    if (exp != 0)
     2186    {
     2187      nPower(e, exp, &nn);
     2188      nm = nMult(nn, pGetCoeff(p));
     2189      pSetCoeff(p, nm);
     2190      nDelete(&nn);
     2191      pSetExp(p, n, 0);
     2192      pSetm(p);
     2193    }
     2194    monoms[i] = p;
     2195    pIter(p);
     2196  }
     2197  exp = pGetExp(p, n);
     2198  if (exp != 0)
     2199  {
     2200    nPower(e, exp, &nn);
     2201    nm = nMult(nn, pGetCoeff(p));
     2202    pSetCoeff(p, nm);
     2203    nDelete(&nn);
     2204    pSetExp(p, n, 0);
     2205    pSetm(p);
     2206  }
     2207  for (i = l-1; i >= 0; i--)
     2208  {
     2209    pNext(monoms[i]) = NULL;
     2210    p = pAdd(p, monoms[i]);
     2211  }
     2212  Free(monoms, l*sizeof(poly));
     2213  pTest(p);
     2214  return p;
     2215}
     2216
     2217poly pSubst0(poly p, int n)
     2218{
     2219  spolyrec res;
     2220  poly h = &res;
     2221  pNext(h) = p;
     2222 
     2223  while (pNext(h)!=NULL)
     2224  {
     2225    if (pGetExp(pNext(h),n)!=0)
     2226    {
     2227      pDelete1(&pNext(h));
     2228    }
     2229    else
     2230    {
     2231      pIter(h);
     2232    }
     2233  }
     2234  pTest(pNext(&res));
     2235  return pNext(&res);
    21242236}
    21252237
     
    21302242poly pSubst(poly p, int n, poly e)
    21312243{
    2132   if ((e!=NULL)&&(pIsConstant(e))&&(nIsOne(pGetCoeff(e))))
    2133     return pSubst1(p,n);
     2244  if (e == NULL) return pSubst0(p, n);
     2245
     2246  if (pIsConstant(e))
     2247  {
     2248    if (nIsOne(pGetCoeff(e))) return pSubst1(p,n);
     2249    else return pSubst2(p, n, pGetCoeff(e));
     2250  }
    21342251
    21352252  int exponent,i;
Note: See TracChangeset for help on using the changeset viewer.