Changeset 11d9d6a in git
- Timestamp:
- Feb 27, 2008, 4:15:35 PM (16 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- c1d486a67f7df0247b99fe2775e41c40a20af224
- Parents:
- a92dff3697f0a605f93ad3003fd0d033b72d64b1
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/ipshell.cc
ra92dff3 r11d9d6a 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: ipshell.cc,v 1.17 8 2008-02-22 11:14:16Singular Exp $ */4 /* $Id: ipshell.cc,v 1.179 2008-02-27 15:15:35 Singular Exp $ */ 5 5 /* 6 6 * ABSTRACT: … … 4700 4700 } 4701 4701 4702 ring 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 4702 4859 void rKill(ring r) 4703 4860 {
Note: See TracChangeset
for help on using the changeset viewer.