Changeset 07f26d9 in git
- Timestamp:
- Mar 14, 2015, 2:02:40 PM (9 years ago)
- Branches:
- (u'spielwiese', '17f1d200f27c5bd38f5dfc6e8a0879242279d1d8')
- Children:
- 7ac345d70f100052b380e98c709e64d80552d9ea
- Parents:
- 2a413dd9aa8d8ec395a5eaebe7c9991725f19aa0
- git-author:
- Oleksandr Motsak <motsak@mathematik.uni-kl.de>2015-03-14 14:02:40+01:00
- git-committer:
- Oleksandr Motsak <motsak@mathematik.uni-kl.de>2015-03-14 18:05:19+01:00
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/gradedModules.lib
r2a413d r07f26d9 38 38 grtranspose1(M) reordered graded transpose of map M 39 39 TestGRRes(n,I) compute/order/transpose a graded resolution of ideal I 40 grsyz(M) syzygy. gens! 41 grres(M) resolution. gens! 42 grlift(A,B) graded lift, gens! 43 grgroebner(M) groebner. gens! 44 grconcat(M,N) sum of maps into the same target module 40 45 "; 41 46 42 43 47 // TODOs: 44 // grrndmat(s,d[,p,b]) generate random matrix compatible with src and dst gradings 45 // grrndmap(S,D[,p,b]) generate random 0-deg homomorphism S -> D 46 47 // grsyz(M) gens? vs coker? 48 // grres(M) gens? vs coker? 49 // grgroebner(M) gens? vs coker? 50 48 /* 49 KeneshlouMatrixPresentation(v) build some presentation with intvec v 50 grrndmat0(s,d[,p,b]) generate random matrix compatible with src and dst gradings 51 grrndmap0(S,D[,p,b]) generate random 0-deg homomorphism S -> D 52 grrndmap(S,D[,p,b]) generate random 0-deg homomorphism S -> D 53 grrndmap2(S,D[,p,b]) generate random 0-deg homomorphism S -> D 54 grlifting(A,B) RANDOM! chain lifting 55 grlifting2(A,B) RANDOM! chain lifting 56 mappingcone(M,N) mapping cone? 57 mappingcone2(M,N) mapping cone? 58 */ 51 59 52 60 ////////////////////////////////////////////////////////////////////////////////////////////////////////// … … 935 943 } 936 944 945 proc grgroebner(A) 946 "USAGE: grgroebner(M), graded object M 947 RETURN: graded object 948 PURPOSE: compute graded groebner basis of M 949 EXAMPLE: example grgroebner; shows an example 950 " 951 { 952 ASSUME(1, grtest(A)); 953 954 return ( grobj( groebner(A), attrib(A, "isHomog") ) ); 955 } 956 example 957 { "EXAMPLE:"; echo = 2; 958 959 ring r=32003,(x,y,z),dp; 960 961 module A = grobj( module([x+y, x, 0, 0], [0, x+y, y, 0]), intvec(0,0,0,1) ); 962 grview(A); 963 964 module B = grgroebner(A); 965 grview(B); 966 } 967 968 969 proc grtwists(intvec v) 970 "USAGE: grtwists(v), intvec v 971 RETURN: graded object representing S(v[1]) + ... + S(v[size(v)]) 972 PURPOSE: compute presentation of S(v[1]) + ... + S(v[size(v)]) 973 EXAMPLE: example grtwists; shows an example 974 " 975 { 976 int l = size(v); 977 module Z; Z[l] = [0]; 978 Z = grobj(Z, v, v); // will set the rank as well 979 return(Z); 980 } 981 example 982 { "EXAMPLE:"; echo = 2; 983 984 ring r=32003,(x,y,z),dp; 985 986 grview( grtwists ( intvec(-4, 1, 6 )) ); 987 } 988 989 990 proc grsyz(A) 991 "USAGE: grsyz(M), graded object M 992 RETURN: graded object 993 PURPOSE: compute graded syzygy of M 994 EXAMPLE: example grsyz; shows an example 995 " 996 { 997 ASSUME(1, grtest(A)); 998 intvec v = grdeg(A); 999 1000 // attrib(A, "isHomog"); 1001 1002 module M = syz(A); 1003 // print(M); 1004 1005 if( size(M) > 0 ) { return( grobj( M, v ) ); } 1006 1007 // zero syzygy? 1008 return( grtwists(v) ); // ??? 1009 } 1010 example 1011 { "EXAMPLE:"; echo = 2; 1012 1013 ring r=32003,(x,y,z),dp; 1014 1015 module A = grobj( module([x+y, x, 0, 3], [0, x+y, y, 2], [y, y, z, 1]), intvec(0,0,0,1) ); 1016 grview(A); 1017 1018 module B = grgroebner(A); 1019 grview(B); 1020 1021 module C = grsyz(B); 1022 grview(C); 1023 } 1024 1025 1026 proc grprod(A, B) 1027 "USAGE: grprod(M, N), graded objects M and N 1028 RETURN: graded object 1029 PURPOSE: compute graded product M * N (as composition of maps) 1030 EXAMPLE: example grprod; shows an example 1031 " 1032 { 1033 ASSUME(1, grtest(A)); 1034 ASSUME(1, grtest(B)); 1035 1036 return ( grobj( A*B, attrib(A, "isHomog"), grdeg(B) ) ); 1037 } 1038 example 1039 { "EXAMPLE:"; echo = 2; 1040 1041 ring r=32003,(x,y,z),dp; 1042 1043 module A = grobj( module([x+y, x, 0, 3], [0, x+y, y, 2], [y, y, z, 1]), intvec(0,0,0,1) ); 1044 grview(A); 1045 1046 A = grgroebner(A); 1047 grview(A); 1048 1049 module B = grsyz(A); 1050 grview(B); 1051 print(B); 1052 1053 module D = grprod( A, B ); 1054 grview(D); 1055 print(D); // must be all zeroes due to syzygy property! 1056 ASSUME(0, size(D) == 0); 1057 } 1058 1059 1060 1061 1062 proc grres(def A, int l, list #) 1063 "USAGE: grres(M, l[, b]), graded object M, int l, int b 1064 RETURN: graded resolution = list of graded objects 1065 PURPOSE: compute graded resolution of M (of length l) and minimise it if b was given 1066 EXAMPLE: example grres; shows an example 1067 " 1068 { 1069 ASSUME(0, l >= 0); 1070 ASSUME(1, grtest(A)); 1071 1072 intvec v = attrib(A, "isHomog"); 1073 1074 int b = (size(#) > 0); 1075 if(b) { list r = res(A, l, #[1]); } else { list r = res(A, l); } 1076 1077 // r; v; 1078 1079 l = size(r); 1080 1081 int i; module m; 1082 1083 for ( i = 1; i <= l; i++ ) 1084 { 1085 if( size(r[i]) == 0 ){ r[i] = grtwists(v); i++; break; } 1086 1087 r[i] = grobj(r[i], v); v = grdeg(r[i]); 1088 } 1089 i = i-1; 1090 1091 return( list(r[1..i]) ); 1092 } 1093 example 1094 { "EXAMPLE:"; echo = 2; 1095 1096 ring r=32003,(x,y,z),dp; 1097 1098 module A = grobj( module([x+y, x, 0, 3], [0, x+y, y, 2], [y, y, z, 1]), intvec(0,0,0,1) ); 1099 grview(A); 1100 1101 module B = grgroebner(A); 1102 grview(B); 1103 1104 "graded resolution of B: "; def C = grres(B, 0); grview(C); 1105 1106 int i; int l = size(C); 1107 1108 "D^2 == 0: "; for (i = 1; i < l; i++ ) { i; grview( grprod(C[i], C[i+1]) ); } 1109 } 1110 1111 proc grtranspose(def M) 1112 " 1113 USAGE: grtranspose(M), graded object M 1114 RETURN: graded object 1115 PURPOSE: graded transpose of M 1116 NOTE: no reordering is performend by this procedure 1117 EXAMPLE: example grtranspose; shows an example 1118 " 1119 { 1120 ASSUME(1, grtest(M) ); 1121 return ( grobj(transpose(M), -grdeg(M), -attrib(M, "isHomog")) ); 1122 } 1123 example 1124 { "EXAMPLE:"; echo = 2; 1125 1126 ring r=32003,(x,y,z),dp; 1127 1128 module M = grtwists( intvec(-2, 0, 4, 4) ); grview(M); 1129 1130 module N = grsyz( grtranspose( M ) ); grview(N); 1131 1132 module L = grtranspose(N); grview( L ); 1133 1134 module K = grsyz( L ); grview(K); 1135 1136 1137 module A = grobj( module([x+y, x, 0, 3], [0, x+y, y, 2], [y, y, z, 1]), intvec(0,0,0,1) ); A = grgroebner(A); grview(A); 1138 1139 "graded transpose: "; module B = grtranspose(A); grview( B ); print(B); 1140 1141 "... syzygy: "; module C = grsyz(B); grview(C); 1142 1143 "... transposed: "; module D = grtranspose(C); grview( D ); print (D); 1144 1145 "... and back to presentation: "; module E = grsyz( D ); grview(E); print(E); 1146 1147 module F = grgens( E ); grview(F); print(F); 1148 1149 module G = grpres( F ); grview(G); print(G); 1150 } 1151 1152 1153 proc grgens(def M) 1154 " 1155 USAGE: grgens(M), graded object M (map) 1156 RETURN: graded object 1157 PURPOSE: try compute graded generators of coker(M) and return them as columns 1158 of a graded map. 1159 NOTE: presentation of resulting generated submodule may be different to M! 1160 EXAMPLE: example grgens; shows an example 1161 " 1162 { 1163 ASSUME(1, grtest(M) ); 1164 1165 module N = grtranspose( grsyz( grtranspose(M) ) ); 1166 1167 // ASSUME(3, grisequal( grgroebner(M), grgroebner( grpres( N ) ) ) ); // FIXME: not always true!? 1168 1169 return ( N ); 1170 } 1171 example 1172 { "EXAMPLE:"; echo = 2; 1173 1174 ring r=32003,(x,y,z),dp; 1175 1176 module M = grtwists( intvec(-2, 0, 4, 4) ); grview(M); 1177 1178 module N = grgens(M); 1179 1180 grview( N ); print(N); // fine == M 1181 1182 1183 module A = grobj( module([x+y, x, 0, 3], [0, x+y, y, 2], [y, y, z, 1]), intvec(0,0,0,1) ); 1184 1185 A = grgroebner(A); grview(A); 1186 1187 module B = grgens(A); 1188 1189 grview( B ); print(B); // Ups :( != A 1190 1191 } 1192 1193 1194 proc grpres(def M) 1195 " 1196 USAGE: grpres(M), graded object M (submodule gens) 1197 RETURN: graded module (via coker) 1198 PURPOSE: compute graded presentation matrix of submodule generated by columns of M 1199 EXAMPLE: example grpres; shows an example 1200 " 1201 { 1202 ASSUME(1, grtest(M) ); 1203 1204 module N = grsyz(M); 1205 1206 // ASSUME(3, grisequal( M, grgens( N ) ) ); 1207 1208 return ( N ); 1209 } 1210 example 1211 { "EXAMPLE:"; echo = 2; 1212 1213 ring r=32003,(x,y,z),dp; 1214 1215 module M = grtwists( intvec(-2, 0, 4, 4) ); grview(M); 1216 1217 module N = grgens(M); grview( N ); print(N); 1218 1219 module L = grpres( N ); grview( L ); print(L); 1220 1221 1222 module A = grobj( module([x+y, x, 0, 3], [0, x+y, y, 2], [y, y, z, 1]), intvec(0,0,0,1) ); 1223 1224 A = grgroebner(A); grview(A); 1225 1226 module B = grgens(A); grview( B ); print(B); 1227 1228 module C = grpres( B ); grview( C ); print(C); 1229 } 1230 1231 937 1232 938 1233 LIB "random.lib"; // for sparsepoly 939 1234 940 proc grrndmat (intvec w, intvec v, list #)941 "USAGE: grrndmat (src,dst[,p,b]), intvec src, dst[, int p, b]1235 proc grrndmat0(intvec w, intvec v, list #) 1236 "USAGE: grrndmat0(src,dst[,p,b]), intvec src, dst[, int p, b] 942 1237 RETURN: matrix of polynomials 943 1238 PURPOSE: generate random matrix compatible with src and dst gradings 944 1239 NOTE: optional arguments p, b are for 'sparsepoly' (by default: 75%, 30000). 945 1240 TODO: this is experimental at the moment! 946 EXAMPLE: example grrndmat ; shows an example1241 EXAMPLE: example grrndmat0; shows an example 947 1242 " 948 1243 { … … 990 1285 ring r=32003,(x,y,z),dp; 991 1286 992 print( grrndmat ( intvec(0, 1), intvec(1, 2, 3) ) );1287 print( grrndmat0( intvec(0, 1), intvec(1, 2, 3) ) ); 993 1288 } 994 1289 995 1290 // 996 proc grrndmap (def S, def D, list #)997 "USAGE: grrndmap (S,D[,p,b]), graded modules S, D[, int p, b]1291 proc grrndmap0(def S, def D, list #) 1292 "USAGE: grrndmap0(S,D[,p,b]), graded modules S, D[, int p, b] 998 1293 RETURN: graded map 999 1294 PURPOSE: generate random 0-deg graded homomorphism S -> D 1000 1295 NOTE: optional arguments p, b are for 'sparsepoly' (by default: 75%, 30000). 1001 1296 TODO: this is experimental at the moment! 1002 EXAMPLE: example grrndmap ; shows an example1297 EXAMPLE: example grrndmap0; shows an example 1003 1298 " 1004 1299 { … … 1009 1304 intvec w = grdeg(D); // destination 1010 1305 1011 return ( grobj( transpose(grrndmat (v, w, #)), v, w ) );1306 return ( grobj( transpose(grrndmat0(v, w, #)), v, w ) ); 1012 1307 } 1013 1308 example … … 1023 1318 grdeg(S); 1024 1319 1025 module M = grrndmap ( S, D );1320 module M = grrndmap0( S, D ); 1026 1321 print(M); 1027 1322 grview(M); 1028 1323 } 1029 1324 1030 1031 proc grgroebner(A) 1032 "USAGE: grgroebner(M), graded object M 1033 RETURN: graded object 1034 PURPOSE: compute graded groebner basis of M 1035 EXAMPLE: example grgroebner; shows an example 1036 " 1037 { 1038 ASSUME(1, grtest(A)); 1039 1040 return ( grobj( groebner(A), attrib(A, "isHomog") ) ); 1041 } 1042 example 1043 { "EXAMPLE:"; echo = 2; 1044 1045 ring r=32003,(x,y,z),dp; 1046 1047 module A = grobj( module([x+y, x, 0, 0], [0, x+y, y, 0]), intvec(0,0,0,1) ); 1048 grview(A); 1049 1050 module B = grgroebner(A); 1051 grview(B); 1052 } 1053 1054 1055 proc grtwists(intvec v) 1056 "USAGE: grtwists(v), intvec v 1057 RETURN: graded object representing S(v[1]) + ... + S(v[size(v)]) 1058 PURPOSE: compute presentation of S(v[1]) + ... + S(v[size(v)]) 1059 EXAMPLE: example grtwists; shows an example 1060 " 1061 { 1062 int l = size(v); 1063 module Z; Z[l] = [0]; 1064 Z = grobj(Z, v, v); // will set the rank as well 1065 return(Z); 1066 } 1067 example 1068 { "EXAMPLE:"; echo = 2; 1069 1070 ring r=32003,(x,y,z),dp; 1071 1072 grview( grtwists ( intvec(-4, 1, 6 )) ); 1073 } 1074 1075 1076 proc grsyz(A) 1077 "USAGE: grsyz(M), graded object M 1078 RETURN: graded object 1079 PURPOSE: compute graded syzygy of M 1080 EXAMPLE: example grsyz; shows an example 1081 " 1082 { 1083 ASSUME(1, grtest(A)); 1084 intvec v = grdeg(A); 1085 1086 // attrib(A, "isHomog"); 1087 1088 module M = syz(A); 1089 // print(M); 1090 1091 if( size(M) > 0 ) { return( grobj( M, v ) ); } 1092 1093 // zero syzygy? 1094 return( grtwists(v) ); // ??? 1095 } 1096 example 1097 { "EXAMPLE:"; echo = 2; 1098 1099 ring r=32003,(x,y,z),dp; 1100 1101 module A = grobj( module([x+y, x, 0, 3], [0, x+y, y, 2], [y, y, z, 1]), intvec(0,0,0,1) ); 1102 grview(A); 1103 1104 module B = grgroebner(A); 1105 grview(B); 1106 1107 module C = grsyz(B); 1108 grview(C); 1109 } 1110 1111 1112 proc grprod(A, B) 1113 "USAGE: grprod(M, N), graded objects M and N 1114 RETURN: graded object 1115 PURPOSE: compute graded product M * N (as composition of maps) 1116 EXAMPLE: example grprod; shows an example 1117 " 1118 { 1119 ASSUME(1, grtest(A)); 1120 ASSUME(1, grtest(B)); 1121 1122 return ( grobj( A*B, attrib(A, "isHomog"), grdeg(B) ) ); 1123 } 1124 example 1125 { "EXAMPLE:"; echo = 2; 1126 1127 ring r=32003,(x,y,z),dp; 1128 1129 module A = grobj( module([x+y, x, 0, 3], [0, x+y, y, 2], [y, y, z, 1]), intvec(0,0,0,1) ); 1130 grview(A); 1131 1132 A = grgroebner(A); 1133 grview(A); 1134 1135 module B = grsyz(A); 1136 grview(B); 1137 print(B); 1138 1139 module D = grprod( A, B ); 1140 grview(D); 1141 print(D); // must be all zeroes due to syzygy property! 1142 ASSUME(0, size(D) == 0); 1143 } 1144 1145 1146 1147 1148 proc grres(def A, int l, list #) 1149 "USAGE: grres(M, l[, b]), graded object M, int l, int b 1150 RETURN: graded resolution = list of graded objects 1151 PURPOSE: compute graded resolution of M (of length l) and minimise it if b was given 1152 EXAMPLE: example grres; shows an example 1153 " 1154 { 1155 ASSUME(0, l >= 0); 1156 ASSUME(1, grtest(A)); 1157 1158 intvec v = attrib(A, "isHomog"); 1159 1160 int b = (size(#) > 0); 1161 if(b) { list r = res(A, l, #[1]); } else { list r = res(A, l); } 1162 1163 // r; v; 1164 1165 l = size(r); 1166 1167 int i; module m; 1168 1169 for ( i = 1; i <= l; i++ ) 1170 { 1171 if( size(r[i]) == 0 ){ r[i] = grtwists(v); i++; break; } 1172 1173 r[i] = grobj(r[i], v); v = grdeg(r[i]); 1174 } 1175 i = i-1; 1176 1177 return( list(r[1..i]) ); 1178 } 1179 example 1180 { "EXAMPLE:"; echo = 2; 1181 1182 ring r=32003,(x,y,z),dp; 1183 1184 module A = grobj( module([x+y, x, 0, 3], [0, x+y, y, 2], [y, y, z, 1]), intvec(0,0,0,1) ); 1185 grview(A); 1186 1187 module B = grgroebner(A); 1188 grview(B); 1189 1190 "graded resolution of B: "; def C = grres(B, 0); grview(C); 1191 1192 int i; int l = size(C); 1193 1194 "D^2 == 0: "; for (i = 1; i < l; i++ ) { i; grview( grprod(C[i], C[i+1]) ); } 1195 } 1196 1197 proc grtranspose(def M) 1198 " 1199 USAGE: grtranspose(M), graded object M 1200 RETURN: graded object 1201 PURPOSE: graded transpose of M 1202 NOTE: no reordering is performend by this procedure 1203 EXAMPLE: example grtranspose; shows an example 1204 " 1205 { 1206 ASSUME(1, grtest(M) ); 1207 return ( grobj(transpose(M), -grdeg(M), -attrib(M, "isHomog")) ); 1208 } 1209 example 1210 { "EXAMPLE:"; echo = 2; 1211 1212 ring r=32003,(x,y,z),dp; 1213 1214 module M = grtwists( intvec(-2, 0, 4, 4) ); grview(M); 1215 1216 module N = grsyz( grtranspose( M ) ); grview(N); 1217 1218 module L = grtranspose(N); grview( L ); 1219 1220 module K = grsyz( L ); grview(K); 1221 1222 1223 module A = grobj( module([x+y, x, 0, 3], [0, x+y, y, 2], [y, y, z, 1]), intvec(0,0,0,1) ); A = grgroebner(A); grview(A); 1224 1225 "graded transpose: "; module B = grtranspose(A); grview( B ); print(B); 1226 1227 "... syzygy: "; module C = grsyz(B); grview(C); 1228 1229 "... transposed: "; module D = grtranspose(C); grview( D ); print (D); 1230 1231 "... and back to presentation: "; module E = grsyz( D ); grview(E); print(E); 1232 1233 module F = grgens( E ); grview(F); print(F); 1234 1235 module G = grpres( F ); grview(G); print(G); 1236 } 1237 1238 1239 proc grgens(def M) 1240 " 1241 USAGE: grgens(M), graded object M (map) 1242 RETURN: graded object 1243 PURPOSE: try compute graded generators of coker(M) and return them as columns 1244 of a graded map. 1245 NOTE: presentation of resulting generated submodule may be different to M! 1246 EXAMPLE: example grgens; shows an example 1247 " 1248 { 1249 ASSUME(1, grtest(M) ); 1250 1251 module N = grtranspose( grsyz( grtranspose(M) ) ); 1252 1253 // ASSUME(3, grisequal( grgroebner(M), grgroebner( grpres( N ) ) ) ); // FIXME: not always true!? 1254 1255 return ( N ); 1256 } 1257 example 1258 { "EXAMPLE:"; echo = 2; 1259 1260 ring r=32003,(x,y,z),dp; 1261 1262 module M = grtwists( intvec(-2, 0, 4, 4) ); grview(M); 1263 1264 module N = grgens(M); 1265 1266 grview( N ); print(N); // fine == M 1267 1268 1269 module A = grobj( module([x+y, x, 0, 3], [0, x+y, y, 2], [y, y, z, 1]), intvec(0,0,0,1) ); 1270 1271 A = grgroebner(A); grview(A); 1272 1273 module B = grgens(A); 1274 1275 grview( B ); print(B); // Ups :( != A 1276 1277 } 1278 1279 1280 proc grpres(def M) 1281 " 1282 USAGE: grpres(M), graded object M (submodule gens) 1283 RETURN: graded module (via coker) 1284 PURPOSE: compute graded presentation matrix of submodule generated by columns of M 1285 EXAMPLE: example grpres; shows an example 1286 " 1287 { 1288 ASSUME(1, grtest(M) ); 1289 1290 module N = grsyz(M); 1291 1292 // ASSUME(3, grisequal( M, grgens( N ) ) ); 1293 1294 return ( N ); 1295 } 1296 example 1297 { "EXAMPLE:"; echo = 2; 1298 1299 ring r=32003,(x,y,z),dp; 1300 1301 module M = grtwists( intvec(-2, 0, 4, 4) ); grview(M); 1302 1303 module N = grgens(M); grview( N ); print(N); 1304 1305 module L = grpres( N ); grview( L ); print(L); 1306 1307 1308 module A = grobj( module([x+y, x, 0, 3], [0, x+y, y, 2], [y, y, z, 1]), intvec(0,0,0,1) ); 1309 1310 A = grgroebner(A); grview(A); 1311 1312 module B = grgens(A); grview( B ); print(B); 1313 1314 module C = grpres( B ); grview( C ); print(C); 1315 } 1316 1317 1325 /* 1318 1326 proc grconcat(A, B) 1319 1327 " … … 1327 1335 { "EXAMPLE:"; echo = 2; 1328 1336 } 1329 1330 1337 */ 1338 1339 1340 1341 proc KeneshlouMatrixPresentation(intvec a) 1342 " 1343 PURPOSE: Direct sum of all omegas_i(i) with powers a[i] 1344 NOTE: Please document/name this proc properly 1345 " 1346 { 1347 int n = size(a)-1; 1348 // ring r = 32003,(x(0..n)),dp; 1349 ASSUME(0, nvars(basering)==(n+1)); 1350 int i,j; 1351 1352 // find first nonzero exponent a_i 1353 for(i=1;i<=size(a);i++) 1354 { 1355 if(a[i]!=0) {break; }; 1356 } 1357 1358 // all zeroes? 1359 if(i>size(a)) {return (grzero()); }; 1360 1361 for(i=2;i<=n;i++) 1362 { 1363 if(a[i]!=0) {break; }; 1364 } 1365 1366 module N; 1367 1368 if(i>n) 1369 { // no middle part 1370 if(a[1]>0) 1371 { 1372 N=grtwist(a[1],0); 1373 1374 if(a[n+1]>0) 1375 { N=grsum(N,grtwist(a[n+1],-1));} 1376 } 1377 else 1378 { N=grtwist(a[n+1],-1);} 1379 1380 return (N); // grorder(N)); 1381 } 1382 else // i <= n: middle part is present, a_i != 0 1383 { // a = a1 ... | i:2, a_2 ..... i: n, a_n | .... i: n+1a_(n+1) 1384 j = i - 1; 1385 module I = maxideal(1); 1386 attrib(I,"isHomog", intvec(0)); 1387 list L = mres(I, 0); 1388 list kos = grorder(L); 1389 // make sure that graded maps are represented by blocks corresponding to the betti diagram? 1390 1391 def S = grpower(grshift(grobj( kos[j+2], attrib(kos[j+2], "isHomog")), j), a[i]); 1392 1393 i++; 1394 1395 for(; i <= n; i++) 1396 { 1397 if(a[i]==0) { i++; continue; } 1398 j = i - 1; 1399 S = grsum( S, grpower(grshift( grobj( kos[j+2], attrib(kos[j+2], "isHomog")), j), a[i]) ); 1400 } 1401 1402 // S is the middle (non-zero) part 1403 1404 if(a[1] > 0 ) 1405 { 1406 N=grsum(grtwist(a[1],0), S); 1407 } 1408 else 1409 { N = S;} 1410 1411 if(a[n+1] > 0 ) 1412 { N=grsum(N, grtwist(a[n+1],-1)); } 1413 1414 1415 return ((N)); // return (grorder(N)); 1416 } 1417 } 1418 example 1419 { "EXAMPLE:"; echo = 2; 1420 ring r = 32003,(x(0..4)),dp; 1421 1422 def N1 = KeneshlouMatrixPresentation(intvec(2,0,0,0,0)); 1423 grview(N1); 1424 1425 def N2 = KeneshlouMatrixPresentation(intvec(0,0,0,0,3)); 1426 grview(N2); 1427 1428 def N = KeneshlouMatrixPresentation(intvec(2,0,0,0,3)); 1429 grview(N); 1430 1431 1432 def M1 = KeneshlouMatrixPresentation(intvec(0,1,0,0,0)); 1433 grview(M1); 1434 1435 def M2 = KeneshlouMatrixPresentation(intvec(0,1,1,0,0)); 1436 grview(M2); 1437 1438 def M3 = KeneshlouMatrixPresentation(intvec(0,0,0,1,0)); 1439 grview(M3); 1440 1441 def M = KeneshlouMatrixPresentation(intvec(1,1,1,0,0)); 1442 grview(M); 1443 1444 1445 } 1446 1447 1448 1449 1450 proc grrndmat(intvec v, intvec w, list #) 1451 { 1452 int p=75; int b=30000; // defaults for sparsepoly 1453 1454 if ( size(#) > 0 ) 1455 { 1456 ASSUME( 0, (typeof(#[1]) == "int") || (typeof(#[1]) == "bigint") ); 1457 p = #[1]; 1458 1459 if ( size(#) > 1 ) 1460 { 1461 ASSUME( 0, (typeof(#[2]) == "int") || (typeof(#[2]) == "bigint") ); 1462 b = #[2]; 1463 } 1464 } 1465 1466 1467 matrix M[size(w)][size(v)]; 1468 int i,j,c; 1469 1470 for(j=1;i<=size(v);j++) 1471 { 1472 for(i=1;i<=size(w);i++) 1473 { 1474 c=(w[i]-v[j]); 1475 if( c >= 0) 1476 {M[i,j]=sparsepoly(c, c, p, b);} 1477 // else { M[i,j]=0;} 1478 1479 } 1480 } 1481 1482 return(M); 1483 } 1484 1485 proc grhomog0(M,N) 1486 { 1487 intvec v = grdeg(M); // src 1488 intvec w = grdeg(N); // dest 1489 return ( grobj( grrndmat(v, w), v, w ) ); 1490 } 1491 1492 1493 proc grconcat(A,B) 1494 "USAGE: grconcat(A, B), graded objects A and B, dst(A) == dst(B) =: dst 1495 RETURN: graded object 1496 PURPOSE: construct src(A) + src(B) -----> dst given by (A|B) 1497 EXAMPLE: example grconcat; shows an example 1498 " 1499 { 1500 1501 ASSUME(0, attrib(A,"isHomog")==attrib(B,"isHomog")); 1502 ASSUME(1, grtest(A)); 1503 ASSUME(1, grtest(B)); 1504 1505 1506 intvec v=attrib(A,"isHomog"); 1507 intvec w=grdeg(A),grdeg(B); 1508 return(grobj(concat(A,B),v,w)); 1509 } 1510 example 1511 { "EXAMPLE:"; echo = 2; 1512 ring r; 1513 1514 module R=grobj(module([x,y,z]),intvec(0:3)); 1515 grview(R); 1516 1517 module S=grobj(module([x,0,y],[xy,zy+x2,0]),intvec(0:3)); 1518 grview(S); 1519 1520 def Q=grconcat(R,S); 1521 grview(Q); 1522 } 1523 1524 1525 proc grlift(A, B) 1526 "USAGE: grlift(M, N), graded objects M and N 1527 RETURN: graded object 1528 PURPOSE: compute graded matrix which the generators of submodule N in terms of the generators of M. 1529 EXAMPLE: example grlift; shows an example 1530 " 1531 { 1532 ASSUME(0, attrib(A,"isHomog")==attrib(B,"isHomog")); 1533 ASSUME(1, grtest(A)); 1534 ASSUME(1, grtest(B)); 1535 1536 return(grobj(lift(A,B),grdeg(A), grdeg(B))); 1537 } 1538 example 1539 { "EXAMPLE:"; echo = 2; 1540 1541 ring r=32003,(x,y,z),dp; 1542 module P=grobj(module([xy,0,xz]),intvec(0,1,0)); P = grgroebner(P); 1543 grview(P); 1544 1545 1546 module D=grobj(module([y,0,z],[x2+y2,z,0]),intvec(0,1,0)); D = grgroebner(D); 1547 grview(D); 1548 1549 def G=grlift(D,P); 1550 grview(G); 1551 } 1552 1553 1554 proc grlifting(M,N) 1555 "??" 1556 { ASSUME(1, grtest(A)); 1557 ASSUME(1, grtest(B)); 1558 1559 list rM=grres(M,1); // only syzygy? 1560 list rN=grres(N,1); // only syzygy??? 1561 int i,j,k; 1562 list P; 1563 1564 for(i=1;i<=size(rM);i++) 1565 { 1566 if(size(rM[i])==0){break;} 1567 } 1568 1569 for(j=1;j<=size(rN);j++) 1570 { 1571 if(size(rN[j])==0){break;} 1572 } 1573 1574 int t=min(i,j); // always 2!?? 1575 1576 if(t>=2) 1577 { 1578 P[1]=grrndmap1(M,N); 1579 if(t==2){return(P[1])}; 1580 1581 for(k=2;k<t;k++) 1582 { 1583 A=grprod(P[k-1],rM[k]); 1584 p[k]=grlift(rN[k],A); // BUG: rN[k] may not be a GB! Therefore it is wrong to try to compute whole resolutions in advance!!! 1585 } 1586 return(P); 1587 } 1588 else //t=1 // FIXME: this case can never happen! 1589 {return(0);} 1590 1591 } 1592 example 1593 { "EXAMPLE:"; echo = 2; 1594 1595 ring r=32003,(x,y,z),dp; 1596 module P=grobj(module([xy,0,xz]),intvec(0,1,0)); P = grgroebner(P); 1597 grview(P); 1598 1599 1600 module D=grobj(module([y,0,z],[x2+y2,z,0]),intvec(0,1,0)); D = grgroebner(D); 1601 grview(D); 1602 1603 def G=grlifting(D,P); 1604 grview(G); 1605 } 1606 1607 // LIB"matrix.lib"; // ? 1608 1609 proc mappingcone(M,N) 1610 "??" 1611 { 1612 ASSUME(1, grtest(M)); 1613 ASSUME(1, grtest(N)); 1614 1615 list P=grlifting(M,N); 1616 list rM=grres(M,1); 1617 list rN=grres(N,1); 1618 1619 int i; 1620 list T; 1621 1622 T[1]=grconcat(P[1],rN[2]); 1623 1624 for(i=2;i<=size(P);i++) 1625 { 1626 intvec v=attrib(rM[i],"isHomog"); 1627 intvec w=grdeg(rN[i+1]); 1628 int r=size(v); 1629 int s=size(w); 1630 1631 module A=grconcat(P[i],rN[i+1]); 1632 module B=grobj(module(zero[r][s]),v,w); // BUG ???? 1633 module C=grconcat(-rM[i],B); 1634 module D=grconcat(grtranspose(C), grtranspose(A)); 1635 1636 T[i]=grtranspose(D); 1637 } 1638 return(T); 1639 } 1640 example 1641 { "EXAMPLE:"; echo = 2; 1642 1643 ring r=32003, (x(0..4)),dp; 1644 def I=maxideal(1); 1645 module R=grobj(module(I), intvec(0)); 1646 resolution FR=mres(R,0); 1647 print(betti(FR,0),"betti"); 1648 module K=grobj(module(FR[1]),intvec(-1),intvec(0,0,0,0,0)); 1649 module S=grsyz(K); 1650 S = grgroebner(S); 1651 grview(S) 1652 module B=grobj(module([1,0,0],[0,1,0],[0,0,1]),intvec(1,1,1),intvec(1,1,1)); 1653 B = grgroebner(B); 1654 grview(B) 1655 // the following is totally wrong :( 1656 /* 1657 def Z=grlifting(B,S); 1658 Z; 1659 def G=mappingcone(B,S); 1660 G; 1661 resolution E=grres(G[1],0); 1662 print(betti(E,0),"betti"); 1663 module W=grtranspose(G[1]); 1664 resolution U=grres(W,0); 1665 ideal P=groebner(flatten(U[2])); // flatten??? 1666 resolution L=mres(P,0); 1667 print(betti(L),"betti"); 1668 */ 1669 } 1670 1671 1672 proc grrndmap1(defD, def S, list #) 1673 "USAGE: (D,S), graded objects S and D 1674 RETURN: graded object 1675 PURPOSE: construct a random 0-deg graded homomorphism between source of D and S. 1676 EXAMPLE: example grrndmap1; shows an example 1677 " 1678 { 1679 ASSUME(1, grtest(D) ); 1680 ASSUME(1, grtest(S) ); 1681 intvec v = -grdeg(S); // source 1682 intvec w = -grdeg(D); // destination 1683 return (grobj(grrndmat(v, w, #), -w, -v ) ); 1684 } 1685 example 1686 { "EXAMPLE:"; echo = 2; 1687 1688 ring r=32003,(x,y,z),dp; 1689 1690 module D=grobj(module([y,0,z],[x2+y2,z,0]),intvec(0,1,0)); 1691 grview(D); 1692 1693 module S=grobj(module([x,0,y],[xy,zy+x2,0]),intvec(0,0,0)); 1694 grview(S); 1695 1696 def H=grrndmap1(D,S); 1697 grview(H); 1698 1699 } 1700 1701 1702 proc grrndmap2(def D, def S, list #) 1703 "USAGE: (D,S), graded objects S and D 1704 RETURN: graded object 1705 PURPOSE: construct a random 0-deg graded homomorphism between target of D and S. 1706 EXAMPLE: example grrndmap2; shows an example 1707 " 1708 { 1709 ASSUME(1, grtest(D) ); 1710 ASSUME(1, grtest(S) ); 1711 intvec v = -attrib(D, "isHomog"); // source 1712 intvec w = -attrib(S, "isHomog"); // target 1713 return (grobj(grrndmat(v, w, #), -w, -v ) ); 1714 } 1715 example 1716 { "EXAMPLE:"; echo = 2; 1717 1718 ring r=32003,(x,y,z),dp; 1719 1720 module D=grobj(module([y,0,z],[x2+y2,z,0]),intvec(0,1,0)); 1721 grview(D); 1722 1723 module S=grobj(module([x,0,y],[xy,zy+x2,0]),intvec(0,0,0)); 1724 grview(S); 1725 1726 def G=grrndmap2(D,S); 1727 grview(G); 1728 1729 } 1730 1731 proc grlifting2(A,B) 1732 "USAGE: (A,B), graded objects A and B (matrices defining maps) 1733 RETURN: map of chain complexes (as a list) 1734 PURPOSE: construct a map of chain complexes between free resolution of 1735 M=coker(A) and N=coker(B). 1736 NOTE: 1737 A f2 f3 1738 0<---M<----F0<----F1<----F2<----F3<---- 1739 |p1 |p2 1740 1741 0<---N<----G0<----G1<----G2<----G3<---- 1742 B(g1) g2 g3 1743 1744 EXAMPLE: example grlifting2; shows an example 1745 " 1746 { ASSUME(1, grtest(A)); 1747 ASSUME(1, grtest(B)); 1748 1749 list rM=grres(A,0); 1750 list rN=grres(B,0); 1751 int i,j,k; 1752 list P; 1753 1754 // find first zero matrix in rM 1755 for(i=1;i<=size(rM);i++) 1756 { 1757 if(size(rM[i])==0){break;} 1758 } 1759 1760 // find first zero matrix in rN 1761 for(j=1;j<=size(rN);j++) 1762 { 1763 if(size(rN[j])==0){break;} 1764 } 1765 1766 int t=min(i,j); 1767 1768 P[1]=grrndmap2(A,B); 1769 1770 // A(or B)=0 1771 if(t==1){return(P[1])}; 1772 1773 for(k=2;k<=t;k++) 1774 { 1775 def E=grprod(P[k-1],rM[k-1]); 1776 P[k]=grlift(rN[k-1],E); // ----------> 1777 // BUG: rN[k-1] may not be a GB! // see same thing above 1778 /* let yi=(pi)o(fi); to take grlift(gi,yi) 1779 we should have img(yi) is contained in 1780 img(gi)=ker(gi-1),i.e (gi-1)oyi=0. we have 1781 (gi-1)oyi=(gi-1)o(pi)o(fi)=(pi-1)o(fi-1)ofi=0 1782 */ 1783 } 1784 return(P); 1785 } 1786 example 1787 {"EXAMPLE:"; echo = 2; 1788 1789 ring r; 1790 module P=grobj(module([xy,0,xz]),intvec(0,1,0)); P = grgroebner(P); 1791 grview(P); 1792 1793 module D=grobj(module([y,0,z],[x2+y2,z,0]),intvec(0,1,0)); D = grgroebner(D); 1794 grview(D); 1795 1796 def T=grlifting2(D,P); T; 1797 1798 // def Z=grlifting2(P,D); Z; // WRONG!!! 1799 1800 } 1801 1802 1803 1804 proc mappingcone2(A,B) 1805 "USAGE: (A,B), graded objects A and B (matrices defining maps) 1806 RETURN: chain complex (as a list) 1807 PURPOSE: construct the free resolution of a cokernel of a random map between 1808 M=coker(A), and N=coker(B) 1809 NOTE: 1810 -f1 0 -f2 0 1811 (p1 g1) p2 g2 p3 g3 1812 G0<-----F0+G1<------F1+G2<-------F2+G3<----- 1813 1814 EXAMPLE: example mappingcone2; 1815 " 1816 1817 { 1818 ASSUME(1, grtest(A)); 1819 ASSUME(1, grtest(B)); 1820 1821 list P=grlifting2(A,B); 1822 list rM=grres(A,1); 1823 list rN=grres(B,1); 1824 1825 int i; 1826 list T; 1827 1828 T[1]=grconcat(P[1],rN[1]); 1829 1830 for(i=2;i<=size(P);i++) 1831 { 1832 intvec v=attrib(rM[i-1],"isHomog"); 1833 intvec w=grdeg(rN[i]); 1834 int r=size(v); 1835 int s=size(w); 1836 1837 module A=grconcat(P[i],rN[i]); 1838 module B=grobj(module(zero[r][s]),v,w); // BUG 1839 module C=grconcat(-rM[i-1],B); 1840 module D=grconcat(grtranspose(C), grtranspose(A)); 1841 1842 T[i]=grtranspose(D); 1843 } 1844 return(T); 1845 } 1846 example 1847 { "EXAMPLE:"; echo = 2; 1848 1849 ring r=32003,(x(0..4)),dp; 1850 def I=maxideal(1); 1851 module R=grobj(module(I), intvec(0)); 1852 resolution FR=mres(R,0); 1853 print(betti(FR,0),"betti"); 1854 module K=grobj(module(FR[1]),intvec(-1),intvec(0:5)); 1855 grview(K); 1856 1857 module S=grsyz(K); 1858 S = grgroebner(S); 1859 grview(S); 1860 S; 1861 1862 module B=grobj(module([1],[0,1],[0,0,1],[0,0,0,1], [0,0,0,0,1]),intvec(0:5)); 1863 B = grgroebner(B); 1864 grview(B); 1865 B; 1866 1867 def Z=grlifting2(S,B); // ? 2nd module does not lie in the first 1868 Z; 1869 1870 // def G=mappingcone2(S,B); G; // BUG due to zero[][] 1871 1872 /* 1873 resolution E=grres(G[1],0); 1874 print(betti(E,0),"betti"); 1875 module W=grtranspose(G[1]); 1876 resolution U=grres(W,0); 1877 ideal P=groebner(flatten(U[2])); // flatten??? 1878 resolution L=mres(P,0); 1879 print(betti(L),"betti"); 1880 */ 1881 } 1882
Note: See TracChangeset
for help on using the changeset viewer.