Changeset 11d9d6a in git


Ignore:
Timestamp:
Feb 27, 2008, 4:15:35 PM (16 years ago)
Author:
Hans Schönemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
c1d486a67f7df0247b99fe2775e41c40a20af224
Parents:
a92dff3697f0a605f93ad3003fd0d033b72d64b1
Message:
*hannes: rSubring


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

Legend:

Unmodified
Added
Removed
  • Singular/ipshell.cc

    ra92dff3 r11d9d6a  
    22*  Computer Algebra System SINGULAR     *
    33****************************************/
    4 /* $Id: ipshell.cc,v 1.178 2008-02-22 11:14:16 Singular Exp $ */
     4/* $Id: ipshell.cc,v 1.179 2008-02-27 15:15:35 Singular Exp $ */
    55/*
    66* ABSTRACT:
     
    47004700}
    47014701
     4702ring rSubring(ring org_ring, sleftv* rv)
     4703{
     4704  ring R = rCopy0(org_ring);
     4705  int *perm=(int *)omAlloc0((org_ring->N+1)*sizeof(int));
     4706  int last = 0, o=0, n = rBlocks(org_ring), i=0, typ = 1, j;
     4707
     4708  /* names and number of variables-------------------------------------*/
     4709  {
     4710    int l=rv->listLength();
     4711    if (l>MAX_SHORT)
     4712    {
     4713      Werror("too many ring variables(%d), max is %d",l,MAX_SHORT);
     4714       goto rInitError;
     4715    }
     4716    R->N = l; /*rv->listLength();*/
     4717  }
     4718  omFree(R->names);
     4719  R->names   = (char **)omAlloc0(R->N * sizeof(char_ptr));
     4720  if (rSleftvList2StringArray(rv, R->names))
     4721  {
     4722    WerrorS("name of ring variable expected");
     4723    goto rInitError;
     4724  }
     4725
     4726  /* check names for subring in org_ring ------------------------- */
     4727  {
     4728    i=0;
     4729   
     4730    for(j=0;j<R->N;j++)
     4731    {
     4732      for(;i<org_ring->N;i++)
     4733      {
     4734        if (strcmp(org_ring->names[i],R->names[j])==0)
     4735        {
     4736          perm[i+1]=j+1;
     4737          break;
     4738        }
     4739      }
     4740      if (i>org_ring->N)
     4741      {
     4742        Werror("variable %d (%s) not in basering",j+1,R->names[j]);
     4743        break;
     4744      }
     4745    }
     4746  }
     4747  /* ordering -------------------------------------------------------------*/
     4748
     4749  for(i=0;i<n;i++)
     4750  {
     4751    int min_var=-1;
     4752    int max_var=-1;
     4753    for(j=R->block0[i];j<=R->block1[i];j++)
     4754    {
     4755      if (perm[j]>0)
     4756      {
     4757        if (min_var==-1) min_var=perm[j];
     4758        max_var=perm[j];
     4759      }
     4760    }
     4761    if (min_var!=-1)
     4762    {
     4763      //Print("block %d: old %d..%d, now:%d..%d\n",
     4764      //      i,R->block0[i],R->block1[i],min_var,max_var);
     4765      R->block0[i]=min_var;
     4766      R->block1[i]=max_var;
     4767      if (R->wvhdl[i]!=NULL)
     4768      {
     4769        omFree(R->wvhdl[i]);
     4770        R->wvhdl[i]=(int*)omAlloc0((max_var-min_var+1)*sizeof(int));
     4771        for(j=R->block0[i];j<=R->block1[i];j++)
     4772        {
     4773          if (perm[j]>0)
     4774            R->wvhdl[i][j-R->block0[i]]=
     4775                org_ring->wvhdl[i][perm[j]-org_ring->block0[i]];
     4776        }
     4777      }
     4778    }
     4779    else
     4780    {
     4781      if(R->block0[i]>0)
     4782      {
     4783        //Print("skip block %d\n",i);
     4784        R->order[i]=ringorder_unspec;
     4785        if (R->wvhdl[i] !=NULL) omFree(R->wvhdl[i]);
     4786        R->wvhdl[i]=NULL;
     4787      }
     4788      //else Print("keep block %d\n",i);
     4789    }
     4790  }   
     4791  i=n-1;
     4792  while(i>0)
     4793  {
     4794    // removed unneded blocks
     4795    if(R->order[i-1]==ringorder_unspec)
     4796    {
     4797      for(j=i;j<=n;j++)
     4798      {
     4799        R->order[j-1]=R->order[j];
     4800        R->block0[j-1]=R->block0[j];
     4801        R->block1[j-1]=R->block1[j];
     4802        if (R->wvhdl[j-1] !=NULL) omFree(R->wvhdl[j-1]);
     4803        R->wvhdl[j-1]=R->wvhdl[j];
     4804      }
     4805      R->order[n]=ringorder_unspec;
     4806      n--;
     4807    }
     4808    i--;
     4809  }
     4810  n=rBlocks(org_ring)-1;
     4811  while (R->order[n]==0)  n--;
     4812  while (R->order[n]==ringorder_unspec)  n--;
     4813  if ((R->order[n]==ringorder_c) ||  (R->order[n]==ringorder_C)) n--;
     4814  if (R->block1[n] != R->N)
     4815  {
     4816    if (((R->order[n]==ringorder_dp) ||
     4817         (R->order[n]==ringorder_ds) ||
     4818         (R->order[n]==ringorder_Dp) ||
     4819         (R->order[n]==ringorder_Ds) ||
     4820         (R->order[n]==ringorder_rp) ||
     4821         (R->order[n]==ringorder_rs) ||
     4822         (R->order[n]==ringorder_lp) ||
     4823         (R->order[n]==ringorder_ls))
     4824        &&
     4825        R->block0[n] <= R->N)
     4826    {
     4827      R->block1[n] = R->N;
     4828    }
     4829    else
     4830    {
     4831      Werror("mismatch of number of vars (%d) and ordering (%d vars) in block %d",
     4832             R->N,R->block1[n],n);
     4833      return NULL;
     4834    }
     4835  }
     4836  omFree(perm);
     4837  // find OrdSgn:
     4838  R->OrdSgn = org_ring->OrdSgn; // IMPROVE!
     4839  //for(i=1;i<=R->N;i++)
     4840  //{ if (weights[i]<0) { R->OrdSgn=-1;break; }}
     4841  //omFree(weights);
     4842  // Complete the initialization
     4843  if (rComplete(R,1))
     4844    goto rInitError;
     4845
     4846  rTest(R);
     4847
     4848  if (rv != NULL) rv->CleanUp();
     4849
     4850  return R;
     4851
     4852  // error case:
     4853  rInitError:
     4854  if  (R != NULL) rDelete(R);
     4855  if (rv != NULL) rv->CleanUp();
     4856  return NULL;
     4857}
     4858
    47024859void rKill(ring r)
    47034860{
Note: See TracChangeset for help on using the changeset viewer.