Changeset 1e745b in git for Singular/LIB/sing.lib


Ignore:
Timestamp:
May 1, 1997, 7:49:56 PM (27 years ago)
Author:
Hans Schönemann <hannes@…>
Branches:
(u'spielwiese', 'ec94ef7a30b928574c0c3daf41f6804dff5f6b69')
Children:
4b35a9008ee2cec61ef2193763b534f1c072bf19
Parents:
22d79069af63dd10b93e136d82bb339faa6c28d9
Message:
* hannes: added codim


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

Legend:

Unmodified
Added
Removed
  • Singular/LIB/sing.lib

    r22d790 r1e745b  
    1 // $Id: sing.lib,v 1.2 1997-04-28 19:27:25 obachman Exp $
     1// $Id: sing.lib,v 1.3 1997-05-01 17:49:56 Singular Exp $
    22//system("random",787422842);
    33//(GMG/BM, last modified 26.06.96)
     
    2121 T2((i);                T2-module of ideal i
    2222 T12(i);                T1- and T2-module of ideal i
     23 codim (id1, id2);      codimension of of id2 in id1
    2324
    2425LIB "inout.lib";
     
    654655}
    655656///////////////////////////////////////////////////////////////////////////////
     657proc codim (id1, id2)
     658USAGE:  codim(id1,id2); id1,id2 ideal or module, both result of std
     659RETURN:  result is the number of elements in id1 but not in id2 if finite,
     660         conditions:
     661         1.  id2 is contained in id1, if not return -2
     662         2.  finiteness
     663             consider the two hilberseries iv1(t) and iv2(t)
     664             q(t)=(iv2(t)-iv1(t))/(1-t)^n must be rational, if not return -1
     665             (n dimension of basering)
     666         then the result is the sum of the coeff. of q(t)
     667{
     668   intvec iv1, iv2, iv;
     669   int i, d1, d2, dd, i1, i2, ia, ie;
     670  //--------------------------- check id2 < id1 ------------------------------
     671   i = size(NF(lead(id2),lead(id1)));
     672   if ( i > 0 )
     673   {
     674     return(-2);
     675   }
     676  //--------------------------- 1. check finiteness ---------------------------
     677   i1 = dim(id1);
     678   i2 = dim(id2);
     679   if (i1 < 0)
     680   {
     681     if (i2 == 0)
     682     {
     683       return vdim(id2);
     684     }
     685     else
     686     {
     687       return(-1);
     688     }
     689   }
     690   if (i2 != i1)
     691   {
     692     return(-1);
     693   }
     694   if (i2 <= 0)
     695   {
     696     return(vdim(id2)-vdim(id1));
     697   }
     698   if (mult(id2) != mult(id1))
     699   {
     700     return(-1);
     701   }
     702  //--------------------------- module ---------------------------------------
     703   d1 = nrows(id1);
     704   d2 = nrows(id2);
     705   dd = 0;
     706   if (d1 > d2)
     707   {
     708     id2=id2,maxideal(1)*gen(d1);
     709     dd = -1;
     710   }
     711   if (d2 > d1)
     712   {
     713     id1=id1,maxideal(1)*gen(d2);
     714     dd = 1;
     715   }
     716  //--------------------------- compute first hilbertseries ------------------
     717   iv1 = hilb(id1,1);
     718   i1 = size(iv1);
     719   iv2 = hilb(id2,1);
     720   i2 = size(iv2);
     721  //--------------------------- difference of hilbertseries ------------------
     722   if (i2 > i1)
     723   {
     724     for ( i=1; i<=i1; i=i+1)
     725     {
     726       iv2[i] = iv2[i]-iv1[i];
     727     }
     728     ie = i2;
     729     iv = iv2;
     730   }
     731   else
     732   {
     733     for ( i=1; i<=i2; i=i+1)
     734     {
     735       iv1[i] = iv2[i]-iv1[i];
     736     }
     737     iv = iv1;
     738     for (ie=i1;ie>=0;ie=ie-1)
     739     {
     740       if (ie == 0)
     741       {
     742         return(0);
     743       }
     744       if (iv[ie] != 0)
     745       {
     746         break;
     747       }
     748     }
     749   }
     750   ia = 1;
     751   while (iv[ia] == 0) { ia=ia+1; }
     752  //--------------------------- ia <= nonzeros <= ie -------------------------
     753   iv1 = iv[ia];
     754   for(i=ia+1;i<=ie;i=i+1)
     755   {
     756     iv1=iv1,iv[i];
     757   }
     758  //--------------------------- compute second hilbertseries -----------------
     759   iv2 = hilb(iv1);
     760  //--------------------------- check finitenes ------------------------------
     761   i2 = size(iv2);
     762   i1 = ie - ia + 1 - i2;
     763   if (i1 != nvars(basering))
     764   {
     765     return(-1);
     766   }
     767  //--------------------------- compute result -------------------------------
     768   i1 = 0;
     769   for ( i=1; i<=i2; i=i+1)
     770   {
     771     i1 = i1 + iv2[i];
     772   }
     773   return(i1+dd);
     774}
     775
Note: See TracChangeset for help on using the changeset viewer.