Changeset fbd9e6f in git
- Timestamp:
- Jan 8, 2018, 2:31:08 PM (5 years ago)
- Branches:
- (u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a657104b677b4c461d018cbf3204d72d34ad66a9')
- Children:
- 88dc1d4c1c83ba8ca3e1cbb7e574d2427539b133
- Parents:
- 6b02216593677b82e2b32595292b3622d7c6816ea135fdaed631e5e179009a4772aa1ab7f20f7dc2
- Files:
-
- 1 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/dmodloc.lib
ra135fd rfbd9e6f 312 312 int i; 313 313 int n = nvars(basering); 314 for (i=1; i<= nrows(v); i++)314 for (i=1; i<=size(v); i++) 315 315 { 316 316 if ( (v[i]<0) || (v[i]>n) ) -
Singular/LIB/fpadim.lib
r6b02216 rfbd9e6f 4 4 info=" 5 5 LIBRARY: fpadim.lib Algorithms for quotient algebras in the letterplace case 6 AUTHORS: Grischa Studzinski, grischa.studzinski@rwth-aachen.de 6 AUTHORS: Grischa Studzinski, grischa.studzinski at rwth-aachen.de 7 @* Viktor Levandovskyy, viktor.levandovskyy at math.rwth-aachen.de 8 @* Karim Abou Zeid, karim.abou.zeid at rwth-aachen.de 7 9 8 10 Support: Joint projects LE 2697/2-1 and KR 1907/3-1 of the Priority Programme SPP 1489: 9 @* 'Algorithmische und Experimentelle Methoden in Algebra, Geometrie und Zahlentheorie' 10 @* of the German DFG 11 12 OVERVIEW: Given the free algebra A = K<x_1,...,x_n> and a (finite) Groebner basis 11 'Algorithmische und Experimentelle Methoden in Algebra, Geometrie und Zahlentheorie' 12 of the German DFG 13 and Project II.6 of the transregional collaborative research centre 14 SFB-TRR 195 'Symbolic Tools in Mathematics and their Application' of the German DFG 15 16 OVERVIEW: Given the free associative algebra A = K<x_1,...,x_n> and a (finite) Groebner basis 13 17 GB = {g_1,..,g_w}, one is interested in the K-dimension and in the 14 18 explicit K-basis of A/<GB>. 15 19 Therefore one is interested in the following data: 16 @* - the Ufnarovskij graph induced by GB 17 @* - the mistletoes of A/<GB> 18 @* - the K-dimension of A/<GB> 19 @* - the Hilbert series of A/<GB> 20 21 The Ufnarovskij graph is used to determine whether A/<GB> has finite 22 K-dimension. One has to check if the graph contains cycles. 23 For the whole theory we refer to [ufna]. Given a 24 reduced set of monomials GB one can define the basis tree, whose vertex 25 set V consists of all normal monomials w.r.t. GB. For every two 26 monomials m_1, m_2 in V there is a direct edge from m_1 to m_2, if and 27 only if there exists x_k in {x_1,..,x_n}, such that m_1*x_k = m_2. The 28 set M = {m in V | there is no edge from m to another monomial in V} is 29 called the set of mistletoes. As one can easily see it consists of 30 the endpoints of the graph. Since there is a unique path to every 31 monomial in V the whole graph can be described only from the knowledge 32 of the mistletoes. Note that V corresponds to a basis of A/<GB>, so 33 knowing the mistletoes we know a K-basis. The name mistletoes was given 34 to those points because of these miraculous value and the algorithm is 35 named sickle, because a sickle is the tool to harvest mistletoes. 36 For more details see [studzins]. This package uses the Letterplace 37 format introduced by [lls]. The algebra can either be represented as a 38 Letterplace ring or via integer vectors: Every variable will only be 39 represented by its number, so variable one is represented as 1, 40 variable two as 2 and so on. The monomial x_1*x_3*x_2 for example will 41 be stored as (1,3,2). Multiplication is concatenation. Note that there 42 is no algorithm for computing the normal form needed for our case. 43 Note that the name fpadim.lib is short for dimensions of finite 44 presented algebras. 20 - the Ufnarovskij graph induced by GB 21 - the mistletoes of A/<GB> (special monomials in a basis) 22 - the K-dimension of A/<GB> 23 - the Hilbert series of A/<GB> 24 25 @* The Ufnarovskij graph is used to determine whether A/<GB> has finite 26 @* K-dimension. One has to check if the graph contains cycles. 27 @* For the whole theory we refer to [ufna]. Given a 28 @* reduced set of monomials GB one can define the basis tree, whose vertex 29 @* set V consists of all normal monomials w.r.t. GB. For every two 30 @* monomials m_1, m_2 in V there is a direct edge from m_1 to m_2, if and 31 @* only if there exists x_k in {x_1,..,x_n}, such that m_1*x_k = m_2. The 32 @* set M = {m in V | there is no edge from m to another monomial in V} is 33 @* called the set of mistletoes. As one can easily see it consists of 34 @* the endpoints of the graph. Since there is a unique path to every 35 @* monomial in V the whole graph can be described only from the knowledge 36 @* of the mistletoes. Note that V corresponds to a basis of A/<GB>, so 37 @* knowing the mistletoes we know a K-basis. The name mistletoes was given 38 @* to those points because of these miraculous value and the algorithm is 39 @* named sickle, because a sickle is the tool to harvest mistletoes. 40 @* For more details see [studzins]. This package uses the Letterplace 41 @* format introduced by [lls]. The algebra can either be represented as a 42 @* Letterplace ring or via integer vectors: Every variable will only be 43 @* represented by its number, so variable one is represented as 1, 44 @* variable two as 2 and so on. The monomial x_1*x_3*x_2 for example will 45 @* be stored as (1,3,2). Multiplication is concatenation. Note that the 46 @* approach in this library does not need an algorithm for computing the normal 47 @* form yet. Note that the name fpadim.lib is short for dimensions of 48 @* finite presented algebras. 49 @* 45 50 46 51 REFERENCES: … … 48 53 @* [ufna] Ufnarovskij: Combinatorical and asymptotic methods in algebra, 1990 49 54 @* [lls] Levandovskyy, La Scala: Letterplace ideals and non-commutative 50 55 Groebner bases, 2009 51 56 @* [studzins] Studzinski: Dimension computations in non-commutative, 52 53 54 Assumptions:55 @*- basering is always a Letterplace ring56 @*- all intvecs correspond to Letterplace monomials57 @* - if you specify a different degree bound d, 58 d <= attrib(basering,uptodeg) should hold. 59 @*In the procedures below, 'iv' stands for intvec representation60 57 associative algebras, Diploma thesis, RWTH Aachen, 2010 58 59 NOTE: 60 - basering is always a Letterplace ring 61 - all intvecs correspond to Letterplace monomials 62 - if you specify a different degree bound d, d <= attrib(basering,uptodeg) holds 63 64 In the procedures below, 'iv' stands for intvec representation 65 and 'lp' for the letterplace representation of monomials 61 66 62 67 PROCEDURES: 68 69 lpMis2Dim(M); computes the K-dimension of the monomial factor algebra 70 lpKDim(G[,d,n]); computes the K-dimension of A/<G> 71 lpDimCheck(G); checks if the K-dimension of A/<G> is infinite 72 lpMis2Base(M); computes a K-basis of the factor algebra 73 lpHilbert(G[,d,n]); computes the Hilbert series of A/<G> in lp format 74 lpDHilbert(G[,d,n]); computes the K-dimension and Hilbert series of A/<G> 75 lpDHilbertSickle(G[,d,n]); computes mistletoes, K-dimension and Hilbert series 63 76 64 77 ivDHilbert(L,n[,d]); computes the K-dimension and the Hilbert series … … 73 86 ivSickleHil(L,n[,d]); computes the mistletoes and Hilbert series of A/<L> 74 87 ivSickleDim(L,n[,d]); computes the mistletoes and the K-dimension of A/<L> 75 lpDHilbert(G[,d,n]); computes the K-dimension and Hilbert series of A/<G>76 lpDHilbertSickle(G[,d,n]); computes mistletoes, K-dimension and Hilbert series77 lpHilbert(G[,d,n]); computes the Hilbert series of A/<G> in lp format78 lpDimCheck(G); checks if the K-dimension of A/<G> is infinite79 lpKDim(G[,d,n]); computes the K-dimension of A/<G> in lp format80 lpMis2Base(M); computes a K-basis of the factor algebra81 lpMis2Dim(M); computes the K-dimension of the factor algebra82 88 lpOrdMisLex(M); orders an ideal of lp-monomials lexicographically 83 89 lpSickle(G[,d,n]); computes the mistletoes of A/<G> in lp format … … 85 91 lpSickleDim(G[,d,n]); computes the mistletoes and the K-dimension of A/<G> 86 92 sickle(G[,m,d,h]); can be used to access all lp main procedures 87 88 93 89 94 ivL2lpI(L); transforms a list of intvecs into an ideal of lp monomials … … 145 150 {for (i3 = 1; i3 <= n; i3++) 146 151 {for (i4 = 1; i4 <= (n^(i1-1)); i4++) 147 { 148 M[i2,i1] = i3; 152 {M[i2,i1] = i3; 149 153 i2 = i2 + 1; 150 }154 } 151 155 } 152 156 } … … 170 174 "PURPOSE:checks, if all entries in M are variable-related 171 175 " 172 {if ((nrows(M) == 1) && (ncols(M) == 1)) {if (M[1,1] == 0){return(0);}} 173 int i,j; 176 {int i,j; 174 177 for (i = 1; i <= nrows(M); i++) 175 178 {for (j = 1; j <= ncols(M); j++) … … 328 331 } 329 332 333 334 static proc findCycleDFS(int i, intmat T, intvec V) 335 " 336 PURPOSE: 337 this is a classical deep-first search for cycles contained in a graph given by an intmat 338 " 339 { 340 intvec rV; 341 int k,k1,t; 342 int j = V[size(V)]; 343 if (T[j,i] > 0) {return(V);} 344 else 345 { 346 for (k = 1; k <= ncols(T); k++) 347 { 348 t = 0; 349 if (T[j,k] > 0) 350 { 351 for (k1 = 1; k1 <= size(V); k1++) {if (V[k1] == k) {t = 1; break;}} 352 if (t == 0) 353 { 354 rV = V; 355 rV[size(rV)+1] = k; 356 rV = findCycleDFS(i,T,rV); 357 if (rV[1] > -1) {return(rV);} 358 } 359 } 360 } 361 } 362 return(intvec(-1)); 363 } 364 365 366 330 367 static proc findHCoeff(intvec V,int n,list L,intvec P,intvec H,list #) 331 368 "USAGE: findHCoeff(V,n,L,P,H,degbound); L a list of intmats, degbound an integer … … 565 602 } 566 603 return(R); 567 568 604 } 569 605 } … … 647 683 } 648 684 685 static proc growthAlg(intmat T, list #) 686 " 687 real algorithm for checking the growth of an algebra 688 " 689 { 690 int s = 1; 691 if (size(#) > 0) { s = #[1];} 692 int j; 693 int n = ncols(T); 694 intvec NV,C; NV[n] = 0; int m,i; 695 intmat T2[n][n] = T[1..n,1..n]; intmat N[n][n]; 696 if (T2 == N) 697 { 698 for (i = 1; i <= n; i++) 699 { 700 if (m < T[n+1,i]) { m = T[n+1,i];} 701 } 702 return(m); 703 } 704 705 //first part: the diagonals 706 for (i = s; i <= n; i++) 707 { 708 if (T[i,i] > 0) 709 { 710 if ((T[i,i] >= 1) && (T[n+1,i] > 0)) {return(-1);} 711 if ((T[i,i] == 1) && (T[n+1,i] == 0)) 712 { 713 T[i,i] = 0; 714 T[n+1,i] = 1; 715 return(growthAlg(T)); 716 } 717 } 718 } 719 720 //second part: searching for the last but one vertices 721 T2 = T2*T2; 722 for (i = s; i <= n; i++) 723 { 724 if ((intvec(T[i,1..n]) <> intvec(0)) && (intvec(T2[i,1..n]) == intvec(0))) 725 { 726 for (j = 1; j <= n; j++) 727 { 728 if ((T[i,j] > 0) && (m < T[n+1,j])) {m = T[n+1,j];} 729 } 730 T[n+1,i] = T[n+1,i] + m; 731 T[i,1..n] = NV; 732 return(growthAlg(T)); 733 } 734 } 735 m = 0; 736 737 //third part: searching for circles 738 for (i = s; i <= n; i++) 739 { 740 T2 = T[1..n,1..n]; 741 C = findCycleDFS(i,T2, intvec(i)); 742 if (C[1] > 0) 743 { 744 for (j = 2; j <= size(C); j++) 745 { 746 T[i,1..n] = T[i,1..n] + T[C[j],1..n]; 747 T[C[j],1..n] = NV; 748 } 749 for (j = 2; j <= size(C); j++) 750 { 751 T[1..n,i] = T[1..n,i] + T[1..n,C[j]]; 752 T[1..n,C[j]] = NV; 753 } 754 T[i,i] = T[i,i] - size(C) + 1; 755 m = 0; 756 for (j = 1; j <= size(C); j++) 757 { 758 m = m + T[n+1,C[j]]; 759 } 760 for (j = 1; j <= size(C); j++) 761 { 762 T[n+1,C[j]] = m; 763 } 764 return(growthAlg(T,i)); 765 } 766 else {ERROR("No Cycle found, something seems wrong! Please contact the authors.");} 767 } 768 769 m = 0; 770 for (i = 1; i <= n; i++) 771 { 772 if (m < T[n+1,i]) 773 { 774 m = T[n+1,i]; 775 } 776 } 777 return(m); 778 } 779 780 static proc GlDimSuffix(intvec v, intvec g) 781 { 782 //Computes the shortest r such that g is a suffix for vr 783 //only valid for lex orderings? 784 intvec r,gt,vt,lt,g2; 785 int lg,lv,l,i,c,f; 786 lg = size(g); lv = size(v); 787 if (lg <= lv) 788 { 789 l = lv-lg; 790 } 791 else 792 { 793 l = 0; g2 = g[(lv+1)..lg]; 794 g = g[1..lv]; lg = size(g); 795 c = 1; 796 } 797 while (l < lv) 798 { 799 vt = v[(l+1)..lv]; 800 gt = g[1..(lv-l)]; 801 lt = size(gt); 802 for (i = 1; i <= lt; i++) 803 { 804 if (vt[i]<>gt[i]) {l++; break;} 805 } 806 if (lt <=i ) { f = 1; break;} 807 } 808 if (f == 0) {return(g);} 809 r = g[(lv-l+1)..lg]; 810 if (c == 1) {r = r,g2;} 811 return(r); 812 } 813 814 static proc isNormal(intvec V, list G) 815 { 816 int i,j,k,l; 817 k = 0; 818 for (i = 1; i <= size(G); i++) 819 { 820 if ( size(G[i]) <= size(V) ) 821 { 822 while ( size(G[i])+k <= size(V) ) 823 { 824 if ( G[i] == V[(1+k)..size(V)] ) {return(1);} 825 } 826 } 827 } 828 return(0); 829 } 830 831 static proc findDChain(list L) 832 { 833 list Li; int i,j; 834 for (i = 1; i <= size(L); i++) {Li[i] = size(L[i]);} 835 Li = sort(Li); Li = Li[1]; 836 return(Li[size(Li)]); 837 } 838 649 839 static proc isInList(intvec V, list L) 650 840 "USAGE: isInList(V,L); V an intvec, L a list of intvecs … … 684 874 } 685 875 876 877 static proc isPF(intvec P, intvec I) 878 " 879 PURPOSE: 880 checks, if a word P is a praefix of another word I 881 " 882 { 883 int n = size(P); 884 if (n <= 0 || P == 0) {return(1);} 885 if (size(I) < n) {return(0);} 886 intvec IP = I[1..n]; 887 if (IP == P) {return(1);} 888 else {return(0);} 889 } 890 686 891 proc ivL2lpI(list L) 687 892 "USAGE: ivL2lpI(L); L a list of intvecs 688 893 RETURN: ideal 689 PURPOSE:Transforming a list of intvecs into an ideal of Letterplace monomials. 690 @* For the encoding of the variables see the overview. 894 PURPOSE:Transforming a list of intvecs into an ideal of Letterplace monomials 691 895 ASSUME: - Intvec corresponds to a Letterplace monomial 692 896 @* - basering has to be a Letterplace ring 897 NOTE: - Assumptions will not be checked! 693 898 EXAMPLE: example ivL2lpI; shows examples 694 899 " 695 { checkAssumptions(0,L);900 { 696 901 int i; ideal G; 697 902 poly p; … … 718 923 RETURN: poly 719 924 PURPOSE:Transforming an intvec into the corresponding Letterplace polynomial 720 @* For the encoding of the variables see the overview.721 925 ASSUME: - Intvec corresponds to a Letterplace monomial 722 926 @* - basering has to be a Letterplace ring … … 748 952 RETURN: ideal 749 953 PURPOSE:Converting a list of intmats into an ideal of corresponding monomials 750 @* The rows of the intmat corresponds to an intvec, which stores the751 @* monomial.752 @* For the encoding of the variables see the overview.753 954 ASSUME: - The rows of each intmat in L must correspond to a Letterplace monomial 754 955 @* - basering has to be a Letterplace ring … … 779 980 "USAGE: iv2lpMat(M); M an intmat 780 981 RETURN: ideal 781 PURPOSE:Converting an intmat into an ideal of the corresponding monomials. 782 @* The rows of the intmat corresponds to an intvec, which stores the 783 @* monomial. 784 @* For the encoding of the variables see the overview. 982 PURPOSE:Converting an intmat into an ideal of the corresponding monomials 785 983 ASSUME: - The rows of M must correspond to Letterplace monomials 786 984 @* - basering has to be a Letterplace ring … … 816 1014 "USAGE: lpId2ivLi(G); G an ideal 817 1015 RETURN: list 818 PURPOSE:Transforming an ideal into the corresponding list of intvecs. 819 @* For the encoding of the variables see the overview. 1016 PURPOSE:Transforming an ideal into the corresponding list of intvecs 820 1017 ASSUME: - basering has to be a Letterplace ring 821 1018 EXAMPLE: example lpId2ivLi; shows examples 822 1019 " 823 {int i,j,k; 1020 { 1021 int i,j,k; 824 1022 list M; 825 1023 checkAssumptions(0,M); … … 840 1038 "USAGE: lp2iv(p); p a poly 841 1039 RETURN: intvec 842 PURPOSE:Transforming a monomial into the corresponding intvec. 843 @* For the encoding of the variables see the overview. 1040 PURPOSE:Transforming a monomial into the corresponding intvec 844 1041 ASSUME: - basering has to be a Letterplace ring 845 1042 NOTE: - Assumptions will not be checked! … … 883 1080 RETURN: list 884 1081 PURPOSE:Converting an ideal into an list of intmats, 885 @* the corresponding intvecs forming the rows. 886 @* For the encoding of the variables see the overview. 1082 @* the corresponding intvecs forming the rows 887 1083 ASSUME: - basering has to be a Letterplace ring 888 1084 EXAMPLE: example lp2ivId; shows examples … … 925 1121 // -----------------main procedures---------------------- 926 1122 1123 static proc lpGraphOfNormalWords(ideal G) 1124 "USAGE: lpGraphOfNormalWords(G); G a set of monomials in a letterplace ring 1125 RETURN: intmat 1126 PURPOSE: Constructs the graph of normal words induced by G 1127 @*: the adjacency matrix of the graph of normal words induced by G 1128 ASSUME: - basering is a Letterplace ring 1129 - G are the leading monomials of a Groebner basis 1130 " 1131 { 1132 // construct the Graph of normal words [Studzinski page 78] 1133 // construct set of vertices 1134 int v = attrib(basering,"lV"); int d = attrib(basering,"uptodeg"); 1135 ideal V; poly p,q,w; 1136 ideal LG = lead(G); 1137 int i,j,k,b; intvec E,Et; 1138 for (i = 1; i <= v; i++){V = V, var(i);} 1139 for (i = 1; i <= size(LG); i++) 1140 { 1141 E = leadexp(LG[i]); 1142 if (E == intvec(0)) {V = V,monomial(intvec(0));} 1143 else 1144 { 1145 for (j = 1; j < d; j++) 1146 { 1147 Et = E[(j*v+1)..(d*v)]; 1148 if (Et == intvec(0)) {break;} 1149 else {V = V, monomial(Et);} 1150 } 1151 } 1152 } 1153 V = simplify(V,2+4); 1154 printf("V = %p", V); 1155 1156 1157 // construct incidence matrix 1158 1159 list LV = lpId2ivLi(V); 1160 intvec Ip,Iw; 1161 int n = size(V); 1162 intmat T[n+1][n]; 1163 for (i = 1; i <= n; i++) 1164 { 1165 // printf("for1 (i=%p, n=%p)", i, n); 1166 p = V[i]; Ip = lp2iv(p); 1167 for (j = 1; j <= n; j++) 1168 { 1169 // printf("for2 (j=%p, n=%p)", j, n); 1170 k = 1; b = 1; 1171 q = V[j]; 1172 w = lpNF(lpMult(p,q),LG); 1173 if (w <> 0) 1174 { 1175 Iw = lp2iv(w); 1176 while (k <= n) 1177 { 1178 // printf("while (k=%p, n=%p)", k, n); 1179 if (isPF(LV[k],Iw) > 0) 1180 {if (isPF(LV[k],Ip) == 0) {b = 0; k = n+1;} else {k++;} 1181 } 1182 else {k++;} 1183 } 1184 T[i,j] = b; 1185 // print("Incidence Matrix:"); 1186 // print(T); 1187 } 1188 } 1189 } 1190 return(T); 1191 } 1192 1193 // This proc is deprecated, see lpGkDim() in fpaprops.lib 1194 /* proc lpGkDim(ideal G) */ 1195 /* "USAGE: lpGkDim(G); G an ideal in a letterplace ring */ 1196 /* RETURN: int */ 1197 /* PURPOSE: Determines the Gelfand Kirillov dimension of A/<G> */ 1198 /* @*: -1 means it is infinite */ 1199 /* ASSUME: - basering is a Letterplace ring */ 1200 /* - G is a Groebner basis */ 1201 /* NOTE: see fpaprops.lib for a faster and more up to date version of this method */ 1202 /* " */ 1203 /* { */ 1204 /* return(growthAlg(lpGraphOfNormalWords(G))); */ 1205 /* } */ 1206 927 1207 proc ivDHilbert(list L, int n, list #) 928 1208 "USAGE: ivDHilbert(L,n[,degbound]); L a list of intmats, n an integer, … … 932 1212 ASSUME: - basering is a Letterplace ring 933 1213 @* - all rows of each intmat correspond to a Letterplace monomial 934 @* for the encoding of the variables see the overview935 1214 @* - if you specify a different degree bound degbound, 936 @* degbound <= attrib(basering,uptodeg) should hold.1215 @* degbound <= attrib(basering,uptodeg) holds 937 1216 NOTE: - If L is the list returned, then L[1] is an integer corresponding to the 938 1217 @* dimension, L[2] is an intvec which contains the coefficients of the … … 984 1263 ASSUME: - basering is a Letterplace ring. 985 1264 @* - All rows of each intmat correspond to a Letterplace monomial. 986 @* for the encoding of the variables see the overview987 1265 @* - If you specify a different degree bound degbound, 988 @* degbound <= attrib(basering,uptodeg) should hold.1266 @* degbound <= attrib(basering,uptodeg) holds. 989 1267 NOTE: - If L is the list returned, then L[1] is an integer, L[2] is an intvec 990 1268 @* which contains the coefficients of the Hilbert series and L[3] … … 1031 1309 RETURN: int, 0 if the dimension is finite, or 1 otherwise 1032 1310 PURPOSE:Decides, whether the K-dimension is finite or not 1033 ASSUME: - basering is a Letterplace ring 1034 @* - All rows of each intmat correspond to a Letterplace monomial 1035 @* For the encoding of the variables see the overview. 1036 NOTE: - n is the number of variables 1311 ASSUME: - basering is a Letterplace ring. 1312 @* - All rows of each intmat correspond to a Letterplace monomial. 1313 NOTE: - n is the number of variables. 1037 1314 EXAMPLE: example ivDimCheck; shows examples 1038 1315 " … … 1090 1367 ASSUME: - basering is a Letterplace ring. 1091 1368 @* - all rows of each intmat correspond to a Letterplace monomial 1092 @* for the encoding of the variables see the overview1093 1369 @* - if you specify a different degree bound degbound, 1094 @* degbound <= attrib(basering,uptodeg) should hold.1370 @* degbound <= attrib(basering,uptodeg) holds. 1095 1371 NOTE: - If degbound is set, a degree bound will be added. By default there 1096 1372 @* is no degree bound. … … 1176 1452 ASSUME: - basering is a Letterplace ring. 1177 1453 @* - all rows of each intmat correspond to a Letterplace monomial 1178 @* for the encoding of the variables see the overview1179 1454 @* - if you specify a different degree bound degbound, 1180 @* degbound <= attrib(basering,uptodeg) should hold.1455 @* degbound <= attrib(basering,uptodeg) holds. 1181 1456 NOTE: - If degbound is set, a degree bound will be added. By default there 1182 1457 @* is no degree bound. … … 1263 1538 " 1264 1539 { 1265 //checkAssumptions(0,M);1540 //checkAssumptions(0,M); 1266 1541 intvec L,A; 1267 1542 if (size(M) == 0){ERROR("There are no mistletoes, so it appears your dimension is infinite!");} … … 1274 1549 for (i = 2; i <= size(M); i++) 1275 1550 {A = M[i]; L = M[i-1]; 1276 s = size(A);1277 if (s > size(L))1278 {d = size(L);1279 for (j = s; j > d; j--) {Rt = insert(Rt,intvec(A[1..j]));}1280 A = A[1..d];1281 }1282 if (size(L) > s){L = L[1..s];}1283 while (A <> L)1284 {Rt = insert(Rt, intvec(A));1285 if (size(A) > 1)1286 {A = A[1..(size(A)-1)];1287 L = L[1..(size(L)-1)];1288 }1289 else {break;}1290 }1551 s = size(A); 1552 if (s > size(L)) 1553 {d = size(L); 1554 for (j = s; j > d; j--) {Rt = insert(Rt,intvec(A[1..j]));} 1555 A = A[1..d]; 1556 } 1557 if (size(L) > s){L = L[1..s];} 1558 while (A <> L) 1559 {Rt = insert(Rt, intvec(A)); 1560 if (size(A) > 1) 1561 {A = A[1..(size(A)-1)]; 1562 L = L[1..(size(L)-1)]; 1563 } 1564 else {break;} 1565 } 1291 1566 } 1292 1567 return(Rt); … … 1313 1588 @* Otherwise the returned value may differ from the K-dimension. 1314 1589 @* - basering is a Letterplace ring. 1315 @* - mistletoes are stored as intvecs, as described in the overview1316 1590 EXAMPLE: example ivMis2Dim; shows examples 1317 1591 " … … 1321 1595 if (isInList(L,M) > 0) {print("1 is a mistletoe, therefore dim = 1"); return(1);} 1322 1596 int i,j,d,s; 1597 j = 1; 1323 1598 d = 1 + size(M[1]); 1324 1599 for (i = 1; i < size(M); i++) 1325 {j = 1; 1326 s = size(M[i]); if (s > size(M[i+1])){s = size(M[i+1]);} 1327 while ((M[i][j] == M[i+1][j]) && (j <= s)){j = j + 1;} 1328 d = d + size(M[i+1])- j + 1; 1600 {s = size(M[i]); if (s > size(M[i+1])){s = size(M[i+1]);} 1601 while ((M[i][j] == M[i+1][j]) && (j <= s)){j = j + 1;} 1602 d = d + size(M[i+1])- j + 1; 1329 1603 } 1330 1604 return(d); … … 1348 1622 PURPOSE:Orders a given set of mistletoes lexicographically 1349 1623 ASSUME: - basering is a Letterplace ring. 1350 @* - intvecs correspond to monomials, as explained in the overview 1624 - intvecs correspond to monomials 1351 1625 NOTE: - This is preprocessing, it's not needed if the mistletoes are returned 1352 1626 @* from the sickle algorithm. … … 1374 1648 @* optional integer 1375 1649 RETURN: list, containing intvecs, the mistletoes of A/<L> 1376 PURPOSE:Computing the mistletoes for a given Groebner basis L , given by intmats1650 PURPOSE:Computing the mistletoes for a given Groebner basis L 1377 1651 ASSUME: - basering is a Letterplace ring. 1378 1652 @* - all rows of each intmat correspond to a Letterplace monomial 1379 @* as explained in the overview1380 1653 @* - if you specify a different degree bound degbound, 1381 @* degbound <= attrib(basering,uptodeg) should hold.1654 @* degbound <= attrib(basering,uptodeg) holds. 1382 1655 NOTE: - If degbound is set, a degree bound will be added. By default there 1383 1656 @* is no degree bound. … … 1457 1730 ASSUME: - basering is a Letterplace ring. 1458 1731 @* - all rows of each intmat correspond to a Letterplace monomial 1459 @* as explained in the overview1460 1732 @* - if you specify a different degree bound degbound, 1461 @* degbound <= attrib(basering,uptodeg) should hold.1733 @* degbound <= attrib(basering,uptodeg) holds. 1462 1734 NOTE: - If L is the list returned, then L[1] is an integer, L[2] is a list, 1463 1735 @* containing the mistletoes as intvecs. … … 1545 1817 ASSUME: - basering is a Letterplace ring. 1546 1818 @* - all rows of each intmat correspond to a Letterplace monomial 1547 @* as explained in the overview1548 1819 @* - if you specify a different degree bound degbound, 1549 @* degbound <= attrib(basering,uptodeg) should hold.1820 @* degbound <= attrib(basering,uptodeg) holds. 1550 1821 NOTE: - If L is the list returned, then L[1] is an intvec, L[2] is a list, 1551 1822 @* containing the mistletoes as intvecs. … … 1630 1901 RETURN: list 1631 1902 PURPOSE:Computing K-dimension and Hilbert series, starting with a lp-ideal 1632 ASSUME: - basering is a Letterplace ring. G is a Letterplace ideal.1903 ASSUME: - basering is a Letterplace ring. 1633 1904 @* - if you specify a different degree bound degbound, 1634 @* degbound <= attrib(basering,uptodeg) should hold.1905 @* degbound <= attrib(basering,uptodeg) holds. 1635 1906 NOTE: - If L is the list returned, then L[1] is an integer corresponding to the 1636 1907 @* dimension, L[2] is an intvec which contains the coefficients of the … … 1672 1943 RETURN: list 1673 1944 PURPOSE:Computing K-dimension, Hilbert series and mistletoes at once 1674 ASSUME: - basering is a Letterplace ring. G is a Letterplace ideal.1945 ASSUME: - basering is a Letterplace ring. 1675 1946 @* - if you specify a different degree bound degbound, 1676 @* degbound <= attrib(basering,uptodeg) should hold.1947 @* degbound <= attrib(basering,uptodeg) holds. 1677 1948 NOTE: - If L is the list returned, then L[1] is an integer, the K-dimension, 1678 1949 @* L[2] is an intvec, the Hilbert series and L[3] is an ideal, … … 1715 1986 RETURN: intvec, containing the coefficients of the Hilbert series 1716 1987 PURPOSE:Computing the Hilbert series 1717 ASSUME: - basering is a Letterplace ring. G is a Letterplace ideal.1988 ASSUME: - basering is a Letterplace ring. 1718 1989 @* - if you specify a different degree bound degbound, 1719 @* degbound <= attrib(basering,uptodeg) should hold.1990 @* degbound <= attrib(basering,uptodeg) holds. 1720 1991 NOTE: - If degbound is set, there will be a degree bound added. 0 means no 1721 1992 @* degree bound. Default: attrib(basering,uptodeg). … … 1753 2024 RETURN: int, 1 if K-dimension of the factor algebra is infinite, 0 otherwise 1754 2025 PURPOSE:Checking a factor algebra for finiteness of the K-dimension 1755 ASSUME: - basering is a Letterplace ring. G is a Letterplace ideal.2026 ASSUME: - basering is a Letterplace ring. 1756 2027 EXAMPLE: example lpDimCheck; shows examples 1757 2028 " … … 1781 2052 RETURN: int, the K-dimension of the factor algebra 1782 2053 PURPOSE:Computing the K-dimension of a factor algebra, given via an ideal 1783 ASSUME: - basering is a Letterplace ring . G is a Letterplace ideal.2054 ASSUME: - basering is a Letterplace ring 1784 2055 @* - if you specify a different degree bound degbound, 1785 @* degbound <= attrib(basering,uptodeg) should hold.2056 @* degbound <= attrib(basering,uptodeg) holds. 1786 2057 NOTE: - If degbound is set, there will be a degree bound added. 0 means no 1787 2058 @* degree bound. Default: attrib(basering, uptodeg). … … 1840 2111 RETURN: int, the K-dimension of the factor algebra 1841 2112 PURPOSE:Computing the K-dimension out of given mistletoes 1842 ASSUME: - basering is a Letterplace ring. G is a Letterplace ideal.2113 ASSUME: - basering is a Letterplace ring. 1843 2114 @* - M contains only monomials 1844 2115 NOTE: - The mistletoes have to be ordered lexicographically -> OrdMisLex. … … 1864 2135 RETURN: ideal, containing the mistletoes, ordered lexicographically 1865 2136 PURPOSE:A given set of mistletoes is ordered lexicographically 1866 ASSUME: - basering is a Letterplace ring. G is a Letterplace ideal.2137 ASSUME: - basering is a Letterplace ring. 1867 2138 NOTE: This is preprocessing, it is not needed if the mistletoes are returned 1868 2139 @* from the sickle algorithm. … … 1885 2156 RETURN: ideal 1886 2157 PURPOSE:Computing the mistletoes of K[X]/<G> 1887 ASSUME: - basering is a Letterplace ring. G is a Letterplace ideal.2158 ASSUME: - basering is a Letterplace ring. 1888 2159 @* - if you specify a different degree bound degbound, 1889 @* degbound <= attrib(basering,uptodeg) should hold.2160 @* degbound <= attrib(basering,uptodeg) holds. 1890 2161 NOTE: - If degbound is set, there will be a degree bound added. 0 means no 1891 2162 @* degree bound. Default: attrib(basering,uptodeg). … … 1923 2194 RETURN: list 1924 2195 PURPOSE:Computing the K-dimension and the mistletoes 1925 ASSUME: - basering is a Letterplace ring. G is a Letterplace ideal.2196 ASSUME: - basering is a Letterplace ring. 1926 2197 @* - if you specify a different degree bound degbound, 1927 @* degbound <= attrib(basering,uptodeg) should hold.2198 @* degbound <= attrib(basering,uptodeg) holds. 1928 2199 NOTE: - If L is the list returned, then L[1] is an integer, the K-dimension, 1929 2200 @* L[2] is an ideal, the mistletoes. … … 1962 2233 RETURN: list 1963 2234 PURPOSE:Computing the Hilbert series and the mistletoes 1964 ASSUME: - basering is a Letterplace ring. G is a Letterplace ideal.2235 ASSUME: - basering is a Letterplace ring. 1965 2236 @* - if you specify a different degree bound degbound, 1966 @* degbound <= attrib(basering,uptodeg) should hold.2237 @* degbound <= attrib(basering,uptodeg) holds. 1967 2238 NOTE: - If L is the list returned, then L[1] is an intvec, corresponding to the 1968 2239 @* Hilbert series, L[2] is an ideal, the mistletoes. … … 2004 2275 RETURN: list 2005 2276 PURPOSE:Allowing the user to access all procs with one command 2006 ASSUME: - basering is a Letterplace ring. G is a Letterplace ideal.2277 ASSUME: - basering is a Letterplace ring. 2007 2278 @* - if you specify a different degree bound degbound, 2008 @* degbound <= attrib(basering,uptodeg) should hold.2279 @* degbound <= attrib(basering,uptodeg) holds. 2009 2280 NOTE: The returned object will always be a list, but the entries of the 2010 2281 @* returned list may be very different … … 2062 2333 sickle(G,0,0,1); // computes Hilbert series only 2063 2334 } 2335 2336 proc ivMaxIdeal(int l, int lonly) 2337 "USAGE: lpMaxIdeal(l, lonly); l an integer, lonly an integer 2338 RETURN: list 2339 PURPOSE: computes a list of free monomials in intvec presentation 2340 @* with length <= l 2341 @* if donly <> 0, only monomials of degree d are returned 2342 ASSUME: - basering is a Letterplace ring. 2343 NOTE: see also lpMaxIdeal() 2344 " 2345 { 2346 if (l < 0) { 2347 ERROR("l must not be negative") 2348 } 2349 list words; 2350 if (l == 0) { 2351 words = 0; 2352 return (words); 2353 } 2354 int lV = attrib(basering, "lV"); // variable count 2355 list prevWords; 2356 if (l > 1) { 2357 prevWords = ivMaxIdeal(l - 1, lonly); 2358 } else { 2359 prevWords = 0; 2360 } 2361 for (int i = 1; i <= size(prevWords); i++) { 2362 if (size(prevWords[i]) >= l - 1) { 2363 for (int j = 1; j <= lV; j++) { 2364 intvec word = prevWords[i]; 2365 word[l] = j; 2366 words = insert(words, word); 2367 kill word; 2368 } kill j; 2369 } 2370 } kill i; 2371 if (!lonly && l > 1) { 2372 words = prevWords + words; 2373 } 2374 return (words); 2375 } 2376 example { 2377 "EXAMPLE:"; echo = 2; 2378 ring r = 0,(a,b,c),dp; 2379 def R = makeLetterplaceRing(7); setring R; 2380 ivMaxIdeal(1,0); 2381 ivMaxIdeal(2,0); 2382 ivMaxIdeal(2,1); 2383 ivMaxIdeal(4,0); 2384 ivMaxIdeal(4,1); 2385 } 2386 2387 proc lpMaxIdeal(int d, int donly) 2388 "USAGE: lpMaxIdeal(d, donly); d an integer, donly an integer 2389 RETURN: ideal 2390 PURPOSE: computes a list of free monomials of degree at most d 2391 @* if donly <> 0, only monomials of degree d are returned 2392 ASSUME: - basering is a Letterplace ring. 2393 @* - d <= attrib(basering,uptodeg) holds. 2394 NOTE: analogous to maxideal(d) in the commutative case 2395 " 2396 { 2397 ivL2lpI(ivMaxIdeal(d, donly)); 2398 } 2399 example { 2400 "EXAMPLE:"; echo = 2; 2401 ring r = 0,(a,b,c),dp; 2402 def R = makeLetterplaceRing(7); setring R; 2403 lpMaxIdeal(1,0); 2404 lpMaxIdeal(2,0); 2405 lpMaxIdeal(2,1); 2406 lpMaxIdeal(4,0); 2407 lpMaxIdeal(4,1); 2408 } 2409 2410 proc monomialBasis(int d, int donly, ideal J) 2411 "USAGE: monomialBasis(d, donly, J); d, donly integers, J an ideal 2412 RETURN: ideal 2413 PURPOSE: computes a list of free monomials in a Letterplace 2414 @* basering R of degree at most d and not contained in <LM(J)> 2415 @* if donly <> 0, only monomials of degree d are returned 2416 ASSUME: - basering is a Letterplace ring. 2417 @* - d <= attrib(basering,uptodeg) holds. 2418 @* - J is a Groebner basis 2419 " 2420 { 2421 int nv = attrib(basering,"uptodeg"); 2422 if ((d>nv) || (d<0) ) 2423 { 2424 ERROR("incorrect degree"); 2425 } 2426 nv = attrib(basering,"lV"); // nvars 2427 if (d==0) 2428 { 2429 return(ideal(1)); 2430 } 2431 /* from now on d>=1 */ 2432 ideal I; 2433 if (size(J)==0) 2434 { 2435 I = lpMaxIdeal(d,donly); 2436 if (!donly) 2437 { 2438 // append 1 as the first element; d>=1 2439 I = 1, I; 2440 } 2441 return( I ); 2442 } 2443 // ok, Sickle misbehaves: have to remove all 2444 // elts from J of degree >d 2445 ideal JJ; 2446 int j; int sj = ncols(J); 2447 int cnt=0; 2448 for(j=1;j<=sj;j++) 2449 { 2450 if (deg(J[j]) <= d) 2451 { 2452 cnt++; 2453 JJ[cnt]=lead(J[j]); // only LMs are needed 2454 } 2455 } 2456 if (cnt==0) 2457 { 2458 // there are no elements in J of degree <= d 2459 // return free stuff and the 1 2460 I = monomialBasis(d, donly, std(0)); 2461 if (!donly) 2462 { 2463 I = 1, I; 2464 } 2465 return(I); 2466 } 2467 // from here on, Ibase is not zero 2468 ideal Ibase = lpMis2Base(lpSickle(JJ,d)); // the complete K-basis modulo J up to d 2469 if (!donly) 2470 { 2471 // for not donly, give everything back 2472 // sort by DP starting with smaller terms 2473 Ibase = sort(Ibase,"Dp")[1]; 2474 return(Ibase); 2475 } 2476 /* !donly: pick out only monomials of degree d */ 2477 int i; int si = ncols(Ibase); 2478 cnt=0; 2479 I=0; 2480 for(i=1;i<=si;i++) 2481 { 2482 if (deg(Ibase[i]) == d) 2483 { 2484 cnt++; 2485 I[cnt]=Ibase[i]; 2486 } 2487 } 2488 kill Ibase; 2489 return(I); 2490 } 2491 example { 2492 "EXAMPLE:"; echo = 2; 2493 ring r = 0,(x,y),dp; 2494 def R = makeLetterplaceRing(7); setring R; 2495 ideal J = x(1)*y(2)*x(3) - y(1)*x(2)*y(3); 2496 option(redSB); option(redTail); 2497 J = letplaceGBasis(J); 2498 J; 2499 monomialBasis(2,1,std(0)); 2500 monomialBasis(2,0,std(0)); 2501 monomialBasis(3,1,J); 2502 monomialBasis(3,0,J); 2503 } 2504 2505 2506 /////////////////////////////////////////////////////////////////////////////// 2507 /* vl: stuff for conversion to Magma and to SD 2508 todo: doc, example 2509 */ 2510 static proc extractVars(r) 2511 { 2512 int i = 1; 2513 int j = 1; 2514 string candidate; 2515 list result = list(); 2516 for (i = 1; i<=nvars(r);i++) 2517 { 2518 candidate = string(var(i))[1,find(string(var(i)),"(")-1]; 2519 if (!inList(result, candidate)) 2520 { 2521 result = insert(result,candidate,size(result)); 2522 } 2523 } 2524 return(result); 2525 } 2526 2527 static proc letterPlacePoly2MagmaString(poly h) 2528 { 2529 int pos; 2530 string s = string(h); 2531 while(find(s,"(")) 2532 { 2533 pos = find(s,"("); 2534 while(s[pos]!=")") 2535 { 2536 s = s[1,pos-1]+s[pos+1,size(s)-pos]; 2537 } 2538 if (size(s)!=pos) 2539 { 2540 s = s[1,pos-1]+s[pos+1,size(s)-pos]; // The last (")") 2541 } 2542 else 2543 { 2544 s = s[1,pos-1]; 2545 } 2546 } 2547 return(s); 2548 } 2549 2550 static proc letterPlaceIdeal2SD(ideal I, int upToDeg) 2551 { 2552 int i; 2553 print("Don't forget to fill in the formal Data in the file"); 2554 string result = "<?xml version=\"1.0\"?>"+newline+"<FREEALGEBRA createdAt=\"\" createdBy=\"Singular\" id=\"FREEALGEBRA/\">"+newline; 2555 result = result + "<vars>"+string(extractVars(basering))+"</vars>"+newline; 2556 result = result + "<basis>"+newline; 2557 for (i = 1;i<=size(I);i++) 2558 { 2559 result = result + "<poly>"+letterPlacePoly2MagmaString(I[i])+"</poly>"+newline; 2560 } 2561 result = result + "</basis>"+newline; 2562 result = result + "<uptoDeg>"+ string(upToDeg)+"</uptoDeg>"+newline; 2563 result = result + "<Comment></Comment>"+newline; 2564 result = result + "<Version></Version>"+newline; 2565 result = result + "</FREEALGEBRA>"; 2566 return(result); 2567 } 2568 2064 2569 2065 2570 /////////////////////////////////////////////////////////////////////////////// … … 2098 2603 example lp2ivId; 2099 2604 example lpId2ivLi; 2100 } 2101 2102 2103 2104 2605 example lpSubstitute; 2606 } 2105 2607 2106 2608 /* 2107 Here are some examples one may try. Just copy them into your console. 2108 These are relations for braid groups, up to degree d: 2109 2110 2111 LIB "fpadim.lib"; 2112 ring r = 0,(x,y,z),dp; 2113 int d =10; // degree 2114 def R = makeLetterplaceRing(d); 2115 setring R; 2116 ideal I = y(1)*x(2)*y(3) - z(1)*y(2)*z(3), x(1)*y(2)*x(3) - z(1)*x(2)*y(3), 2117 z(1)*x(2)*z(3) - y(1)*z(2)*x(3), x(1)*x(2)*x(3) + y(1)*y(2)*y(3) + 2118 z(1)*z(2)*z(3) + x(1)*y(2)*z(3); 2119 option(prot); 2120 option(redSB);option(redTail);option(mem); 2121 ideal J = system("freegb",I,d,3); 2122 lpDimCheck(J); 2123 sickle(J,1,1,1,d);//Computes mistletoes, K-dimension and the Hilbert series 2124 2125 2126 2127 LIB "fpadim.lib"; 2128 ring r = 0,(x,y,z),dp; 2129 int d =11; // degree 2130 def R = makeLetterplaceRing(d); 2131 setring R; 2132 ideal I = y(1)*x(2)*y(3) - z(1)*y(2)*z(3), x(1)*y(2)*z(3) - z(1)*x(2)*y(3), 2133 z(1)*x(2)*z(3) - y(1)*z(2)*x(3), x(1)*x(2)*x(3) + y(1)*y(2)*y(3) + 2134 z(1)*z(2)*z(3) + x(1)*y(2)*z(3); 2135 option(prot); 2136 option(redSB);option(redTail);option(mem); 2137 ideal J = system("freegb",I,d,3); 2138 lpDimCheck(J); 2139 sickle(J,1,1,1,d); 2140 2141 2142 2143 LIB "fpadim.lib"; 2144 ring r = 0,(x,y,z),dp; 2145 int d = 6; // degree 2146 def R = makeLetterplaceRing(d); 2147 setring R; 2148 ideal I = y(1)*x(2)*y(3) - z(1)*y(2)*z(3), x(1)*y(2)*x(3) - z(1)*x(2)*y(3), 2149 z(1)*x(2)*z(3) - y(1)*z(2)*x(3), x(1)*x(2)*x(3) -2*y(1)*y(2)*y(3) + 3*z(1)*z(2)*z(3) -4*x(1)*y(2)*z(3) + 5*x(1)*z(2)*z(3)- 6*x(1)*y(2)*y(3) +7*x(1)*x(2)*z(3) - 8*x(1)*x(2)*y(3); 2150 option(prot); 2151 option(redSB);option(redTail);option(mem); 2152 ideal J = system("freegb",I,d,3); 2153 lpDimCheck(J); 2154 sickle(J,1,1,1,d); 2609 Here are some examples one may try. Just copy them into your console. 2610 These are relations for braid groups, up to degree d: 2611 2612 LIB "fpadim.lib"; 2613 ring r = 0,(x,y,z),dp; 2614 int d =10; // degree 2615 def R = makeLetterplaceRing(d); 2616 setring R; 2617 ideal I = y(1)*x(2)*y(3) - z(1)*y(2)*z(3), x(1)*y(2)*x(3) - z(1)*x(2)*y(3), 2618 z(1)*x(2)*z(3) - y(1)*z(2)*x(3), x(1)*x(2)*x(3) + y(1)*y(2)*y(3) + 2619 z(1)*z(2)*z(3) + x(1)*y(2)*z(3); 2620 option(prot); 2621 option(redSB);option(redTail);option(mem); 2622 ideal J = system("freegb",I,d,3); 2623 lpDimCheck(J); 2624 sickle(J,1,1,1,d);//Computes mistletoes, K-dimension and the Hilbert series 2625 2626 2627 2628 LIB "fpadim.lib"; 2629 ring r = 0,(x,y,z),dp; 2630 int d =11; // degree 2631 def R = makeLetterplaceRing(d); 2632 setring R; 2633 ideal I = y(1)*x(2)*y(3) - z(1)*y(2)*z(3), x(1)*y(2)*z(3) - z(1)*x(2)*y(3), 2634 z(1)*x(2)*z(3) - y(1)*z(2)*x(3), x(1)*x(2)*x(3) + y(1)*y(2)*y(3) + 2635 z(1)*z(2)*z(3) + x(1)*y(2)*z(3); 2636 option(prot); 2637 option(redSB);option(redTail);option(mem); 2638 ideal J = system("freegb",I,d,3); 2639 lpDimCheck(J); 2640 sickle(J,1,1,1,d); 2641 2642 2643 2644 LIB "fpadim.lib"; 2645 ring r = 0,(x,y,z),dp; 2646 int d = 6; // degree 2647 def R = makeLetterplaceRing(d); 2648 setring R; 2649 ideal I = y(1)*x(2)*y(3) - z(1)*y(2)*z(3), x(1)*y(2)*x(3) - z(1)*x(2)*y(3), 2650 z(1)*x(2)*z(3) - y(1)*z(2)*x(3), x(1)*x(2)*x(3) -2*y(1)*y(2)*y(3) + 3*z(1)*z(2)*z(3) -4*x(1)*y(2)*z(3) + 5*x(1)*z(2)*z(3)- 6*x(1)*y(2)*y(3) +7*x(1)*x(2)*z(3) - 8*x(1)*x(2)*y(3); 2651 option(prot); 2652 option(redSB);option(redTail);option(mem); 2653 ideal J = system("freegb",I,d,3); 2654 lpDimCheck(J); 2655 sickle(J,1,1,1,d); 2656 */ 2657 2658 /* 2659 Here are some examples, which can also be found in [studzins]: 2660 2661 // takes up to 880Mb of memory 2662 LIB "fpadim.lib"; 2663 ring r = 0,(x,y,z),dp; 2664 int d =10; // degree 2665 def R = makeLetterplaceRing(d); 2666 setring R; 2667 ideal I = 2668 z(1)*z(2)*z(3)*z(4) + y(1)*x(2)*y(3)*x(4) - x(1)*y(2)*y(3)*x(4) - 3*z(1)*y(2)*x(3)*z(4), x(1)*x(2)*x(3) + y(1)*x(2)*y(3) - x(1)*y(2)*x(3), z(1)*y(2)*x(3)-x(1)*y(2)*z(3) + z(1)*x(2)*z(3); 2669 option(prot); 2670 option(redSB);option(redTail);option(mem); 2671 ideal J = system("freegb",I,d,nvars(r)); 2672 lpDimCheck(J); 2673 sickle(J,1,1,1,d); // dimension is 24872 2674 2675 2676 LIB "fpadim.lib"; 2677 ring r = 0,(x,y,z),dp; 2678 int d =10; // degree 2679 def R = makeLetterplaceRing(d); 2680 setring R; 2681 ideal I = x(1)*y(2) + y(1)*z(2), x(1)*x(2) + x(1)*y(2) - y(1)*x(2) - y(1)*y(2); 2682 option(prot); 2683 option(redSB);option(redTail);option(mem); 2684 ideal J = system("freegb",I,d,3); 2685 lpDimCheck(J); 2686 sickle(J,1,1,1,d); 2687 */ 2688 2689 2690 /* 2691 Example for computing GK dimension: 2692 returns a ring which contains an ideal I 2693 run gkDim(I) inside this ring and it should return 2n (the GK dimension 2694 of n-th Weyl algebra including evaluation operators). 2695 2696 static proc createWeylEx(int n, int d) 2697 " 2698 " 2699 { 2700 int baseringdef; 2701 if (defined(basering)) // if a basering is defined, it should be saved for later use 2702 { 2703 def save = basering; 2704 baseringdef = 1; 2705 } 2706 ring r = 0,(d(1..n),x(1..n),e(1..n)),dp; 2707 def R = makeLetterplaceRing(d); 2708 setring R; 2709 ideal I; int i,j; 2710 2711 for (i = 1; i <= n; i++) 2712 { 2713 for (j = i+1; j<= n; j++) 2714 { 2715 I[size(I)+1] = lpMult(var(i),var(j)); 2716 } 2717 } 2718 2719 for (i = 1; i <= n; i++) 2720 { 2721 for (j = i+1; j<= n; j++) 2722 { 2723 I[size(I)+1] = lpMult(var(n+i),var(n+j)); 2724 } 2725 } 2726 for (i = 1; i <= n; i++) 2727 { 2728 for (j = 1; j<= n; j++) 2729 { 2730 I[size(I)+1] = lpMult(var(i),var(n+j)); 2731 } 2732 } 2733 for (i = 1; i <= n; i++) 2734 { 2735 for (j = 1; j<= n; j++) 2736 { 2737 I[size(I)+1] = lpMult(var(i),var(2*n+j)); 2738 } 2739 } 2740 for (i = 1; i <= n; i++) 2741 { 2742 for (j = 1; j<= n; j++) 2743 { 2744 I[size(I)+1] = lpMult(var(2*n+i),var(n+j)); 2745 } 2746 } 2747 for (i = 1; i <= n; i++) 2748 { 2749 for (j = 1; j<= n; j++) 2750 { 2751 I[size(I)+1] = lpMult(var(2*n+i),var(2*n+j)); 2752 } 2753 } 2754 I = simplify(I,2+4); 2755 I = letplaceGBasis(I); 2756 export(I); 2757 if (baseringdef == 1) {setring save;} 2758 return(R); 2759 } 2760 2761 proc TestGKAuslander3() 2762 { 2763 ring r = (0,q),(z,x,y),(dp(1),dp(2)); 2764 def R = makeLetterplaceRing(5); // constructs a Letterplace ring 2765 R; setring R; // sets basering to Letterplace ring 2766 ideal I; 2767 I = q*x(1)*y(2) - y(1)*x(2), z(1)*y(2) - y(1)*z(2), z(1)*x(2) - x(1)*z(2); 2768 I = letplaceGBasis(I); 2769 lpGkDim(I); // must be 3 2770 I = x(1)*y(2)*z(3) - y(1)*x(2), z(1)*y(2) - y(1)*z(2), z(1)*x(2) - x(1)*z(2);//gkDim = 2 2771 I = letplaceGBasis(I); // not finite BUT contains a poly in x,y only 2772 lpGkDim(I); // must be 4 2773 2774 ring r = 0,(y,x,z),dp; 2775 def R = makeLetterplaceRing(10); // constructs a Letterplace ring 2776 R; setring R; // sets basering to Letterplace ring 2777 ideal I; 2778 I = x(1)*y(2)*z(3) - y(1)*x(2), z(1)*y(2) - y(1)*z(2), z(1)*x(2) - x(1)*z(2);//gkDim = 2 2779 I = letplaceGBasis(I); // computed as it would be homogenized; infinite 2780 poly p = x(1)*y(2)*y(3)*x(4)-y(1)*x(2)*x(3)*y(4); 2781 lpNF(p, I); // 0 as expected 2782 2783 // with inverse of z 2784 ring r = 0,(iz,z,x,y),dp; 2785 def R = makeLetterplaceRing(11); // constructs a Letterplace ring 2786 R; setring R; // sets basering to Letterplace ring 2787 ideal I; 2788 I = x(1)*y(2)*z(3) - y(1)*x(2), z(1)*y(2) - y(1)*z(2), z(1)*x(2) - x(1)*z(2), 2789 iz(1)*y(2) - y(1)*iz(2), iz(1)*x(2) - x(1)*iz(2), iz(1)*z(2)-1, z(1)*iz(2) -1; 2790 I = letplaceGBasis(I); // 2791 setring r; 2792 def R2 = makeLetterplaceRing(23); // constructs a Letterplace ring 2793 setring R2; // sets basering to Letterplace ring 2794 ideal I = imap(R,I); 2795 lpGkDim(I); 2796 2797 2798 ring r = 0,(t,z,x,y),(dp(2),dp(2)); 2799 def R = makeLetterplaceRing(20); // constructs a Letterplace ring 2800 R; setring R; // sets basering to Letterplace ring 2801 ideal I; 2802 I = x(1)*y(2)*z(3) - y(1)*x(2)*t(3), z(1)*y(2) - y(1)*z(2), z(1)*x(2) - x(1)*z(2), 2803 t(1)*y(2) - y(1)*t(2), t(1)*x(2) - x(1)*t(2), t(1)*z(2) - z(1)*t(2);//gkDim = 2 2804 I = letplaceGBasis(I); // computed as it would be homogenized; infinite 2805 LIB "elim.lib"; 2806 ideal Inoz = nselect(I,intvec(2,6,10,14,18,22,26,30)); 2807 for(int i=1; i<=20; i++) 2808 { 2809 Inoz=subst(Inoz,t(i),1); 2810 } 2811 ideal J = x(1)*y(2)*y(3)*x(4)-y(1)*x(2)*x(3)*y(4); 2812 J = letplaceGBasis(J); 2813 2814 poly p = x(1)*y(2)*y(3)*x(4)-y(1)*x(2)*x(3)*y(4); 2815 lpNF(p, I); // 0 as expected 2816 2817 ring r2 = 0,(x,y),dp; 2818 def R2 = makeLetterplaceRing(50); // constructs a Letterplace ring 2819 setring R2; 2820 ideal J = x(1)*y(2)*y(3)*x(4)-y(1)*x(2)*x(3)*y(4); 2821 J = letplaceGBasis(J); 2822 } 2823 2155 2824 */ 2156 2825 2157 /* 2158 Here are some examples, which can also be found in [studzins]: 2159 2160 // takes up to 880Mb of memory 2161 LIB "fpadim.lib"; 2162 ring r = 0,(x,y,z),dp; 2163 int d =10; // degree 2164 def R = makeLetterplaceRing(d); 2165 setring R; 2166 ideal I = 2167 z(1)*z(2)*z(3)*z(4) + y(1)*x(2)*y(3)*x(4) - x(1)*y(2)*y(3)*x(4) - 3*z(1)*y(2)*x(3)*z(4), x(1)*x(2)*x(3) + y(1)*x(2)*y(3) - x(1)*y(2)*x(3), z(1)*y(2)*x(3)-x(1)*y(2)*z(3) + z(1)*x(2)*z(3); 2168 option(prot); 2169 option(redSB);option(redTail);option(mem); 2170 ideal J = system("freegb",I,d,nvars(r)); 2171 lpDimCheck(J); 2172 sickle(J,1,1,1,d); // dimension is 24872 2173 2174 2175 LIB "fpadim.lib"; 2176 ring r = 0,(x,y,z),dp; 2177 int d =10; // degree 2178 def R = makeLetterplaceRing(d); 2179 setring R; 2180 ideal I = x(1)*y(2) + y(1)*z(2), x(1)*x(2) + x(1)*y(2) - y(1)*x(2) - y(1)*y(2); 2181 option(prot); 2182 option(redSB);option(redTail);option(mem); 2183 ideal J = system("freegb",I,d,3); 2184 lpDimCheck(J); 2185 sickle(J,1,1,1,d); 2186 */ 2826 2827 /* more tests : downup algebra A 2828 LIB "fpadim.lib"; 2829 ring r = (0,a,b,g),(x,y),Dp; 2830 def R = makeLetterplaceRing(6); // constructs a Letterplace ring 2831 setring R; 2832 poly F1 = g*x(1); 2833 poly F2 = g*y(1); 2834 ideal J = x(1)*x(2)*y(3)-a*x(1)*y(2)*x(3) - b*y(1)*x(2)*x(3) - F1, 2835 x(1)*y(2)*y(3)-a*y(1)*x(2)*y(3) - b*y(1)*y(2)*x(3) - F2; 2836 J = letplaceGBasis(J); 2837 lpGkDim(J); // 3 == correct 2838 2839 // downup algebra B 2840 LIB "fpadim.lib"; 2841 ring r = (0,a,b,g, p(1..7),q(1..7)),(x,y),Dp; 2842 def R = makeLetterplaceRing(6); // constructs a Letterplace ring 2843 setring R; 2844 ideal imn = 1, y(1)*y(2)*y(3), x(1)*y(2), y(1)*x(2), x(1)*x(2), y(1)*y(2), x(1), y(1); 2845 int i; 2846 poly F1, F2; 2847 for(i=1;i<=7;i++) 2848 { 2849 F1 = F1 + p(i)*imn[i]; 2850 F2 = F2 + q(i)*imn[i]; 2851 } 2852 ideal J = x(1)*x(2)*y(3)-a*x(1)*y(2)*x(3) - b*y(1)*x(2)*x(3) - F1, 2853 x(1)*y(2)*y(3)-a*y(1)*x(2)*y(3) - b*y(1)*y(2)*x(3) - F2; 2854 J = letplaceGBasis(J); 2855 lpGkDim(J); // 3 == correct 2856 2857 */ -
Singular/LIB/freegb.lib
r6b02216 rfbd9e6f 3 3 category="Noncommutative"; 4 4 info=" 5 LIBRARY: freegb.lib Compute two-sided Groebner bases in free algebras via 6 @* letterplace 5 LIBRARY: freegb.lib Compute two-sided Groebner bases in free algebras via letterplace approach 7 6 AUTHORS: Viktor Levandovskyy, viktor.levandovskyy@math.rwth-aachen.de 8 @* Grischa Studzinski, grischa.studzinski@math.rwth-aachen.de 9 10 OVERVIEW: For the theory, see chapter 'Letterplace' in the Singular Manual 7 Grischa Studzinski, grischa.studzinski@math.rwth-aachen.de 8 9 OVERVIEW: For the theory, see chapter 'Letterplace' in the @sc{Singular} Manual 10 11 Support: Joint projects LE 2697/2-1 and KR 1907/3-1 of the Priority Programme SPP 1489: 12 'Algorithmische und Experimentelle Methoden in Algebra, Geometrie und Zahlentheorie' 13 of the German DFG 14 and Project II.6 of the transregional collaborative research centre 15 SFB-TRR 195 'Symbolic Tools in Mathematics and their Application' of the German DFG 11 16 12 17 PROCEDURES: 13 makeLetterplaceRing(d); creates a ring with d blocks of shifted original 14 @* variables 15 letplaceGBasis(I); computes two-sided Groebner basis of a letterplace ideal I 16 @* up to a degree bound 17 lpNF(f,I); normal form of f with respect to ideal I 18 freeGBasis(L, n); computes two-sided Groebner basis of an ideal, encoded via 19 @* list L, up to degree n 18 makeLetterplaceRing(d); creates a ring with d blocks of shifted original variables 19 letplaceGBasis(I); computes two-sided Groebner basis of a letterplace ideal I up to a degree bound 20 lpNF(f,I); two-sided normal form of f with respect to ideal I 20 21 setLetterplaceAttributes(R,d,b); supplies ring R with the letterplace structure 21 22 freeGBasis(L, n); computes two-sided Groebner basis of an ideal, encoded via list L, up to degree n 22 23 23 24 lpMult(f,g); letterplace multiplication of letterplace polynomials 24 25 shiftPoly(p,i); compute the i-th shift of letterplace polynomial p 25 26 lpPower(f,n); natural power of a letterplace polynomial 26 lp2lstr(K, s); convert letter-place ideal to a list of modules 27 lst2str(L[, n]); convert a list (of modules) into polynomials in free algebra 28 mod2str(M[, n]); convert a module into a polynomial in free algebra 27 lieBracket(a,b[, N]); compute Lie bracket ab-ba of two letterplace polynomials 28 29 lp2lstr(K, s); convert a letterplace ideal into a list of modules 30 lst2str(L[, n]); convert a list (of modules) into polynomials in free algebra via strings 31 mod2str(M[, n]); convert a module into a polynomial in free algebra via strings 29 32 vct2str(M[, n]); convert a vector into a word in free algebra 30 lieBracket(a,b[, N]); compute Lie bracket ab-ba of two letterplace polynomials 31 serreRelations(A,z); compute the homogeneous part of Serre's relations 32 @* associated to a generalized Cartan matrix A 33 fullSerreRelations(A,N,C,P,d); compute the ideal of all Serre's relations 34 @* associated to a generalized Cartan matrix A 35 isVar(p); check whether p is a power of a single variable 33 34 serreRelations(A,z); compute the homogeneous part of Serre's relations associated to a generalized Cartan matrix A 35 fullSerreRelations(A,N,C,P,d); compute the ideal of all Serre's relations associated to a generalized Cartan matrix A 36 isVar(p); check whether p is a power of a single variable 36 37 ademRelations(i,j); compute the ideal of Adem relations for i<2j in char 0 37 38 … … 968 969 RETURN: ring 969 970 PURPOSE: creates a ring with the ordering, used in letterplace computations 970 NOTE: if h is given and nonzero, the pure homogeneous letterplace block 971 @* ordering will be used. 971 NOTE: h = 0 (default) : Dp ordering will be used 972 h = 2 : weights 1 used for all the variables, a tie breaker is a list of block of original ring 973 h = 1 : the pure homogeneous letterplace block ordering (applicable in the situation of homogeneous input ideals) will be used. 972 974 EXAMPLE: example makeLetterplaceRing; shows examples 973 975 " 974 976 { 975 int use_old_mlr = 0;977 int alternativeVersion = 2; // temporary until makeLetterplaceRing4() is fixed 976 978 if ( size(#)>0 ) 977 979 { 978 if (( typeof(#[1]) == "int" ) || ( typeof(#[1]) == "poly" ) ) 979 { 980 poly x = poly(#[1]); 981 if (x!=0) 982 { 983 use_old_mlr = 1; 984 } 985 } 986 } 987 if (use_old_mlr) 980 if (typeof(#[1]) == "int") 981 { 982 alternativeVersion = #[1]; 983 } 984 } 985 if (alternativeVersion == 1) 988 986 { 989 987 def @A = makeLetterplaceRing1(d); 990 988 } 991 else 992 { 993 def @A = makeLetterplaceRing2(d); 989 else { 990 if (alternativeVersion == 2) 991 { 992 def @A = makeLetterplaceRing2(d); 993 } 994 else { 995 def @A = makeLetterplaceRing4(d); 996 } 994 997 } 995 998 return(@A); … … 1205 1208 } 1206 1209 1210 static proc makeLetterplaceRing4(int d) 1211 "USAGE: makeLetterplaceRing2(d); d an integer 1212 RETURN: ring 1213 PURPOSE: creates a Letterplace ring with a Dp ordering, suitable for 1214 @* the use of non-homogeneous letterplace 1215 NOTE: the matrix for the ordering looks as follows: first row is 1,1,...,1 1216 EXAMPLE: example makeLetterplaceRing2; shows examples 1217 " 1218 { 1219 1220 // ToDo future: inherit positive weights in the orig ring 1221 // complain on nonpositive ones 1222 1223 // d = up to degree, will be shifted to d+1 1224 if (d<1) {"bad d"; return(0);} 1225 1226 int uptodeg = d; int lV = nvars(basering); 1227 1228 int ppl = printlevel-voice+2; 1229 string err = ""; 1230 1231 int i,j,s; 1232 def save = basering; 1233 int D = d-1; 1234 list LR = ringlist(save); 1235 list L, tmp, tmp2, tmp3; 1236 L[1] = LR[1]; // ground field 1237 L[4] = LR[4]; // quotient ideal 1238 tmp = LR[2]; // varnames 1239 s = size(LR[2]); 1240 for (i=1; i<=D; i++) 1241 { 1242 for (j=1; j<=s; j++) 1243 { 1244 tmp[i*s+j] = string(tmp[j])+"("+string(i+1)+")"; 1245 } 1246 } 1247 for (i=1; i<=s; i++) 1248 { 1249 tmp[i] = string(tmp[i])+"("+string(1)+")"; 1250 } 1251 L[2] = tmp; 1252 list OrigNames = LR[2]; 1253 1254 s = size(LR[3]); 1255 list ordering; 1256 ordering[1] = list("Dp",intvec(1: int(d*lV))); 1257 ordering[2] = LR[3][s]; // module ord to place at the very end 1258 LR[3] = ordering; 1259 1260 L[3] = LR[3]; 1261 attrib(L,"maxExp",1); 1262 def @R = ring(L); 1263 def @@R = setLetterplaceAttributes(@R,uptodeg,lV); 1264 return (@@R); 1265 } 1266 example 1267 { 1268 "EXAMPLE:"; echo = 2; 1269 ring r = 0,(x,y,z),(dp(1),dp(2)); 1270 def A = makeLetterplaceRing2(2); 1271 setring A; 1272 A; 1273 attrib(A,"isLetterplaceRing"); 1274 attrib(A,"uptodeg"); // degree bound 1275 attrib(A,"lV"); // number of variables in the main block 1276 } 1277 1207 1278 // P[s;sigma] approach 1208 1279 static proc makeLetterplaceRing3(int d) … … 1314 1385 attrib(A,"lV"); // number of variables in the main block 1315 1386 } 1316 1317 1318 1387 1319 1388 /* EXAMPLES: … … 2600 2669 if (i>N) 2601 2670 { 2602 ERROR("The total number of elements in input ideals must not exceed the dimension of the ground ring"); 2671 string s1="The total number of elements in input ideals"; 2672 string s2="must not exceed the dimension of the ground ring"; 2673 ERROR(s1+s2); 2603 2674 } 2604 2675 if (i < N) … … 3029 3100 */ 3030 3101 3031 //static 3032 proc lpMultX(poly f, poly g) 3102 static proc lpMultX(poly f, poly g) 3033 3103 { 3034 3104 /* multiplies two polys in a very general setting correctly */ … … 3083 3153 } 3084 3154 3085 // TODO:3086 3155 // multiply two letterplace polynomials, lpMult: done 3087 3156 // reduction/ Normalform? needs kernel stuff … … 3172 3241 //@* else there wouldn't be an dvec representation 3173 3242 3174 //Main procedure for the user3243 //Main procedure for the user 3175 3244 3176 3245 proc lpNF(poly p, ideal G) 3177 3246 "USAGE: lpNF(p,G); f letterplace polynomial, ideal I 3178 3247 RETURN: poly 3179 PURPOSE: computation of the normal form of p with respect to G3248 PURPOSE: computation of the normal form of p with respect to G 3180 3249 ASSUME: p is a Letterplace polynomial, G is a set Letterplace polynomials, 3181 3250 being a Letterplace Groebner basis (no check for this will be done) 3182 3251 NOTE: Strategy: take the smallest monomial wrt ordering for reduction 3183 @*For homogenous ideals the shift does not matter3184 @*For non-homogenous ideals the first shift will be the smallest monomial3252 - For homogenous ideals the shift does not matter 3253 - For non-homogenous ideals the first shift will be the smallest monomial 3185 3254 EXAMPLE: example lpNF; shows examples 3186 3255 " … … 3189 3258 G = sort(G)[1]; 3190 3259 list L = makeDVecI(G); 3191 return(normalize(lpNormalForm 1(p,G,L)));3260 return(normalize(lpNormalForm2(p,G,L))); 3192 3261 } 3193 3262 example … … 3214 3283 RETURN: list of intvecs 3215 3284 PURPOSE: convert G into a list of intvecs, corresponding to the exponent vector 3216 @*of the leading monomials of G3285 of the leading monomials of G 3217 3286 " 3218 3287 {int i; list L; … … 3220 3289 return(L); 3221 3290 } 3222 3223 3291 3224 3292 static proc delSupZero(intvec I) … … 3247 3315 } 3248 3316 3249 3250 3317 static proc delSupZeroList(list L) 3251 3318 "USUAGE:delSupZeroList(L); L a list, containing intvecs … … 3326 3393 } 3327 3394 3328 3329 3330 //the actual normalform procedure, if a user want not to presort the ideal, just make it not static 3331 3395 //the first normal form procedure, if a user want not to presort the ideal, just make it not static 3332 3396 3333 3397 static proc lpNormalForm1(poly p, ideal G, list L) … … 3358 3422 3359 3423 3424 // new VL; called from lpNF 3425 static proc lpNormalForm2(poly pp, ideal G, list L) 3426 "USUAGE:lpNormalForm2(p,G); 3427 RETURN:poly 3428 PURPOSE:computation of the normal form of p w.r.t. G 3429 ASSUME: p is a Letterplace polynomial, G is a set of Letterplace polynomials 3430 NOTE: Taking the first possible reduction 3431 " 3432 { 3433 poly one = 1; 3434 if ( (pp == 0) || (leadmonom(pp) == one) ) { return(pp); } 3435 poly p = pp; poly q; 3436 int i; int s; intvec V; 3437 while ( (p != 0) && (leadmonom(p) != one) ) 3438 { 3439 //"entered while with p="; p; 3440 V = makeDVec(delSupZero(leadexp(p))); 3441 i = 0; 3442 s = -1; 3443 //"look for divisor"; 3444 while ( (s == -1) && (i<size(L)) ) 3445 { 3446 i = i+1; 3447 s = dShiftDiv(V, L[i])[1]; 3448 } 3449 // now, out of here: either i=size(L) and s==-1 => no reduction 3450 // otherwise: i<=size(L) and s!= -1 => reduction 3451 //"out of divisor search: s="; s; "i="; i; 3452 if (s != -1) 3453 { 3454 //"start reducing with G[i]:"; 3455 p = lpReduce(p,G[i],s); // lm-reduction 3456 //"reduced to p="; p; 3457 } 3458 else 3459 { 3460 // ie no lm-reduction possible; proceed with the tail reduction 3461 q = p-lead(p); 3462 p = lead(p); 3463 if (q!=0) 3464 { 3465 p = p + lpNormalForm2(q,G,L); 3466 } 3467 return(p); 3468 } 3469 } 3470 // out of while when p==0 or p == const 3471 return(p); 3472 } 3473 3474 3360 3475 3361 3476 … … 3521 3636 // // interface 3522 3637 3523 // proc whichshift(poly p, int numvars)3638 // static proc whichshift(poly p, int numvars) 3524 3639 // { 3525 3640 // // numvars = number of vars of the orig free algebra … … 3538 3653 3539 3654 // LIB "qhmoduli.lib"; 3540 // proc polyshift(poly p, int numvars)3655 // static proc polyshift(poly p, int numvars) 3541 3656 // { 3542 3657 // poly q = p; int i = 0; … … 3615 3730 lpMultX(a,b); // seems to work properly 3616 3731 } 3732 3733 /* THE FOLLOWING ARE UNDER DEVELOPMENT 3734 // copied following from freegb_wrkcp.lib by Karim Abou Zeid on 07.04.2017: 3735 // makeLetterplaceRingElim(int d) 3736 // makeLetterplaceRingNDO(int d) 3737 // setLetterplaceAttributesElim(def R, int uptodeg, int lV) 3738 // lpElimIdeal(ideal I) 3739 // makeLetterplaceRingWt(int d, intvec W) 3740 3741 static proc makeLetterplaceRingElim(int d) 3742 "USAGE: makeLetterplaceRingElim(d); d integers 3743 RETURN: ring 3744 PURPOSE: creates a ring with an elimination ordering 3745 NOTE: the matrix for the ordering looks as follows: first row is 1,..,0,1,0,.. 3746 @* then 0,1,0,...,0,0,1,0... and so on, lastly its lp 3747 @* this ordering is only correct if only polys with same shift are compared 3748 EXAMPLE: example makeLetterplaceRingElim; shows examples 3749 " 3750 { 3751 3752 // ToDo future: inherit positive weights in the orig ring 3753 // complain on nonpositive ones 3754 3755 // d = up to degree, will be shifted to d+1 3756 if (d<1) {"bad d"; return(0);} 3757 3758 int uptodeg = d; int lV = nvars(basering); 3759 3760 int ppl = printlevel-voice+2; 3761 string err = ""; 3762 3763 int i,j,s; intvec iV,iVl; 3764 def save = basering; 3765 int D = d-1; 3766 list LR = ringlist(save); 3767 list L, tmp, tmp2, tmp3; 3768 L[1] = LR[1]; // ground field 3769 L[4] = LR[4]; // quotient ideal 3770 tmp = LR[2]; // varnames 3771 s = size(LR[2]); 3772 for (i=1; i<=D; i++) 3773 { 3774 for (j=1; j<=s; j++) 3775 { 3776 tmp[i*s+j] = string(tmp[j])+"("+string(i+1)+")"; 3777 } 3778 } 3779 for (i=1; i<=s; i++) 3780 { 3781 tmp[i] = string(tmp[i])+"("+string(1)+")"; 3782 } 3783 L[2] = tmp; 3784 L[3] = list(); 3785 list OrigNames = LR[2]; 3786 s = size(LR[3]); 3787 //creation of first block 3788 3789 if (s==2) 3790 { 3791 // not a blockord, 1 block + module ord 3792 tmp = LR[3][s]; // module ord 3793 for (i = 1; i <= lV; i++) 3794 { 3795 iV = (0: lV); 3796 iV[i] = 1; 3797 iVl = iV; 3798 for (j = 1; j <= D; j++) 3799 { iVl = iVl,iV; } 3800 L[3][i] = list("a",iVl); 3801 } 3802 // for (i=1; i<=d; i++) 3803 // { 3804 // LR[3][s-1+i] = LR[3][1]; 3805 // } 3806 // LR[3][s+D] = tmp; 3807 //iV = (1:(d*lV)); 3808 L[3][lV+1] = list("lp",(1:(d*lV))); 3809 L[3][lV+2] = tmp; 3810 } 3811 else {ERROR("Please set the ordering of basering to dp");} 3812 // if (s>2) 3813 // { 3814 // // there are s-1 blocks 3815 // int nb = s-1; 3816 // tmp = LR[3][s]; // module ord to place at the very end 3817 // tmp2 = LR[3]; tmp2 = tmp2[1..nb]; 3818 // LR[3][1] = list("a",LTO); 3819 // //tmp3[1] = list("a",intvec(1: int(d*lV))); // deg-ord, insert as the 1st 3820 // for (i=1; i<=d; i++) 3821 // { 3822 // tmp3 = tmp3 + tmp2; 3823 // } 3824 // tmp3 = tmp3 + list(tmp); 3825 // LR[3] = tmp3; 3826 // for (i=1; i<=d; i++) 3827 // { 3828 // for (j=1; j<=nb; j++) 3829 // { 3830 // // LR[3][i*nb+j+1]= LR[3][j]; 3831 // LR[3][i*nb+j+1]= tmp2[j]; 3832 // } 3833 // } 3834 // // size(LR[3]); 3835 // LR[3][(s-1)*d+2] = tmp; 3836 // LR[3] = list("a",intvec(1: int(d*lV))) + LR[3]; // deg-ord, insert as the 1st 3837 // remove everything behind nb*(D+1)+1 ? 3838 // tmp = LR[3]; 3839 // LR[3] = tmp[1..size(tmp)-1]; 3840 // } 3841 // L[3] = LR[3]; 3842 def @R = ring(L); 3843 // setring @R; 3844 // int uptodeg = d; int lV = nvars(basering); // were defined before 3845 def @@R = setLetterplaceAttributesElim(@R,uptodeg,lV); 3846 return (@@R); 3847 } 3848 example 3849 { 3850 "EXAMPLE:"; echo = 2; 3851 ring r = 0,(x,y,z),lp; 3852 def A = makeLetterplaceRingElim(2); 3853 setring A; 3854 A; 3855 attrib(A,"isLetterplaceRing"); 3856 attrib(A,"uptodeg"); // degree bound 3857 attrib(A,"lV"); // number of variables in the main block 3858 } 3859 3860 3861 3862 static proc makeLetterplaceRingNDO(int d) 3863 "USAGE: makeLetterplaceRingNDO(d); d an integer 3864 RETURN: ring 3865 PURPOSE: creates a ring with a non-degree first ordering, suitable for 3866 @* the use of non-homogeneous letterplace 3867 NOTE: the matrix for the ordering looks as follows: 3868 @* 'd' blocks of shifted original variables 3869 EXAMPLE: example makeLetterplaceRingNDO; shows examples 3870 " 3871 { 3872 3873 // ToDo future: inherit positive weights in the orig ring 3874 // complain on nonpositive ones 3875 3876 // d = up to degree, will be shifted to d+1 3877 if (d<1) {"bad d"; return(0);} 3878 3879 int uptodeg = d; int lV = nvars(basering); 3880 3881 int ppl = printlevel-voice+2; 3882 string err = ""; 3883 3884 int i,j,s; 3885 def save = basering; 3886 int D = d-1; 3887 list LR = ringlist(save); 3888 list L, tmp, tmp2, tmp3; 3889 L[1] = LR[1]; // ground field 3890 L[4] = LR[4]; // quotient ideal 3891 tmp = LR[2]; // varnames 3892 s = size(LR[2]); 3893 for (i=1; i<=D; i++) 3894 { 3895 for (j=1; j<=s; j++) 3896 { 3897 tmp[i*s+j] = string(tmp[j])+"("+string(i+1)+")"; 3898 } 3899 } 3900 for (i=1; i<=s; i++) 3901 { 3902 tmp[i] = string(tmp[i])+"("+string(1)+")"; 3903 } 3904 L[2] = tmp; 3905 list OrigNames = LR[2]; 3906 // ordering: one 1..1 a above 3907 // ordering: d blocks of the ord on r 3908 // try to get whether the ord on r is blockord itself 3909 // TODO: make L(2) ordering! exponent is maximally 2 3910 s = size(LR[3]); 3911 if (s==2) 3912 { 3913 // not a blockord, 1 block + module ord 3914 tmp = LR[3][s]; // module ord 3915 for (i=1; i<=d; i++) 3916 { 3917 LR[3][i] = LR[3][1]; 3918 } 3919 // LR[3][s+D] = tmp; 3920 LR[3][d+1] = tmp; 3921 //LR[3][1] = list("a",intvec(1: int(d*lV))); // deg-ord not wanted here 3922 } 3923 if (s>2) 3924 { 3925 // there are s-1 blocks 3926 int nb = s-1; 3927 tmp = LR[3][s]; // module ord to place at the very end 3928 tmp2 = LR[3]; tmp2 = tmp2[1..nb]; 3929 //tmp3[1] = list("a",intvec(1: int(d*lV))); // deg-ord not wanted here 3930 for (i=1; i<=d; i++) 3931 { 3932 tmp3 = tmp3 + tmp2; 3933 } 3934 tmp3 = tmp3 + list(tmp); 3935 LR[3] = tmp3; 3936 // for (i=1; i<=d; i++) 3937 // { 3938 // for (j=1; j<=nb; j++) 3939 // { 3940 // // LR[3][i*nb+j+1]= LR[3][j]; 3941 // LR[3][i*nb+j+1]= tmp2[j]; 3942 // } 3943 // } 3944 // // size(LR[3]); 3945 // LR[3][(s-1)*d+2] = tmp; 3946 // LR[3] = list("a",intvec(1: int(d*lV))) + LR[3]; // deg-ord, insert as the 1st 3947 // remove everything behind nb*(D+1)+1 ? 3948 // tmp = LR[3]; 3949 // LR[3] = tmp[1..size(tmp)-1]; 3950 } 3951 L[3] = LR[3]; 3952 def @R = ring(L); 3953 // setring @R; 3954 // int uptodeg = d; int lV = nvars(basering); // were defined before 3955 def @@R = setLetterplaceAttributes(@R,uptodeg,lV); 3956 return (@@R); 3957 } 3958 example 3959 { 3960 "EXAMPLE:"; echo = 2; 3961 ring r = 0,(x,y,z),lp; 3962 def A = makeLetterplaceRingNDO(2); 3963 setring A; 3964 A; 3965 attrib(A,"isLetterplaceRing"); 3966 attrib(A,"uptodeg"); // degree bound 3967 attrib(A,"lV"); // number of variables in the main block 3968 } 3969 3970 static proc setLetterplaceAttributesElim(def R, int uptodeg, int lV) 3971 "USAGE: setLetterplaceAttributesElim(R, d, b, eV); R a ring, b,d, eV integers 3972 RETURN: ring with special attributes set 3973 PURPOSE: sets attributes for a letterplace ring: 3974 @* 'isLetterplaceRing' = true, 'uptodeg' = d, 'lV' = b, 'eV' = eV, where 3975 @* 'uptodeg' stands for the degree bound, 3976 @* 'lV' for the number of variables in the block 0 3977 @* 'eV' for the number of elimination variables 3978 NOTE: Activate the resulting ring by using @code{setring} 3979 " 3980 { 3981 if (uptodeg*lV != nvars(R)) 3982 { 3983 ERROR("uptodeg and lV do not agree on the basering!"); 3984 } 3985 3986 3987 // Set letterplace-specific attributes for the output ring! 3988 attrib(R, "uptodeg", uptodeg); 3989 attrib(R, "lV", lV); 3990 attrib(R, "isLetterplaceRing", 1); 3991 attrib(R, "HasElimOrd", 1); 3992 return (R); 3993 } 3994 example 3995 { 3996 "EXAMPLE:"; echo = 2; 3997 ring r = 0,(x(1),y(1),x(2),y(2),x(3),y(3),x(4),y(4)),dp; 3998 def R = setLetterplaceAttributesElim(r, 4, 2, 1); setring R; 3999 attrib(R,"isLetterplaceRing"); 4000 lieBracket(x(1),y(1),2); 4001 } 4002 4003 4004 static proc lpElimIdeal(ideal I) 4005 " 4006 does not work for degree reasons (deg function does not work for lp rings -> newone!) 4007 " 4008 { 4009 def lpring = attrib(basering,"isLetterplaceRing"); 4010 def lpEO = attrib(basering,"HasElimOrd"); 4011 if ( typeof(lpring)!="int" && typeof(lpEO)!="int") 4012 { 4013 ERROR("Ring is not a lp-ring with an elimination ordering"); 4014 } 4015 4016 //int nE = attrib(basering, "eV"); 4017 4018 return(letplaceGBasis(I)); 4019 } 4020 4021 4022 static proc makeLetterplaceRingWt(int d, intvec W) 4023 "USAGE: makeLetterplaceRingWt(d,W); d an integer, W a vector of positive integers 4024 RETURN: ring 4025 PURPOSE: creates a ring with a special ordering, suitable for 4026 @* the use of non-homogeneous letterplace 4027 NOTE: the matrix for the ordering looks as follows: first row is W,W,W,... 4028 @* then there come 'd' blocks of shifted original variables 4029 EXAMPLE: example makeLetterplaceRing2; shows examples 4030 " 4031 { 4032 4033 // ToDo future: inherit positive weights in the orig ring 4034 // complain on nonpositive ones 4035 4036 // d = up to degree, will be shifted to d+1 4037 if (d<1) {"bad d"; return(0);} 4038 4039 int uptodeg = d; int lV = nvars(basering); 4040 4041 //check weightvector 4042 if (size(W) <> lV) {"bad weights"; return(0);} 4043 4044 int i; 4045 for (i = 1; i <= size(W); i++) {if (W[i] < 0) {"bad weights"; return(0);}} 4046 intvec Wt = W; 4047 for (i = 2; i <= d; i++) {Wt = Wt, W;} 4048 kill i; 4049 4050 int ppl = printlevel-voice+2; 4051 string err = ""; 4052 4053 int i,j,s; 4054 def save = basering; 4055 int D = d-1; 4056 list LR = ringlist(save); 4057 list L, tmp, tmp2, tmp3; 4058 L[1] = LR[1]; // ground field 4059 L[4] = LR[4]; // quotient ideal 4060 tmp = LR[2]; // varnames 4061 s = size(LR[2]); 4062 for (i=1; i<=D; i++) 4063 { 4064 for (j=1; j<=s; j++) 4065 { 4066 tmp[i*s+j] = string(tmp[j])+"("+string(i+1)+")"; 4067 } 4068 } 4069 for (i=1; i<=s; i++) 4070 { 4071 tmp[i] = string(tmp[i])+"("+string(1)+")"; 4072 } 4073 L[2] = tmp; 4074 list OrigNames = LR[2]; 4075 // ordering: one 1..1 a above 4076 // ordering: d blocks of the ord on r 4077 // try to get whether the ord on r is blockord itself 4078 // TODO: make L(2) ordering! exponent is maximally 2 4079 s = size(LR[3]); 4080 if (s==2) 4081 { 4082 // not a blockord, 1 block + module ord 4083 tmp = LR[3][s]; // module ord 4084 for (i=1; i<=d; i++) 4085 { 4086 LR[3][s-1+i] = LR[3][1]; 4087 } 4088 // LR[3][s+D] = tmp; 4089 LR[3][s+1+D] = tmp; 4090 LR[3][1] = list("a",Wt); // deg-ord 4091 } 4092 if (s>2) 4093 { 4094 // there are s-1 blocks 4095 int nb = s-1; 4096 tmp = LR[3][s]; // module ord to place at the very end 4097 tmp2 = LR[3]; tmp2 = tmp2[1..nb]; 4098 tmp3[1] = list("a",Wt); // deg-ord, insert as the 1st 4099 for (i=1; i<=d; i++) 4100 { 4101 tmp3 = tmp3 + tmp2; 4102 } 4103 tmp3 = tmp3 + list(tmp); 4104 LR[3] = tmp3; 4105 4106 } 4107 L[3] = LR[3]; 4108 def @R = ring(L); 4109 // setring @R; 4110 // int uptodeg = d; int lV = nvars(basering); // were defined before 4111 def @@R = setLetterplaceAttributes(@R,uptodeg,lV); 4112 return (@@R); 4113 } 4114 example 4115 { 4116 "EXAMPLE:"; echo = 2; 4117 ring r = 0,(x,y,z),(dp(1),dp(2)); 4118 def A = makeLetterplaceRingWt(2,intvec(1,2,3)); 4119 setring A; 4120 A; 4121 attrib(A,"isLetterplaceRing"); 4122 attrib(A,"uptodeg"); // degree bound 4123 attrib(A,"lV"); // number of variables in the main block 4124 } 4125 */ -
Singular/LIB/olga.lib
ra135fd rfbd9e6f 153 153 + " locData has to be defined")); 154 154 } 155 if (locType == 0) { // monoidal localizations 156 if (t != "list") { 155 if (locType == 0) 156 { // monoidal localizations 157 if (t != "list") 158 { 157 159 return(list(0, "for a monoidal localization, locData has to be of" 158 160 + " type list, but is of type " + t)); 159 } else { // locData is of type list 160 if (size(locData) == 0) { 161 } 162 else 163 { // locData is of type list 164 if (size(locData) == 0) 165 { 161 166 return(list(0, "for a monoidal localization, locData has to be" 162 167 + " a non-empty list")); 163 } else { // locData is of type list and has at least one entry 164 ideal listEntries; 165 for (i = 1; i <= size(locData); i++) { 168 } 169 else 170 { // locData is of type list and has at least one entry 171 if (defined(basering)) {ideal listEntries;} 172 for (i = 1; i <= size(locData); i++) 173 { 166 174 t = typeof(locData[i]); 167 if (t != "poly" && t != "int" && t != "number") { 175 if (t != "poly" && t != "int" && t != "number") 176 { 168 177 return(list(0, "for a monoidal localization, locData" 169 178 + " has to be a list of polys, ints or numbers, but" 170 179 + " entry " + string(i) + " is " + string(locData[i]) 171 180 + ", which is of type " + t)); 172 } else { 173 if (listEntries == 0) { 181 } 182 else 183 { 184 if (defined(basering)) 185 { 186 if (size(listEntries) == 0) 187 { 174 188 listEntries = locData[i]; 175 } else { 189 } 190 else 191 { 176 192 listEntries = listEntries, locData[i]; 177 193 } 194 } 178 195 } 179 196 } 180 197 // locData is of type list, has at least one entry and all 181 198 // entries are polys 182 if (!inducesCommutativeSubring(listEntries)) { 199 if (!defined(basering)) 200 { 183 201 return(list(0, "for a monoidal localization, the variables" 184 202 + " occurring in the polys in locData have to induce a" 185 203 + " commutative polynomial subring of basering")); 186 204 } 187 } 188 } 189 } 190 if (locType == 1) { // geometric localizations 205 if (!inducesCommutativeSubring(listEntries)) 206 { 207 return(list(0, "for a monoidal localization, the variables" 208 + " occurring in the polys in locData have to induce a" 209 + " commutative polynomial subring of basering")); 210 } 211 } 212 } 213 } 214 if (locType == 1) 215 { // geometric localizations 191 216 int n = nvars(basering) div 2; 192 if (2*n != nvars(basering)) { 217 if (2*n != nvars(basering)) 218 { 193 219 return(list(0, "for a geometric localization, basering has to have" 194 220 + " an even number of variables")); 195 } else { 221 } 222 else 223 { 196 224 int j; 197 for (i = 1; i <= n; i++) { 198 for (j = i + 1; j <= n; j++) { 199 if (var(i)*var(j) != var(j)*var(i)) { 225 for (i = 1; i <= n; i++) 226 { 227 for (j = i + 1; j <= n; j++) 228 { 229 if (var(i)*var(j) != var(j)*var(i)) 230 { 200 231 return(list(0, "for a geometric localization, the" 201 232 + " first half of the variables of basering has to" … … 206 237 } 207 238 } 208 if (t != "ideal") { 239 if (t != "ideal") 240 { 209 241 return(list(0, "for a geometric localization, locData has to be of" 210 242 + " type ideal, but is of type " + t)); 211 243 } 212 for (i = 1; i <= size(locData); i++) { 213 if (!polyVars(locData[i],1..n)) { 244 for (i = 1; i <= size(locData); i++) 245 { 246 if (!polyVars(locData[i],1..n)) 247 { 214 248 return(list(0, "for a geometric localization, locData has to" 215 249 + " be an ideal generated by polynomials containing only" … … 218 252 } 219 253 } 220 if (locType == 2) { // rational localizations 221 if (t != "intvec") { 254 if (locType == 2) 255 { // rational localizations 256 if (t != "intvec") 257 { 222 258 return(list(0, "for a rational localization, locData has to be of" 223 259 + " type intvec, but is of type " + t)); 224 } else { // locData is of type intvec 225 if(locData == 0) { 260 } 261 else 262 { // locData is of type intvec 263 if(locData == 0) 264 { 226 265 return(list(0, "for a rational localization, locData has to be" 227 266 + " a non-zero intvec")); 228 } else { // locData is of type intvec and not zero 229 if (!admissibleSub(locData)) { 267 } 268 else 269 { // locData is of type intvec and not zero 270 if (!admissibleSub(locData)) 271 { 230 272 return(list(0, "for a rational localization, the variables" 231 273 + " indexed by locData have to generate a sub-G-algebra" -
Singular/cntrlc.cc
ra135fd rfbd9e6f 36 36 #endif 37 37 38 #if defined(unix)39 38 #include <unistd.h> 40 39 #include <sys/types.h> … … 66 65 static void stack_trace (char *const*args); 67 66 #endif 68 #endif69 67 70 68 si_link pipeLastLink=NULL; … … 302 300 } 303 301 #endif /* __OPTIMIZE__ */ 304 #if defined(unix)305 302 #ifdef CALL_GDB 306 303 if (sig!=SIGINT) debug(STACK_TRACE); 307 304 #endif /* CALL_GDB */ 308 #endif /* unix */309 305 exit(0); 310 306 } … … 410 406 //} 411 407 412 #ifdef unix413 408 # ifndef __OPTIMIZE__ 414 409 volatile int si_stop_stack_trace_x; … … 565 560 566 561 # endif /* !__OPTIMIZE__ */ 567 #endif /* unix */568 562 569 563 /*2 -
Singular/extra.cc
ra135fd rfbd9e6f 278 278 else 279 279 /*==================== alarm ==================================*/ 280 #ifdef unix281 280 if(strcmp(sys_cmd,"alarm")==0) 282 281 { … … 296 295 } 297 296 else 298 #endif299 297 /*==================== cpu ==================================*/ 300 298 if(strcmp(sys_cmd,"cpu")==0) … … 3010 3008 if (strcmp(sys_cmd, "hilbroune") == 0) 3011 3009 { 3012 ideal I;3013 3010 if ((h!=NULL) && (h->Typ()==IDEAL_CMD)) 3014 3011 { 3015 I=(ideal)h->CopyD(); 3016 slicehilb(I); 3012 slicehilb((ideal)h->Data()); 3017 3013 } 3018 3014 else return TRUE; -
Singular/iparith.cc
ra135fd rfbd9e6f 2303 2303 intvec *module_w=(intvec*)atGet(u,"isHomog",INTVEC_CMD); 2304 2304 intvec *iv=hFirstSeries((ideal)u->Data(),module_w,currRing->qideal); 2305 if (errorreported) return TRUE; 2306 2305 2307 switch((int)(long)v->Data()) 2306 2308 { … … 5697 5699 intvec *module_w=(intvec *)atGet(u,"isHomog",INTVEC_CMD); 5698 5700 intvec *iv=hFirstSeries((ideal)u->Data(),module_w,currRing->qideal,wdegree); 5701 if (errorreported) return TRUE; 5702 5699 5703 switch((int)(long)v->Data()) 5700 5704 { -
Singular/libparse.h
ra135fd rfbd9e6f 98 98 99 99 # ifdef STANDALONE_PARSER 100 #ifndef unix101 extern FILE* myfopen(char *path, char *mode);102 extern size_t myfread(void *ptr, size_t size, size_t nmemb, FILE *stream);103 #else104 100 #define myfopen fopen 105 101 #define myfread fread 106 #endif107 102 # endif 108 103 -
Singular/singular-libs
ra135fd rfbd9e6f 47 47 methods.lib modnormal.lib modular.lib multigrading.lib modwalk.lib\ 48 48 JMBTest.lib JMSConst.lib \ 49 ncfrac.lib ncloc.lib ncModslimgb.lib\ 49 50 nfmodstd.lib nfmodsyz.lib numerAlg.lib numerDecom.lib \ 50 o rbitparam.lib \51 olga.lib orbitparam.lib \ 51 52 parallel.lib polyclass.lib polymake.lib polybori.lib \ 52 53 realclassify.lib realizationMatroids.lib resources.lib ringgb.lib \ -
Singular/svd/libs/amp.cpp
ra135fd rfbd9e6f 1 1 #include "svd_si.h" 2 #ifdef HAVE_SVD 2 3 3 4 /************************************************************************ … … 154 155 return ref->value; 155 156 } 157 #endif -
Singular/svd/libs/ap.cpp
ra135fd rfbd9e6f 1 1 #include "svd_si.h" 2 #ifdef HAVE_SVD 2 3 3 4 const double ap::machineepsilon = 5E-16; … … 178 179 return m1>m2 ? m2 : m1; 179 180 } 181 #endif -
Singular/svd_si.h
ra135fd rfbd9e6f 15 15 #include <math.h> 16 16 #include "resources/feFopen.h" 17 17 #include "kernel/mod2.h" 18 19 #ifdef HAVE_SVD 18 20 /******************************************************************** 19 21 Checking of the array boundaries mode. … … 1011 1013 1012 1014 1013 #endif1014 1015 1015 /* stuff included from libs/amp.h */ 1016 1017 #ifndef _AMP_R_H1018 #define _AMP_R_H1019 1016 1020 1017 #include <omalloc/omalloc.h> … … 2474 2471 } 2475 2472 2476 #endif2477 2478 2473 /* stuff included from ./reflections.h */ 2479 2474 … … 2516 2511 *************************************************************************/ 2517 2512 2518 #ifndef _reflections_h2519 #define _reflections_h2520 2521 2513 namespace reflections 2522 2514 { … … 2790 2782 } 2791 2783 } // namespace 2792 2793 #endif2794 2784 2795 2785 /* stuff included from ./bidiagonal.h */ … … 2832 2822 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2833 2823 *************************************************************************/ 2834 2835 #ifndef _bidiagonal_h2836 #define _bidiagonal_h2837 2824 2838 2825 namespace bidiagonal … … 4244 4231 } // namespace 4245 4232 4246 #endif4247 4248 4233 /* stuff included from ./qr.h */ 4249 4234 … … 4286 4271 *************************************************************************/ 4287 4272 4288 #ifndef _qr_h4289 #define _qr_h4290 4291 4273 namespace qr 4292 4274 { … … 4714 4696 } 4715 4697 } // namespace 4716 4717 #endif4718 4698 4719 4699 /* stuff included from ./lq.h */ … … 4751 4731 *************************************************************************/ 4752 4732 4753 #ifndef _lq_h4754 #define _lq_h4755 4756 4733 namespace lq 4757 4734 { … … 5170 5147 } 5171 5148 } // namespace 5172 5173 #endif5174 5149 5175 5150 /* stuff included from ./blas.h */ … … 5206 5181 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 5207 5182 *************************************************************************/ 5208 5209 #ifndef _blas_h5210 #define _blas_h5211 5183 5212 5184 namespace blas … … 5880 5852 } // namespace 5881 5853 5882 #endif5883 5884 5854 /* stuff included from ./rotations.h */ 5885 5855 … … 5922 5892 *************************************************************************/ 5923 5893 5924 #ifndef _rotations_h5925 #define _rotations_h5926 5927 5894 namespace rotations 5928 5895 { … … 6277 6244 } 6278 6245 } // namespace 6279 6280 #endif6281 6246 6282 6247 /* stuff included from ./bdsvd.h */ … … 6319 6284 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 6320 6285 *************************************************************************/ 6321 6322 #ifndef _bdsvd_h6323 #define _bdsvd_h6324 6286 6325 6287 namespace bdsvd … … 7667 7629 } // namespace 7668 7630 7669 #endif7670 7671 7631 /* stuff included from ./svd.h */ 7672 7632 … … 7702 7662 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 7703 7663 *************************************************************************/ 7704 7705 #ifndef _svd_h7706 #define _svd_h7707 7664 7708 7665 /*MAKEHEADER*/ … … 8331 8288 8332 8289 #endif 8333 8290 #endif 8291 -
doc/changes_in_singular4.texi
ra135fd rfbd9e6f 96 96 result of various computations (in particular Groebner bases). 97 97 98 @subsubheading New libraries depending on Singular 499 @cindex New libraries depending on Singular 4100 101 In Singular 4 there several new features are implemented within a102 dynamic module @code{syzextra.so}, not available in Singular 3.103 It implements the low-level functions for Schreyer resolutions and many auxiliary functions.104 The following new libraries @ref{deRham_lib}, @ref{schreyer_lib} depend on it:105 106 @c table @asis107 @itemize @bullet108 @item @ref{deRham_lib} - computes de Rham cohomology109 @item @ref{schreyer_lib} - computes Schreyer resolution via several approaches. It also serves as a high-level wrapper to the dynamic module @code{syzextra.so}110 @end itemize111 @c @end table112 113 98 @subsubheading Path names 114 99 @cindex Path names -
kernel/combinatorics/hilb.cc
ra135fd rfbd9e6f 111 111 memcpy(pon, pol, l * sizeof(int)); 112 112 if (l > x) 113 { 113 {/*pon[i] -= pol[i - x];*/ 114 114 for (i = x; i < l; i++) 115 pon[i] -= pol[i - x]; 115 { int64 t=pon[i]; 116 int64 t2=pol[i - x]; 117 t-=t2; 118 if ((t>=INT_MIN)&&(t<=INT_MAX)) pon[i]=t; 119 else if (!errorreported) WerrorS("int overflow in hilb 1"); 120 } 116 121 for (i = l; i < ln; i++) 117 pon[i] = -pol[i - x]; 122 { /*pon[i] = -pol[i - x];*/ 123 int64 t= -pol[i - x]; 124 if ((t>=INT_MIN)&&(t<=INT_MAX)) pon[i]=t; 125 else if (!errorreported) WerrorS("int overflow in hilb 2"); 126 } 118 127 } 119 128 else … … 130 139 { 131 140 int l = lp, x, i, j; 132 int *p, *pl; 141 int *pl; 142 int *p; 133 143 p = pol; 134 144 for (i = Nv; i>0; i--) … … 141 151 j = Q0[Nv + 1]; 142 152 for (i = 0; i < l; i++) 143 pl[i + j] += p[i]; 153 { /* pl[i + j] += p[i];*/ 154 int64 t=pl[i+j]; 155 int64 t2=p[i]; 156 t+=t2; 157 if ((t>=INT_MIN)&&(t<=INT_MAX)) pl[i+j]=t; 158 else if (!errorreported) WerrorS("int overflow in hilb 3"); 159 } 144 160 x = pure[var[1]]; 145 161 if (x!=0) … … 147 163 j += x; 148 164 for (i = 0; i < l; i++) 149 pl[i + j] -= p[i]; 165 { /* pl[i + j] -= p[i];*/ 166 int64 t=pl[i+j]; 167 int64 t2=p[i]; 168 t-=t2; 169 if ((t>=INT_MIN)&&(t<=INT_MAX)) pl[i+j]=t; 170 else if (!errorreported) WerrorS("int overflow in hilb 4"); 171 } 150 172 } 151 173 j += l; … … 264 286 265 287 //adds the new polynomial at the coresponding position 266 //and simplifies the ideal 267 static ideal SortByDeg_p(ideal I, poly p) 268 { 269 int i,j; 270 if((I == NULL) || (idIs0(I))) 271 { 272 ideal res = idInit(1,1); 273 res->m[0] = p; 274 return(res); 275 } 288 //and simplifies the ideal, destroys p 289 static void SortByDeg_p(ideal I, poly p) 290 { 291 int i,j; 292 if(idIs0(I)) 293 { 294 I->m[0] = p; 295 return; 296 } 297 idSkipZeroes(I); 298 #if 1 299 for(i = 0; (i<IDELEMS(I)) && (p_Totaldegree(I->m[i],currRing)<=p_Totaldegree(p,currRing)); i++) 300 { 301 if(p_DivisibleBy( I->m[i],p, currRing)) 302 { 303 p_Delete(&p,currRing); 304 return; 305 } 306 } 307 for(i = IDELEMS(I)-1; (i>=0) && (p_Totaldegree(I->m[i],currRing)>=p_Totaldegree(p,currRing)); i--) 308 { 309 if(p_DivisibleBy(p,I->m[i], currRing)) 310 { 311 p_Delete(&I->m[i],currRing); 312 } 313 } 314 if(idIs0(I)) 315 { 276 316 idSkipZeroes(I); 277 #if 1 278 for(i = 0; (i<IDELEMS(I)) && (p_Totaldegree(I->m[i],currRing)<=p_Totaldegree(p,currRing)); i++) 279 { 280 if(p_DivisibleBy( I->m[i],p, currRing)) 281 { 282 return(I); 283 } 284 } 285 for(i = IDELEMS(I)-1; (i>=0) && (p_Totaldegree(I->m[i],currRing)>=p_Totaldegree(p,currRing)); i--) 286 { 287 if(p_DivisibleBy(p,I->m[i], currRing)) 288 { 289 I->m[i] = NULL; 290 } 291 } 292 if(idIs0(I)) 293 { 294 idSkipZeroes(I); 295 I->m[0] = p; 296 return(I); 297 } 298 #endif 317 I->m[0] = p; 318 return; 319 } 320 #endif 321 idSkipZeroes(I); 322 //First I take the case when all generators have the same degree 323 if(p_Totaldegree(I->m[0],currRing) == p_Totaldegree(I->m[IDELEMS(I)-1],currRing)) 324 { 325 if(p_Totaldegree(p,currRing)<p_Totaldegree(I->m[0],currRing)) 326 { 327 idInsertPoly(I,p); 328 idSkipZeroes(I); 329 for(i=IDELEMS(I)-1;i>=1; i--) 330 { 331 I->m[i] = I->m[i-1]; 332 } 333 I->m[0] = p; 334 return; 335 } 336 if(p_Totaldegree(p,currRing)>=p_Totaldegree(I->m[IDELEMS(I)-1],currRing)) 337 { 338 idInsertPoly(I,p); 339 idSkipZeroes(I); 340 return; 341 } 342 } 343 if(p_Totaldegree(p,currRing)<=p_Totaldegree(I->m[0],currRing)) 344 { 345 idInsertPoly(I,p); 299 346 idSkipZeroes(I); 300 //First I take the case when all generators have the same degree 301 if(p_Totaldegree(I->m[0],currRing) == p_Totaldegree(I->m[IDELEMS(I)-1],currRing)) 302 { 303 if(p_Totaldegree(p,currRing)<p_Totaldegree(I->m[0],currRing)) 304 { 305 idInsertPoly(I,p); 306 idSkipZeroes(I); 307 for(i=IDELEMS(I)-1;i>=1; i--) 308 { 309 I->m[i] = I->m[i-1]; 310 } 311 I->m[0] = p; 312 return(I); 313 } 314 if(p_Totaldegree(p,currRing)>=p_Totaldegree(I->m[IDELEMS(I)-1],currRing)) 315 { 316 idInsertPoly(I,p); 317 idSkipZeroes(I); 318 return(I); 319 } 320 } 321 if(p_Totaldegree(p,currRing)<=p_Totaldegree(I->m[0],currRing)) 322 { 323 idInsertPoly(I,p); 324 idSkipZeroes(I); 325 for(i=IDELEMS(I)-1;i>=1; i--) 326 { 327 I->m[i] = I->m[i-1]; 328 } 329 I->m[0] = p; 330 return(I); 331 } 332 if(p_Totaldegree(p,currRing)>=p_Totaldegree(I->m[IDELEMS(I)-1],currRing)) 333 { 334 idInsertPoly(I,p); 335 idSkipZeroes(I); 336 return(I); 337 } 338 for(i = IDELEMS(I)-2; ;) 339 { 340 if(p_Totaldegree(p,currRing)==p_Totaldegree(I->m[i],currRing)) 341 { 342 idInsertPoly(I,p); 343 idSkipZeroes(I); 344 for(j = IDELEMS(I)-1; j>=i+1;j--) 345 { 346 I->m[j] = I->m[j-1]; 347 } 348 I->m[i] = p; 349 return(I); 350 } 351 if(p_Totaldegree(p,currRing)>p_Totaldegree(I->m[i],currRing)) 352 { 353 idInsertPoly(I,p); 354 idSkipZeroes(I); 355 for(j = IDELEMS(I)-1; j>=i+2;j--) 356 { 357 I->m[j] = I->m[j-1]; 358 } 359 I->m[i+1] = p; 360 return(I); 361 } 362 i--; 363 } 347 for(i=IDELEMS(I)-1;i>=1; i--) 348 { 349 I->m[i] = I->m[i-1]; 350 } 351 I->m[0] = p; 352 return; 353 } 354 if(p_Totaldegree(p,currRing)>=p_Totaldegree(I->m[IDELEMS(I)-1],currRing)) 355 { 356 idInsertPoly(I,p); 357 idSkipZeroes(I); 358 return; 359 } 360 for(i = IDELEMS(I)-2; ;) 361 { 362 if(p_Totaldegree(p,currRing)==p_Totaldegree(I->m[i],currRing)) 363 { 364 idInsertPoly(I,p); 365 idSkipZeroes(I); 366 for(j = IDELEMS(I)-1; j>=i+1;j--) 367 { 368 I->m[j] = I->m[j-1]; 369 } 370 I->m[i] = p; 371 return; 372 } 373 if(p_Totaldegree(p,currRing)>p_Totaldegree(I->m[i],currRing)) 374 { 375 idInsertPoly(I,p); 376 idSkipZeroes(I); 377 for(j = IDELEMS(I)-1; j>=i+2;j--) 378 { 379 I->m[j] = I->m[j-1]; 380 } 381 I->m[i+1] = p; 382 return; 383 } 384 i--; 385 } 364 386 } 365 387 … … 367 389 static ideal SortByDeg(ideal I) 368 390 { 369 370 371 return(I);372 373 374 375 376 377 res->m[0] = poly(0);378 for(i = 0; i<=IDELEMS(I)-1;i++)379 {380 res = SortByDeg_p(res, I->m[i]);381 382 383 384 391 if(idIs0(I)) 392 { 393 return id_Copy(I,currRing); 394 } 395 int i; 396 ideal res; 397 idSkipZeroes(I); 398 res = idInit(1,1); 399 for(i = 0; i<=IDELEMS(I)-1;i++) 400 { 401 SortByDeg_p(res, I->m[i]); 402 I->m[i]=NULL; // I->m[i] is now in res 403 } 404 idSkipZeroes(res); 405 //idDegSortTest(res); 406 return(res); 385 407 } 386 408 … … 390 412 if(idIs0(Iorig)) 391 413 { 392 393 394 414 ideal res = idInit(1,1); 415 res->m[0] = poly(0); 416 return(res); 395 417 } 396 418 if(idIs0(p)) 397 419 { 398 399 400 401 } 402 ideal I = id Copy(Iorig);420 ideal res = idInit(1,1); 421 res->m[0] = pOne(); 422 return(res); 423 } 424 ideal I = id_Head(Iorig,currRing); 403 425 ideal res = idInit(IDELEMS(I),1); 404 426 int i,j; … … 406 428 for(i = 0; i<IDELEMS(I); i++) 407 429 { 408 res->m[i] = p_Copy(I->m[i], currRing);409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 res->m[i] = NULL; // pDelete428 429 430 431 I->m[i] = NULL; // pDelete432 430 res->m[i] = p_Head(I->m[i], currRing); 431 for(j = 1; (j<=currRing->N) ; j++) 432 { 433 dummy = p_GetExp(p->m[0], j, currRing); 434 if(dummy > 0) 435 { 436 if(p_GetExp(I->m[i], j, currRing) < dummy) 437 { 438 p_SetExp(res->m[i], j, 0, currRing); 439 } 440 else 441 { 442 p_SetExp(res->m[i], j, p_GetExp(I->m[i], j, currRing) - dummy, currRing); 443 } 444 } 445 } 446 p_Setm(res->m[i], currRing); 447 if(p_Totaldegree(res->m[i],currRing) == p_Totaldegree(I->m[i],currRing)) 448 { 449 p_Delete(&res->m[i],currRing); 450 } 451 else 452 { 453 p_Delete(&I->m[i],currRing); 454 } 433 455 } 434 456 idSkipZeroes(res); … … 438 460 for(i = 0; i<=IDELEMS(res)-1; i++) 439 461 { 440 I = SortByDeg_p(I,res->m[i]); 441 } 442 } 462 SortByDeg_p(I,res->m[i]); 463 res->m[i]=NULL; // is now in I 464 } 465 } 466 id_Delete(&res,currRing); 443 467 //idDegSortTest(I); 444 468 return(I); … … 446 470 447 471 //id_Add for monomials 448 static ideal idAddMon(ideal I, ideal p) 449 { 450 #if 1 451 I = SortByDeg_p(I,p->m[0]); 452 #else 453 I = id_Add(I,p,currRing); 454 #endif 455 //idSkipZeroes(I); 456 return(I); 472 static void idAddMon(ideal I, ideal p) 473 { 474 SortByDeg_p(I,p->m[0]); 475 p->m[0]=NULL; // is now in I 476 //idSkipZeroes(I); 457 477 } 458 478 … … 686 706 static poly ChoosePJL(ideal I) 687 707 { 708 int i,j,dummy; 709 bool flag = TRUE; 710 poly m = p_ISet(1,currRing); 711 for(i = IDELEMS(I)-1;(i>=0) && (flag);i--) 712 { 713 flag = TRUE; 714 for(j=1;(j<=currRing->N) && (flag);j++) 715 { 716 dummy = p_GetExp(I->m[i],j,currRing); 717 if(dummy >= 2) 718 { 719 p_SetExp(m,j,dummy-1,currRing); 720 p_Setm(m,currRing); 721 flag = FALSE; 722 } 723 } 724 if(!p_IsOne(m, currRing)) 725 { 726 return(m); 727 } 728 } 729 p_Delete(&m,currRing); 730 m = ChoosePVar(I); 731 return(m); 732 } 733 734 #if 0 735 //choice JF: last entry just variable with power -1 (xy10z15 -> y9) 736 static poly ChoosePJF(ideal I) 737 { 688 738 int i,j,dummy; 689 739 bool flag = TRUE; 690 740 poly m = p_ISet(1,currRing); 691 for(i = IDELEMS(I)-1;(i>=0) && (flag);i--)741 for(i = 0;(i<=IDELEMS(I)-1) && (flag);i++) 692 742 { 693 743 flag = TRUE; … … 710 760 return(m); 711 761 } 712 713 #if 0714 //choice JF: last entry just variable with power -1 (xy10z15 -> y9)715 static poly ChoosePJF(ideal I)716 {717 int i,j,dummy;718 bool flag = TRUE;719 poly m = p_ISet(1,currRing);720 for(i = 0;(i<=IDELEMS(I)-1) && (flag);i++)721 {722 flag = TRUE;723 for(j=1;(j<=currRing->N) && (flag);j++)724 {725 dummy = p_GetExp(I->m[i],j,currRing);726 if(dummy >= 2)727 {728 p_SetExp(m,j,dummy-1,currRing);729 p_Setm(m,currRing);730 flag = FALSE;731 }732 }733 if(!p_IsOne(m, currRing))734 {735 return(m);736 }737 }738 m = ChoosePVar(I);739 return(m);740 }741 762 #endif 742 763 … … 744 765 static poly ChooseP(ideal I) 745 766 { 746 747 748 749 750 751 752 753 754 755 756 767 poly m; 768 // TEST TO SEE WHICH ONE IS BETTER 769 //m = ChoosePXL(I); 770 //m = ChoosePXF(I); 771 //m = ChoosePOL(I); 772 //m = ChoosePOF(I); 773 //m = ChoosePVL(I); 774 //m = ChoosePVF(I); 775 m = ChoosePJL(I); 776 //m = ChoosePJF(I); 777 return(m); 757 778 } 758 779 … … 822 843 if(JustVar(I) == TRUE) 823 844 { 824 825 826 827 828 {mpz_set_ui(dummy, 1);}829 830 {mpz_set_si(dummy, -1);}831 832 }833 //mpz_clear(dummy);834 845 if(IDELEMS(I) == variables) 846 { 847 mpz_init(dummy); 848 if((variables % 2) == 0) 849 mpz_set_ui(dummy, 1); 850 else 851 mpz_set_si(dummy, -1); 852 mpz_add(ec, ec, dummy); 853 mpz_clear(dummy); 854 } 855 return; 835 856 } 836 857 ideal p = idInit(1,1); … … 845 866 for(i = 1;i<=currRing->N;i++) 846 867 { 847 848 849 850 868 if(p_GetExp(p->m[0],i,currRing)>0) 869 { 870 howmanyvarinp++; 871 } 851 872 } 852 873 eulerchar(Ip, variables-howmanyvarinp, ec); 853 874 id_Delete(&Ip, currRing); 854 I = idAddMon(I,p); 875 idAddMon(I,p); 876 id_Delete(&p, currRing); 855 877 } 856 878 } … … 888 910 static bool IsIn(poly p, ideal I) 889 911 { 890 //assumes that I is ordered by degree 891 if(idIs0(I)) 892 { 893 if(p==poly(0)) 894 { 895 return(TRUE); 896 } 897 else 898 { 899 return(FALSE); 900 } 901 } 912 //assumes that I is ordered by degree 913 if(idIs0(I)) 914 { 902 915 if(p==poly(0)) 903 916 { 904 return(FALSE); 905 } 906 int i,j; 907 bool flag; 908 for(i = 0;i<IDELEMS(I);i++) 909 { 910 flag = TRUE; 911 for(j = 1;(j<=currRing->N) &&(flag);j++) 912 { 913 if(p_GetExp(p, j, currRing)<p_GetExp(I->m[i], j, currRing)) 914 { 915 flag = FALSE; 916 } 917 } 918 if(flag) 919 { 920 return(TRUE); 921 } 922 } 917 return(TRUE); 918 } 919 else 920 { 921 return(FALSE); 922 } 923 } 924 if(p==poly(0)) 925 { 923 926 return(FALSE); 927 } 928 int i,j; 929 bool flag; 930 for(i = 0;i<IDELEMS(I);i++) 931 { 932 flag = TRUE; 933 for(j = 1;(j<=currRing->N) &&(flag);j++) 934 { 935 if(p_GetExp(p, j, currRing)<p_GetExp(I->m[i], j, currRing)) 936 { 937 flag = FALSE; 938 } 939 } 940 if(flag) 941 { 942 return(TRUE); 943 } 944 } 945 return(FALSE); 924 946 } 925 947 … … 927 949 static poly LCMmon(ideal I) 928 950 { 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 951 if(idIs0(I)) 952 { 953 return(NULL); 954 } 955 poly m; 956 int dummy,i,j; 957 m = p_ISet(1,currRing); 958 for(i=1;i<=currRing->N;i++) 959 { 960 dummy=0; 961 for(j=IDELEMS(I)-1;j>=0;j--) 962 { 963 if(p_GetExp(I->m[j],i,currRing) > dummy) 964 { 965 dummy = p_GetExp(I->m[j],i,currRing); 966 } 967 } 968 p_SetExp(m,i,dummy,currRing); 969 } 970 p_Setm(m,currRing); 971 return(m); 950 972 } 951 973 … … 964 986 for(i=IDELEMS(S)-1;i>=0;i--) 965 987 { 966 967 968 S->m[i]=NULL;969 970 988 if(IsIn(S->m[i],I)) 989 { 990 p_Delete(&S->m[i],currRing); 991 prune++; 992 } 971 993 } 972 994 idSkipZeroes(S); … … 974 996 for(i=IDELEMS(I)-1;i>=0;i--) 975 997 { 976 m = p_Copy(I->m[i],currRing); 977 for(j=1;j<=currRing->N;j++) 978 { 979 dummy = p_GetExp(m,j,currRing); 980 if(dummy > 0) 981 { 982 p_SetExp(m,j,dummy-1,currRing); 983 } 984 } 985 p_Setm(m, currRing); 986 if(IsIn(m,S)) 987 { 988 I->m[i]=NULL; 989 //printf("\n Deleted, since pi(m) is in S\n");pWrite(m); 990 } 998 m = p_Head(I->m[i],currRing); 999 for(j=1;j<=currRing->N;j++) 1000 { 1001 dummy = p_GetExp(m,j,currRing); 1002 if(dummy > 0) 1003 { 1004 p_SetExp(m,j,dummy-1,currRing); 1005 } 1006 } 1007 p_Setm(m, currRing); 1008 if(IsIn(m,S)) 1009 { 1010 p_Delete(&I->m[i],currRing); 1011 //printf("\n Deleted, since pi(m) is in S\n");pWrite(m); 1012 } 1013 p_Delete(&m,currRing); 991 1014 } 992 1015 idSkipZeroes(I); … … 995 1018 if(m != NULL) 996 1019 { 997 for(i=0;i<IDELEMS(S);i++) 998 { 999 if(!(p_DivisibleBy(S->m[i], m, currRing))) 1000 { 1001 S->m[i] = NULL; 1002 j++; 1003 moreprune++; 1004 } 1005 else 1006 { 1007 if(pLmEqual(S->m[i],m)) 1008 { 1009 S->m[i] = NULL; 1010 moreprune++; 1011 } 1012 } 1013 } 1014 idSkipZeroes(S); 1015 } 1020 for(i=0;i<IDELEMS(S);i++) 1021 { 1022 if(!(p_DivisibleBy(S->m[i], m, currRing))) 1023 { 1024 S->m[i] = NULL; 1025 j++; 1026 moreprune++; 1027 } 1028 else 1029 { 1030 if(pLmEqual(S->m[i],m)) 1031 { 1032 S->m[i] = NULL; 1033 moreprune++; 1034 } 1035 } 1036 } 1037 idSkipZeroes(S); 1038 } 1039 p_Delete(&m,currRing); 1016 1040 /*printf("\n---------------------------\n"); 1017 1041 printf("\n I\n");idPrint(I); … … 1022 1046 if(idIs0(I)) 1023 1047 { 1024 id_Delete(&I, currRing); 1025 id_Delete(&S, currRing); 1026 p_Delete(&m, currRing); 1027 break; 1048 id_Delete(&I, currRing); 1049 id_Delete(&S, currRing); 1050 break; 1028 1051 } 1029 1052 m = LCMmon(I); 1030 1053 if(!p_DivisibleBy(x,m, currRing)) 1031 1054 { 1032 //printf("\nx does not divide lcm(I)"); 1033 //printf("\nEmpty set");pWrite(q); 1034 id_Delete(&I, currRing); 1035 id_Delete(&S, currRing); 1036 p_Delete(&m, currRing); 1037 break; 1038 } 1055 //printf("\nx does not divide lcm(I)"); 1056 //printf("\nEmpty set");pWrite(q); 1057 id_Delete(&I, currRing); 1058 id_Delete(&S, currRing); 1059 p_Delete(&m, currRing); 1060 break; 1061 } 1062 p_Delete(&m, currRing); 1039 1063 m = SqFree(I); 1040 1064 if(m==NULL) 1041 1065 { 1042 //printf("\n Corner: "); 1043 //pWrite(q); 1044 //printf("\n With the facets of the dual simplex:\n"); 1045 //idPrint(I); 1046 mpz_t ec; 1047 mpz_init(ec); 1048 mpz_ptr ec_ptr = ec; 1049 eulerchar(I, currRing->N, ec_ptr); 1050 bool flag = FALSE; 1051 if(NNN==0) 1052 { 1053 hilbertcoef = (mpz_ptr)omAlloc((NNN+1)*sizeof(mpz_t)); 1054 hilbpower = (int*)omAlloc((NNN+1)*sizeof(int)); 1055 mpz_init( &hilbertcoef[NNN]); 1056 mpz_set( &hilbertcoef[NNN], ec); 1057 mpz_clear(ec); 1058 hilbpower[NNN] = p_Totaldegree(q,currRing); 1059 NNN++; 1060 } 1061 else 1062 { 1063 //I look if the power appears already 1064 for(i = 0;(i<NNN)&&(flag == FALSE)&&(p_Totaldegree(q,currRing)>=hilbpower[i]);i++) 1065 { 1066 if((hilbpower[i]) == (p_Totaldegree(q,currRing))) 1067 { 1068 flag = TRUE; 1069 mpz_add(&hilbertcoef[i],&hilbertcoef[i],ec_ptr); 1070 } 1071 } 1072 if(flag == FALSE) 1073 { 1074 hilbertcoef = (mpz_ptr)omRealloc(hilbertcoef, (NNN+1)*sizeof(mpz_t)); 1075 hilbpower = (int*)omRealloc(hilbpower, (NNN+1)*sizeof(int)); 1076 mpz_init(&hilbertcoef[NNN]); 1077 for(j = NNN; j>i; j--) 1078 { 1079 mpz_set(&hilbertcoef[j],&hilbertcoef[j-1]); 1080 hilbpower[j] = hilbpower[j-1]; 1081 } 1082 mpz_set( &hilbertcoef[i], ec); 1083 mpz_clear(ec); 1084 hilbpower[i] = p_Totaldegree(q,currRing); 1085 NNN++; 1086 } 1087 } 1088 break; 1089 } 1066 //printf("\n Corner: "); 1067 //pWrite(q); 1068 //printf("\n With the facets of the dual simplex:\n"); 1069 //idPrint(I); 1070 mpz_t ec; 1071 mpz_init(ec); 1072 mpz_ptr ec_ptr = ec; 1073 eulerchar(I, currRing->N, ec_ptr); 1074 bool flag = FALSE; 1075 if(NNN==0) 1076 { 1077 hilbertcoef = (mpz_ptr)omAlloc((NNN+1)*sizeof(mpz_t)); 1078 hilbpower = (int*)omAlloc((NNN+1)*sizeof(int)); 1079 mpz_init_set( &hilbertcoef[NNN], ec); 1080 hilbpower[NNN] = p_Totaldegree(q,currRing); 1081 NNN++; 1082 } 1083 else 1084 { 1085 //I look if the power appears already 1086 for(i = 0;(i<NNN)&&(flag == FALSE)&&(p_Totaldegree(q,currRing)>=hilbpower[i]);i++) 1087 { 1088 if((hilbpower[i]) == (p_Totaldegree(q,currRing))) 1089 { 1090 flag = TRUE; 1091 mpz_add(&hilbertcoef[i],&hilbertcoef[i],ec_ptr); 1092 } 1093 } 1094 if(flag == FALSE) 1095 { 1096 hilbertcoef = (mpz_ptr)omRealloc(hilbertcoef, (NNN+1)*sizeof(mpz_t)); 1097 hilbpower = (int*)omRealloc(hilbpower, (NNN+1)*sizeof(int)); 1098 mpz_init(&hilbertcoef[NNN]); 1099 for(j = NNN; j>i; j--) 1100 { 1101 mpz_set(&hilbertcoef[j],&hilbertcoef[j-1]); 1102 hilbpower[j] = hilbpower[j-1]; 1103 } 1104 mpz_set( &hilbertcoef[i], ec); 1105 hilbpower[i] = p_Totaldegree(q,currRing); 1106 NNN++; 1107 } 1108 } 1109 mpz_clear(ec); 1110 id_Delete(&I, currRing); 1111 id_Delete(&S, currRing); 1112 break; 1113 } 1114 else 1115 p_Delete(&m, currRing); 1090 1116 m = ChooseP(I); 1091 1117 p = idInit(1,1); … … 1095 1121 poly pq = pp_Mult_mm(q,m,currRing); 1096 1122 rouneslice(Ip, Sp, pq, x, prune, moreprune, steps, NNN, hilbertcoef,hilbpower); 1097 //id_Delete(&Ip, currRing); 1098 //id_Delete(&Sp, currRing); 1099 S = idAddMon(S,p); 1123 idAddMon(S,p); 1100 1124 p->m[0]=NULL; 1101 1125 id_Delete(&p, currRing); // p->m[0] was also in S … … 1113 1137 int *hilbpower; 1114 1138 ideal S = idInit(1,1); 1115 poly q = p_ ISet(1,currRing);1139 poly q = p_One(currRing); 1116 1140 ideal X = idInit(1,1); 1117 1141 X->m[0]=p_One(currRing); 1118 1142 for(i=1;i<=currRing->N;i++) 1119 1143 { 1120 1144 p_SetExp(X->m[0],i,1,currRing); 1121 1145 } 1122 1146 p_Setm(X->m[0],currRing); 1123 1147 I = id_Mult(I,X,currRing); 1124 I = SortByDeg(I); 1148 ideal Itmp = SortByDeg(I); 1149 id_Delete(&I,currRing); 1150 I = Itmp; 1125 1151 //printf("\n-------------RouneSlice--------------\n"); 1126 1152 rouneslice(I,S,q,X->m[0],prune, moreprune, steps, NNN, hilbertcoef, hilbpower); 1153 id_Delete(&X,currRing); 1154 p_Delete(&q,currRing); 1127 1155 //printf("\nIn total Prune got rid of %i elements\n",prune); 1128 1156 //printf("\nIn total More Prune got rid of %i elements\n",moreprune); 1129 1157 //printf("\nSteps of rouneslice: %i\n\n", steps); 1130 mpz_t coefhilb;1131 mpz_t dummy;1132 mpz_init(coefhilb);1133 mpz_init(dummy);1134 1158 printf("\n// %8d t^0",1); 1135 1159 for(i = 0; i<NNN; i++) 1136 1160 { 1137 if(mpz_sgn(&hilbertcoef[i])!=0) 1138 { 1139 gmp_printf("\n// %8Zd t^%d",&hilbertcoef[i],hilbpower[i]); 1140 } 1141 } 1161 if(mpz_sgn(&hilbertcoef[i])!=0) 1162 { 1163 gmp_printf("\n// %8Zd t^%d",&hilbertcoef[i],hilbpower[i]); 1164 } 1165 } 1166 PrintLn(); 1142 1167 omFreeSize(hilbertcoef, (NNN)*sizeof(mpz_t)); 1143 1168 omFreeSize(hilbpower, (NNN)*sizeof(int)); … … 1320 1345 { 1321 1346 intvec *work, *hseries2; 1322 int i, j, k, s, t, l; 1347 int i, j, k, t, l; 1348 int s; 1323 1349 if (hseries1 == NULL) 1324 1350 return NULL; … … 1353 1379 void hDegreeSeries(intvec *s1, intvec *s2, int *co, int *mu) 1354 1380 { 1355 int m, i, j, k; 1381 int i, j, k; 1382 int m; 1356 1383 *co = *mu = 0; 1357 1384 if ((s1 == NULL) || (s2 == NULL)) … … 1393 1420 1394 1421 intvec *hseries1 = hFirstSeries(S, modulweight, Q, wdegree, tailRing); 1422 if (errorreported) return; 1395 1423 1396 1424 hPrintHilb(hseries1); -
libpolys/polys/monomials/p_polys.h
ra135fd rfbd9e6f 1524 1524 } 1525 1525 const long* _ordsgn = (long*) r->ordsgn; 1526 #if 1 /* two variants*/ 1526 1527 if (_v1 > _v2) 1527 1528 { 1528 if (_ordsgn[_i] == 1) return 1; 1529 return -1; 1530 } 1531 if (_ordsgn[_i] == 1) return -1; 1532 return 1; 1533 1529 return _ordsgn[_i]; 1530 } 1531 return -(_ordsgn[_i]); 1532 #else 1533 if (_v1 > _v2) 1534 { 1535 if (_ordsgn[_i] == 1) return 1; 1536 return -1; 1537 } 1538 if (_ordsgn[_i] == 1) return -1; 1539 return 1; 1540 #endif 1534 1541 } 1535 1542 -
omalloc/omAllocSystem.c
ra135fd rfbd9e6f 33 33 #define _omSizeOfLargeAddr(addr) (malloc_size(addr)) 34 34 #elif defined(HAVE_MALLOC_USABLE_SIZE) 35 #include < malloc.h>35 #include <stdlib.h> 36 36 #define _omSizeOfLargeAddr(addr) (malloc_usable_size(addr)) 37 37 #else -
omalloc/omMallocSystem.h
ra135fd rfbd9e6f 20 20 #elif (defined(HAVE_MALLOC_USABLE_SIZE)) 21 21 /* and this will work under Linux */ 22 #include < malloc.h>22 #include <stdlib.h> 23 23 #define OM_MALLOC_SIZEOF_ADDR(addr) (malloc_usable_size(addr)) 24 24 #else
Note: See TracChangeset
for help on using the changeset viewer.