[0b59f5] | 1 | // $Id: deform.lib,v 1.19 1999-12-13 15:33:45 obachman Exp $ |
---|
[f0c6f4] | 2 | // author: Bernd Martin email: martin@math.tu-cottbus.de |
---|
[82716e] | 3 | //(bm, last modified 4/98) |
---|
[3d124a7] | 4 | /////////////////////////////////////////////////////////////////////////////// |
---|
[0b59f5] | 5 | version="$Id: deform.lib,v 1.19 1999-12-13 15:33:45 obachman Exp $"; |
---|
[5480da] | 6 | info=" |
---|
[f1201a] | 7 | LIBRARY: deform.lib PROCEDURES FOR COMPUTING MINIVERSAL DEFORMATION |
---|
[f0c6f4] | 8 | |
---|
[091424] | 9 | AUTHOR: Bernd Martin, email: martin@math.tu-cottbus.de |
---|
[f34c37c] | 10 | |
---|
| 11 | PROCEDURES: |
---|
[f0c6f4] | 12 | versal(Fo[,d,any]) miniversal deformation of isolated singularity Fo |
---|
| 13 | mod_versal(Mo,I,[,d,any]) miniversal deformation of module Mo modulo ideal I |
---|
[82716e] | 14 | lift_kbase(N,M); lifting N into standard kbase of M |
---|
[f0c6f4] | 15 | lift_rel_kb(N,M[,kbM,p]) relative lifting N into a kbase of M |
---|
[f34c37c] | 16 | kill_rings([\"prefix\"]) kills the exported rings from above |
---|
[5480da] | 17 | "; |
---|
[f0c6f4] | 18 | /////////////////////////////////////////////////////////////////////////////// |
---|
[f1201a] | 19 | LIB "inout.lib"; |
---|
| 20 | LIB "general.lib"; |
---|
| 21 | LIB "matrix.lib"; |
---|
| 22 | LIB "homolog.lib"; |
---|
[6f2edc] | 23 | LIB "sing.lib"; |
---|
[3d124a7] | 24 | /////////////////////////////////////////////////////////////////////////////// |
---|
[f1201a] | 25 | proc versal (ideal Fo,list #) |
---|
[d2b2a7] | 26 | "USAGE: versal(Fo[,d,any]); Fo=ideal, d=int, any=list |
---|
[f1201a] | 27 | COMUPTE: miniversal deformation of Fo up to degree d (default d=100), |
---|
| 28 | CREATE: Rings (exported): |
---|
[3fe3582] | 29 | 'my'Px = extending the basering Po by new variables given by |
---|
| 30 | \"A,B,..\" (deformation parameters), returns as basering, the |
---|
| 31 | new variables come before the old ones, the ordering is the |
---|
| 32 | product between \"ls\" and \"ord(Po)\" |
---|
| 33 | @*'my'Qx = Px/Fo extending Qo=Po/Fo, |
---|
| 34 | @*'my'So = being the embedding-ring of the versal base space, |
---|
| 35 | @*'my'Ox = Px/Js extending So/Js. (default my=\"\") |
---|
| 36 | |
---|
[82716e] | 37 | Matrices (in Px, exported): |
---|
[3fe3582] | 38 | @*Js = giving the versal base space (obstructions), |
---|
| 39 | @*Fs = giving the versal family of Fo, |
---|
| 40 | @*Rs = giving the lifting of Ro=syz(Fo). |
---|
| 41 | |
---|
[f1201a] | 42 | If d is defined (!=0), it computes up to degree d. |
---|
[3fe3582] | 43 | @*If 'any' is defined and any[1] is no string, interactive version. |
---|
| 44 | @*Otherwise 'any' gives predefined strings: \"my\",\"param\",\"order\",\"out\" |
---|
[d2b2a7] | 45 | (\"my\" prefix-string, \"param\" is a letter (e.g. \"A\") for the name of |
---|
[82716e] | 46 | first parameter or (e.g. \"A(\") for index parameter variables, \"order\" |
---|
[d2b2a7] | 47 | ordering string for ring extension), \"out\" name of output-file). |
---|
[f1201a] | 48 | NOTE: printlevel < 0 no output at all, |
---|
[82716e] | 49 | printlevel >=0,1,2,.. informs you, what is going on; |
---|
[f1201a] | 50 | this proc uses 'execute'. |
---|
| 51 | EXAMPLE:example versal; shows an example |
---|
[d2b2a7] | 52 | " |
---|
[3d124a7] | 53 | { |
---|
[f1201a] | 54 | //------- prepare ------------------------------------------------------------- |
---|
| 55 | string str,@param,@order,@my,@out,@degrees; |
---|
| 56 | int @d,d_max,@t1,t1',@t2,@colR,ok_ann,@smooth,@noObstr,@size,@j; |
---|
| 57 | int p = printlevel-voice+3; |
---|
| 58 | int time = timer; |
---|
| 59 | intvec @iv,@jv,@is_qh,@degr; |
---|
[82716e] | 60 | d_max = 100; |
---|
[f1201a] | 61 | @my = ""; @param="A"; @order="ds"; @out="no"; |
---|
| 62 | @size = size(#); |
---|
| 63 | if( @size>0 ) { d_max = #[1]; } |
---|
[82716e] | 64 | if( @size>1 ) |
---|
| 65 | { if(typeof(#[2])!="string") |
---|
[f1201a] | 66 | { string @active; |
---|
| 67 | @my,@param,@order,@out = interact1(); |
---|
| 68 | } |
---|
| 69 | else |
---|
| 70 | { @my = #[2]; |
---|
| 71 | if (@size>2) {@param = #[3];} |
---|
| 72 | if (@size>3) {@order = #[4];} |
---|
| 73 | if (@size>4) {@out = #[5];} |
---|
| 74 | } |
---|
| 75 | } |
---|
| 76 | string myPx = @my+"Px"; |
---|
| 77 | string myQx = @my+"Qx"; |
---|
| 78 | string myOx = @my+"Ox"; |
---|
| 79 | string mySo = @my+"So"; |
---|
| 80 | Fo = simplify(Fo,10); |
---|
| 81 | @is_qh = qhweight(Fo); |
---|
| 82 | int @rowR= size(Fo); |
---|
| 83 | def Po = basering; |
---|
[82716e] | 84 | setring Po; |
---|
[f1201a] | 85 | poly X_s = product(maxideal(1)); |
---|
[0b59f5] | 86 | //------- reproduce T_12 ----------------------------------------------------- |
---|
| 87 | list Ls = T_12(Fo,1); |
---|
[f1201a] | 88 | matrix Ro = Ls[6]; // syz(i) |
---|
| 89 | matrix InfD = Ls[5]; // matrix of inf. deformations |
---|
| 90 | matrix PreO = Ls[7]; // representation of (Syz/Kos)* |
---|
| 91 | module PreO'= std(PreO); |
---|
[0b59f5] | 92 | module PreT = Ls[2]; // representation of modT_2 (sb) |
---|
[f1201a] | 93 | if(dim(PreT)==0) |
---|
| 94 | { |
---|
[0b59f5] | 95 | matrix kbT_2 = kbase(PreT); // kbase of T_2 |
---|
[f1201a] | 96 | } |
---|
| 97 | else |
---|
| 98 | { |
---|
[0b59f5] | 99 | matrix kbT_2 ; // kbase of T_2 : empty |
---|
[f1201a] | 100 | } |
---|
[0b59f5] | 101 | @t1 = Ls[3]; // vdim of T_1 |
---|
| 102 | @t2 = Ls[4]; // vdim of T_2 |
---|
[f1201a] | 103 | kill Ls; |
---|
[82716e] | 104 | t1' = @t1; |
---|
| 105 | if( @t1==0) { dbprint(p,"// rigit!"); return();} |
---|
| 106 | if( @t2==0) { @smooth=1; dbprint(p,"// smooth base space");} |
---|
[0b59f5] | 107 | dbprint(p,"// ready: T_1 and T_2"); |
---|
[f1201a] | 108 | @colR = ncols(Ro); |
---|
| 109 | //----- test: quasi-homogeneous, choice of inf. def.-------------------------- |
---|
| 110 | @degrees = homog_test(@is_qh,matrix(Fo),InfD); |
---|
| 111 | @jv = 1..@t1; |
---|
[82716e] | 112 | if (@degrees!="") |
---|
[0b59f5] | 113 | { dbprint(p-1,"// T_1 is quasi-homogeneous represented with weight-vector", |
---|
[f1201a] | 114 | @degrees); |
---|
| 115 | } |
---|
| 116 | if (defined(@active)) |
---|
[82716e] | 117 | { "// matrix of infinitesimal deformations:";print(InfD); |
---|
[f1201a] | 118 | "// weights of infinitesimal deformations ( emty ='not qhomog'):"; |
---|
| 119 | @degrees; |
---|
| 120 | matrix dummy; |
---|
| 121 | InfD,dummy,t1' = interact2(InfD,@jv);kill dummy; |
---|
[82716e] | 122 | } |
---|
[f1201a] | 123 | //---- create new rings and objects ------------------------------------------ |
---|
| 124 | get_rings(Fo,t1',1,@my,@order,@param); |
---|
| 125 | setring `myPx`; |
---|
[82716e] | 126 | @jv=0; @jv[t1']=0; @jv=@jv+1; @jv[nvars(basering)]=0; |
---|
[f1201a] | 127 | //weight-vector for calculating |
---|
| 128 | //rel-jet with resp to def-para |
---|
[82716e] | 129 | ideal Io = imap(Po,Fo); |
---|
[f1201a] | 130 | ideal J,m_J,tid; attrib(J,"isSB",1); |
---|
| 131 | matrix Fo = matrix(Io); //initial equations |
---|
| 132 | matrix homF = kohom(Fo,@colR); |
---|
| 133 | matrix Ro = imap(Po,Ro); |
---|
| 134 | matrix homR = transpose(Ro); |
---|
| 135 | matrix homFR= concat(homR,homF); |
---|
| 136 | module hom' = std(homFR); |
---|
[82716e] | 137 | matrix Js[1][@t2]; |
---|
| 138 | matrix F_R,Fs,Rs,Fn,Rn; |
---|
| 139 | export Js,Fs,Rs; |
---|
| 140 | matrix Mon[t1'][1]=maxideal(1); |
---|
[f1201a] | 141 | Fn = transpose(imap(Po,InfD)*Mon); //infinitesimal deformations |
---|
[82716e] | 142 | Fs = Fo + Fn; |
---|
[f1201a] | 143 | dbprint(p-1,"// infinitesimal deformation: Fs: ",Fs); |
---|
| 144 | Rn = (-1)*lift(Fo,Fs*Ro); //infinit. relations |
---|
| 145 | Rs = Ro + Rn; |
---|
| 146 | F_R = Fs*Rs; |
---|
| 147 | tid = 0 + ideal(F_R); |
---|
| 148 | if (tid[1]==0) {d_max=1;} //finished ? |
---|
[82716e] | 149 | setring `myOx`; |
---|
[f1201a] | 150 | matrix Fs,Rs,Cup,Cup',F_R,homFR,New,Rn,Fn; |
---|
| 151 | module hom'; |
---|
[82716e] | 152 | ideal null,tid; attrib(null,"isSB",1); |
---|
| 153 | setring `myQx`; |
---|
| 154 | poly X_s = imap(Po,X_s); |
---|
| 155 | matrix Cup,Cup',MASS; |
---|
[f1201a] | 156 | ideal tid,null; attrib(null,"isSB",1); |
---|
[82716e] | 157 | ideal J,m_J; attrib(J,"isSB",1); |
---|
[f1201a] | 158 | attrib(m_J,"isSB",1); |
---|
[82716e] | 159 | matrix PreO = imap(Po,PreO); |
---|
[f1201a] | 160 | module PreO'= imap(Po,PreO'); attrib(PreO',"isSB",1); |
---|
| 161 | module PreT = imap(Po,PreT); attrib(PreT,"isSB",1); |
---|
[0b59f5] | 162 | matrix kbT_2 = imap(Po,kbT_2); |
---|
[f1201a] | 163 | matrix Mon = fetch(`myPx`,Mon); |
---|
| 164 | matrix F_R = fetch(`myPx`,F_R); |
---|
| 165 | matrix Js[1][@t2]; |
---|
[3d124a7] | 166 | //------- start the loop ------------------------------------------------------ |
---|
[f1201a] | 167 | for (@d=2;@d<=d_max;@d=@d+1) |
---|
[3d124a7] | 168 | { |
---|
[f1201a] | 169 | if( @t1==0) {break}; |
---|
[82716e] | 170 | dbprint(p,"// start computation in degree "+string(@d)+"."); |
---|
[f0c6f4] | 171 | dbprint(p-3,">>> TIME = "+string(timer-time)); |
---|
| 172 | dbprint(p-3,"==> memory = "+string(kmemory())+"k"); |
---|
[f1201a] | 173 | //------- compute obstruction-vector ----------------------------------------- |
---|
| 174 | if (@smooth) { @noObstr=1;} |
---|
| 175 | else |
---|
[82716e] | 176 | { Cup = jet(F_R,@d,@jv); |
---|
| 177 | Cup = matrix(reduce(ideal(Cup),m_J),@colR,1); |
---|
| 178 | Cup = jet(Cup,@d,@jv); |
---|
| 179 | } |
---|
[0b59f5] | 180 | //------- express obstructions in kbase of T_2 -------------------------------- |
---|
[f1201a] | 181 | if ( @noObstr==0 ) |
---|
| 182 | { Cup' = reduce(Cup,PreO'); |
---|
| 183 | tid = simplify(ideal(Cup'),10); |
---|
| 184 | if(tid[1]!=0) |
---|
| 185 | { dbprint(p-4,"// *"); |
---|
| 186 | Cup=Cup-Cup'; |
---|
| 187 | } |
---|
| 188 | Cup = lift(PreO,Cup); |
---|
[0b59f5] | 189 | MASS = lift_rel_kb(Cup,PreT,kbT_2,X_s); |
---|
[82716e] | 190 | dbprint(p-3,"// next MASSEY-products:",MASS-jet(MASS,@d-1,@jv)); |
---|
[f1201a] | 191 | if (MASS==transpose(Js)) |
---|
[82716e] | 192 | { @noObstr=1;dbprint(p-1,"// no obstruction"); } |
---|
[f1201a] | 193 | else { @noObstr=0; } |
---|
[6f2edc] | 194 | } |
---|
[f1201a] | 195 | //------- obtain equations of base space -------------------------------------- |
---|
| 196 | if ( @noObstr==0 ) |
---|
| 197 | { Js = transpose(MASS); |
---|
| 198 | dbprint(p-2,"// next equation of base space:", |
---|
| 199 | simplify(ideal(Js),10)); |
---|
| 200 | setring `myPx`; |
---|
| 201 | Js = imap(`myQx`,Js); |
---|
[82716e] | 202 | degBound = @d+1; |
---|
[f1201a] | 203 | J = std(ideal(Js)); |
---|
| 204 | m_J = std(J*ideal(Mon)); |
---|
| 205 | degBound = 0; |
---|
| 206 | //--------------- obtain new base-ring ---------------------------------------- |
---|
| 207 | kill `myOx`; |
---|
[c67136] | 208 | if(system("with","Namespaces")==1) { kill Top::`myOx`; } |
---|
[82716e] | 209 | qring `myOx` = J; |
---|
[f1201a] | 210 | matrix Fs,Rs,F_R,Cup,Cup',homFR,New,Rn,Fn; |
---|
| 211 | module hom'; |
---|
| 212 | ideal null,tid; attrib(null,"isSB",1); |
---|
[3d124a7] | 213 | } |
---|
[f1201a] | 214 | //---------------- lift equations F and relations R --------------------------- |
---|
| 215 | setring `myOx`; |
---|
[82716e] | 216 | Fs = fetch(`myPx`,Fs); |
---|
| 217 | Rs = fetch(`myPx`,Rs); |
---|
| 218 | F_R = Fs*Rs; |
---|
| 219 | F_R = matrix(reduce(ideal(F_R),null)); |
---|
[f1201a] | 220 | tid = 0 + ideal(F_R); |
---|
[82716e] | 221 | if (tid[1]==0) { dbprint(p-1,"// finished"); break;} |
---|
| 222 | Cup = (-1)*transpose(jet(F_R,@d,@jv)); |
---|
| 223 | homFR = fetch(`myPx`,homFR); |
---|
[f1201a] | 224 | hom' = fetch(`myPx`,hom'); attrib(hom',"isSB",1); |
---|
| 225 | Cup' = simplify(reduce(Cup,hom'),10); |
---|
| 226 | tid = simplify(ideal(Cup'),10); |
---|
| 227 | if (tid[1]!=0) |
---|
| 228 | { dbprint(p-4,"// #"); |
---|
| 229 | Cup=Cup-Cup'; |
---|
[6f2edc] | 230 | } |
---|
[f1201a] | 231 | New = lift(homFR,Cup); |
---|
| 232 | Rn = matrix(ideal(New[1+@rowR..nrows(New),1]),@rowR,@colR); |
---|
| 233 | Fn = matrix(ideal(New[1..@rowR,1]),1,@rowR); |
---|
| 234 | Fs = Fs+Fn; |
---|
| 235 | Rs = Rs+Rn; |
---|
| 236 | F_R = Fs*Rs; |
---|
[82716e] | 237 | tid = 0+reduce(ideal(F_R),null); |
---|
[f1201a] | 238 | //---------------- fetch results into other rings ----------------------------- |
---|
| 239 | setring `myPx`; |
---|
| 240 | Fs = fetch(`myOx`,Fs); |
---|
| 241 | Rs = fetch(`myOx`,Rs); |
---|
| 242 | F_R = Fs*Rs; |
---|
| 243 | setring `myQx`; |
---|
| 244 | F_R = fetch(`myPx`,F_R); |
---|
| 245 | m_J = fetch(`myPx`,m_J); attrib(m_J,"isSB",1); |
---|
| 246 | J = fetch(`myPx`,J); attrib(J,"isSB",1); |
---|
[82716e] | 247 | Js = fetch(`myPx`,Js); |
---|
| 248 | tid = fetch(`myOx`,tid); |
---|
| 249 | if (tid[1]==0) { dbprint(p-1,"// finished");break;} |
---|
[6f2edc] | 250 | } |
---|
[f1201a] | 251 | //--------- end loop and final output ---------------------------------------- |
---|
| 252 | setring `myPx`; |
---|
| 253 | if (@out!="no") |
---|
| 254 | { string out = @out+"_"+string(@d); |
---|
[82716e] | 255 | "// writing file "+out+" with matrix Js, matrix Fs, matrix Rs ready |
---|
[f1201a] | 256 | for reading in rings "+myPx+" or "+myQx; |
---|
| 257 | write(out,"matrix Js[1][",@t2,"]=",Js,";matrix Fs[1][",@rowR,"]=",Fs, |
---|
| 258 | ";matrix Rs[",@rowR,"][",@colR,"]=",Rs,";"); |
---|
[82716e] | 259 | } |
---|
[f0c6f4] | 260 | dbprint(p-3,">>> TIME = "+string(timer-time)); |
---|
[f1201a] | 261 | if (@is_qh != 0) |
---|
| 262 | { @degr = qhweight(ideal(Js)); |
---|
| 263 | @degr = @degr[1..t1']; |
---|
| 264 | dbprint(p-1,"// quasi-homogeneous weights of miniversal base",@degr); |
---|
[82716e] | 265 | } |
---|
[f1201a] | 266 | dbprint(p-1, |
---|
| 267 | "// ___ Equations of miniversal base space ___",Js, |
---|
| 268 | "// ___ Equations of miniversal total space ___",Fs); |
---|
| 269 | dbprint(p,"","// Result belongs to ring "+myPx+".", |
---|
| 270 | "// Equations of total space of miniversal deformation are ", |
---|
| 271 | "// given by Fs, equations of miniversal base space by Js.", |
---|
| 272 | "// Make "+myPx+" the basering and list objects defined in " |
---|
| 273 | +myPx+" by typing:", |
---|
| 274 | " setring "+myPx+"; show("+myPx+");"," listvar(matrix);", |
---|
| 275 | "// NOTE: rings "+myQx+", "+myPx+", "+mySo+" are alive!", |
---|
[82716e] | 276 | "// (use 'kill_rings(\""+@my+"\");' to remove)"); |
---|
[f1201a] | 277 | return(); |
---|
[3d124a7] | 278 | } |
---|
[6f2edc] | 279 | example |
---|
[3d124a7] | 280 | { "EXAMPLE:"; echo = 2; |
---|
[6f2edc] | 281 | int p = printlevel; |
---|
[f1201a] | 282 | printlevel = 0; |
---|
[6f2edc] | 283 | ring r1 = 0,(x,y,z,u,v),ds; |
---|
| 284 | matrix m[2][4] = x,y,z,u,y,z,u,v; |
---|
[82716e] | 285 | ideal Fo = minor(m,2); |
---|
[f1201a] | 286 | // cone over rational normal curve of degree 4 |
---|
| 287 | versal(Fo); |
---|
| 288 | setring Px; |
---|
[6f2edc] | 289 | // ___ Equations of miniversal base space ___: |
---|
[f1201a] | 290 | Js;""; |
---|
[6f2edc] | 291 | // ___ Equations of miniversal total space ___: |
---|
[f1201a] | 292 | Fs;""; |
---|
[6f2edc] | 293 | } |
---|
[3d124a7] | 294 | /////////////////////////////////////////////////////////////////////////////// |
---|
[f1201a] | 295 | proc mod_versal(matrix Mo, ideal I, list #) |
---|
[d2b2a7] | 296 | " |
---|
[82716e] | 297 | USAGE: mod_versal(Mo,I[,d,any]); I=ideal, M=module, d=int, any =list |
---|
[f1201a] | 298 | COMUPTE: miniversal deformation of coker(Mo) over Qo=Po/Io, Po=basering; |
---|
| 299 | CREATE: Ringsr (exported): |
---|
[3fe3582] | 300 | 'my'Px = extending the basering by new variables (deformation |
---|
| 301 | parameters), the new variables come before the old ones, |
---|
| 302 | the ordering is the product between \"my_ord\" |
---|
| 303 | and \"ord(Po)\" |
---|
| 304 | @*'my'Qx = Px/Io extending Qo (returns as basering), |
---|
| 305 | @*'my'Ox = Px/(Io+Js) ring of the versal deformation of coker(Ms), |
---|
| 306 | @*'my'So = embedding-ring of the versal base space. (default 'my'=\"\") |
---|
| 307 | |
---|
[f1201a] | 308 | Matrices (in Qx, exported): |
---|
[3fe3582] | 309 | @*Js = giving the versal base space (obstructions), |
---|
| 310 | @*Ms = giving the versal family of Mo, |
---|
| 311 | @*Ls = giving the lifting of syzygies Lo=syz(Mo), |
---|
| 312 | |
---|
[f1201a] | 313 | If d is defined (!=0), it computes up to degree d. |
---|
[3fe3582] | 314 | @*If 'any' is defined and any[1] is no string, interactive version. |
---|
| 315 | @*Otherwise 'any' gives predefined strings:\"my\",\"param\",\"order\",\"out\" |
---|
[d2b2a7] | 316 | (\"my\" prefix-string, \"param\" is a letter (e.g. \"A\") for the name of |
---|
[82716e] | 317 | first parameter or (e.g. \"A(\") for index parameter variables, \"ord\" |
---|
[d2b2a7] | 318 | ordering string for ringextension), \"out\" name of output-file). |
---|
[f1201a] | 319 | NOTE: printlevel < 0 no output at all, |
---|
[82716e] | 320 | printlevel >=0,1,2,.. informs you, what is going on, |
---|
[f1201a] | 321 | this proc uses 'execute'. |
---|
| 322 | EXAMPLE:example mod_versal; shows an example |
---|
[d2b2a7] | 323 | " |
---|
[3d124a7] | 324 | { |
---|
[f1201a] | 325 | //------- prepare ------------------------------------------------------------- |
---|
| 326 | string str,@param,@order,@my,@out,@degrees; |
---|
| 327 | int @d,d_max,f0,f1,f2,e1,e1',e2,ok_ann,@smooth,@noObstr,@size,@j; |
---|
| 328 | int p = printlevel-voice+3; |
---|
| 329 | int time = timer; |
---|
| 330 | intvec @iv,@jv,@is_qh,@degr; |
---|
[82716e] | 331 | d_max = 100; |
---|
[f1201a] | 332 | @my = ""; @param="A"; @order="ds"; @out="no"; |
---|
| 333 | @size = size(#); |
---|
| 334 | if( @size>0 ) { d_max = #[1]; } |
---|
[82716e] | 335 | if( @size>1 ) |
---|
| 336 | { if(typeof(#[2])!="string") |
---|
[f1201a] | 337 | { string @active; |
---|
| 338 | @my,@param,@order,@out = interact1(); |
---|
| 339 | } |
---|
| 340 | else |
---|
| 341 | { @my = #[2]; |
---|
| 342 | if (@size>2) {@param = #[3];} |
---|
| 343 | if (@size>3) {@order = #[4];} |
---|
| 344 | if (@size>4) {@out = #[5];} |
---|
| 345 | } |
---|
[82716e] | 346 | } |
---|
[f1201a] | 347 | string myPx = @my+"Px"; |
---|
| 348 | string myQx = @my+"Qx"; |
---|
| 349 | string myOx = @my+"Ox"; |
---|
| 350 | string mySo = @my+"So"; |
---|
| 351 | @is_qh = qhweight(I); |
---|
| 352 | def Po = basering; |
---|
| 353 | setring Po; |
---|
| 354 | poly X_s = product(maxideal(1)); |
---|
| 355 | //-------- compute Ext's ------------------------------------------------------ |
---|
| 356 | I = std(I); |
---|
[82716e] | 357 | qring Qo = I; |
---|
[f1201a] | 358 | matrix Mo = fetch(Po,Mo); |
---|
[82716e] | 359 | list Lo = compute_ext(Mo,p); |
---|
[f1201a] | 360 | f0,f1,f2,e1,e2,ok_ann=Lo[1]; |
---|
| 361 | matrix Ls,kb1,lift1 = Lo[2],Lo[3],Lo[4]; |
---|
| 362 | matrix kb2,C',D' = Lo[5][2],Lo[5][3],Lo[5][5]; |
---|
| 363 | module ex2,Co,Do = Lo[5][1],Lo[5][4],Lo[5][6]; |
---|
| 364 | kill Lo; |
---|
| 365 | dbprint(p,"// ready: Ext1 and Ext2"); |
---|
| 366 | //----- test: quasi-homogeneous, choice of inf. def.-------------------------- |
---|
[82716e] | 367 | @degrees = homog_test(@is_qh,Mo,kb1); |
---|
[f1201a] | 368 | e1' = e1; @jv = 1..e1; |
---|
[82716e] | 369 | if (@degrees != "") |
---|
[f1201a] | 370 | { dbprint(p-1,"// Ext1 is quasi-homogeneous represented: "+@degrees); |
---|
| 371 | } |
---|
| 372 | if (defined(@active)) |
---|
| 373 | { "// kbase of Ext1:"; |
---|
[82716e] | 374 | print(kb1); |
---|
[f1201a] | 375 | "// weights of kbase of Ext1 ( empty = 'not qhomog')";@degrees; |
---|
| 376 | kb1,lift1,e1' = interact2(kb1,@jv,lift1); |
---|
[82716e] | 377 | } |
---|
[f1201a] | 378 | //-------- get new rings and objects ------------------------------------------ |
---|
| 379 | setring Po; |
---|
| 380 | get_rings(I,e1',0,@my,@order,@param); |
---|
| 381 | setring `myPx`; |
---|
| 382 | ideal J,m_J; |
---|
| 383 | ideal I_J = imap(Po,I); |
---|
| 384 | ideal Io = I_J; |
---|
| 385 | matrix Mon[e1'][1] = maxideal(1); |
---|
[82716e] | 386 | matrix Ms = imap(Qo,Mo); |
---|
| 387 | matrix Ls = imap(Qo,Ls); |
---|
| 388 | matrix Js[1][e2]; |
---|
[f1201a] | 389 | setring `myQx`; |
---|
| 390 | ideal J,I_J,tet,null; attrib(null,"isSB",1); |
---|
| 391 | ideal m_J = fetch(`myPx`,m_J); attrib(m_J,"isSB",1); |
---|
| 392 | @jv=0; @jv[e1] = 0; @jv = @jv+1; @jv[nvars(`myPx`)] = 0; |
---|
[82716e] | 393 | matrix Ms = imap(Qo,Mo); export(Ms); |
---|
[f1201a] | 394 | matrix Ls = imap(Qo,Ls); export(Ls); |
---|
| 395 | matrix Js[e2][1]; export(Js); |
---|
[82716e] | 396 | matrix MASS; |
---|
[f1201a] | 397 | matrix Mon = fetch(`myPx`,Mon); |
---|
| 398 | matrix Mn,Ln,ML,Cup,Cup',Lift; |
---|
| 399 | matrix C' = imap(Qo,C'); |
---|
| 400 | module Co = imap(Qo,Co); attrib(Co,"isSB",1); |
---|
| 401 | module ex2 = imap(Qo,ex2); attrib(ex2,"isSB",1); |
---|
| 402 | matrix D' = imap(Qo,D'); |
---|
| 403 | module Do = imap(Qo,Do); attrib(Do,"isSB",1); |
---|
[82716e] | 404 | matrix kb2 = imap(Qo,kb2); |
---|
[f1201a] | 405 | matrix kb1 = imap(Qo,kb1); |
---|
| 406 | matrix lift1= imap(Qo,lift1); |
---|
| 407 | poly X_s = imap(Po,X_s); |
---|
[82716e] | 408 | intvec intv = e1',e1,f0,f1,f2; |
---|
| 409 | Ms,Ls= get_inf_def(Ms,Ls,kb1,lift1,X_s); |
---|
[f1201a] | 410 | kill kb1,lift1; |
---|
| 411 | dbprint(p-1,"// infinitesimal extension",Ms); |
---|
| 412 | //----------- start the loop -------------------------------------------------- |
---|
| 413 | for (@d=2;@d<=d_max;@d=@d+1) |
---|
[82716e] | 414 | { |
---|
[f0c6f4] | 415 | dbprint(p-3,">>> time = "+string(timer-time)); |
---|
| 416 | dbprint(p-3,"==> memory = "+string(memory(0)/1000)+ |
---|
[f1201a] | 417 | ", allocated = "+string(memory(1)/1000)); |
---|
[82716e] | 418 | dbprint(p,"// start deg = "+string(@d)); |
---|
[f1201a] | 419 | //-------- get obstruction ---------------------------------------------------- |
---|
| 420 | Cup = matrix(ideal(Ms*Ls),f0*f2,1); |
---|
| 421 | Cup = jet(Cup,@d,@jv); |
---|
| 422 | Cup = reduce(ideal(Cup),m_J); |
---|
| 423 | Cup = jet(Cup,@d,@jv); |
---|
| 424 | //-------- express obstruction in kbase --------------------------------------- |
---|
| 425 | Cup' = reduce(Cup,Do); |
---|
| 426 | tet = simplify(ideal(Cup'),10); |
---|
[82716e] | 427 | if (tet[1]!=0) |
---|
[f1201a] | 428 | { dbprint(p-4,"// *"); |
---|
| 429 | Cup = Cup-Cup'; |
---|
| 430 | } |
---|
| 431 | Cup = lift(D',Cup); |
---|
| 432 | if (ok_ann) |
---|
| 433 | { MASS = lift_rel_kb(Cup,ex2,kb2,X_s);} |
---|
| 434 | else |
---|
[82716e] | 435 | { MASS = reduce(Cup,ex2);} |
---|
[f1201a] | 436 | dbprint(p-3,"// next MATRIC-MASSEY-products", |
---|
| 437 | MASS-jet(MASS,@d-1,@jv)); |
---|
| 438 | if ( MASS==transpose(Js)) |
---|
| 439 | { @noObstr = 1;dbprint(p-1,"//no obstruction"); } |
---|
[82716e] | 440 | else { @noObstr = 0; } |
---|
[f1201a] | 441 | //-------- obtain equations of base space ------------------------------------- |
---|
| 442 | if (@noObstr == 0) |
---|
| 443 | { Js = MASS; |
---|
| 444 | dbprint(p-2,"// next equation of base space:",simplify(ideal(Js),10)); |
---|
| 445 | setring `myPx`; |
---|
| 446 | Js = imap(`myQx`,Js); |
---|
| 447 | degBound=@d+1; |
---|
| 448 | J = std(ideal(Js)); |
---|
| 449 | m_J = std(ideal(Mon)*J); |
---|
| 450 | degBound=0; |
---|
| 451 | I_J = Io,J; attrib(I_J,"isSB",1); |
---|
[82716e] | 452 | //-------- obtain new base ring ----------------------------------------------- |
---|
[f1201a] | 453 | kill `myOx`; |
---|
[c67136] | 454 | if(system("with","Namespaces")==1) { |
---|
| 455 | if(defined(Top::`myOx`)) { kill Top::`myOx`; } |
---|
| 456 | } |
---|
[82716e] | 457 | qring `myOx` = I_J; |
---|
[f1201a] | 458 | ideal null,tet; attrib(null,"isSB",1); |
---|
| 459 | matrix Ms = imap(`myQx`,Ms); |
---|
| 460 | matrix Ls = imap(`myQx`,Ls); |
---|
| 461 | matrix Mn,Ln,ML,Cup,Cup',Lift; |
---|
[82716e] | 462 | matrix C' = imap(Qo,C'); |
---|
[f1201a] | 463 | module Co = imap(Qo,Co); attrib(Co,"isSB",1); |
---|
| 464 | module ex2 = imap(Qo,ex2); attrib(ex2,"isSB",1); |
---|
| 465 | matrix kb2 = imap(Qo,kb2); |
---|
| 466 | poly X_s = imap(Po,X_s); |
---|
[82716e] | 467 | } |
---|
[f1201a] | 468 | //-------- get lifts ---------------------------------------------------------- |
---|
| 469 | setring `myOx`; |
---|
| 470 | ML = matrix(reduce(ideal(Ms*Ls),null),f0,f2); |
---|
| 471 | Cup = matrix(ideal(ML),f0*f2,1); |
---|
| 472 | Cup = jet(Cup,@d,@jv); |
---|
| 473 | Cup'= reduce(Cup,Co); |
---|
[82716e] | 474 | tet = simplify(ideal(Cup'),10); |
---|
| 475 | if (tet[1]!=0) |
---|
[f1201a] | 476 | { dbprint(p-4,"// #"); |
---|
| 477 | Cup = Cup-Cup'; |
---|
| 478 | } |
---|
[82716e] | 479 | Lift = lift(C',Cup); |
---|
[f1201a] | 480 | Mn = matrix(ideal(Lift),f0,f1); |
---|
| 481 | Ln = matrix(ideal(Lift[f0*f1+1..nrows(Lift),1]),f1,f2); |
---|
| 482 | Ms = Ms-Mn; |
---|
| 483 | Ls = Ls-Ln; |
---|
| 484 | dbprint(p-3,"// next extension of Mo",Mn); |
---|
| 485 | dbprint(p-3,"// next extension of syz(Mo)",Ln); |
---|
| 486 | ML = reduce(ideal(Ms*Ls),null); |
---|
[82716e] | 487 | //--------- test: finished ---------------------------------------------------- |
---|
[f1201a] | 488 | tet = simplify(ideal(ML),10); |
---|
| 489 | if (tet[1]==0) { dbprint(p-1,"// finished in degree ",@d);} |
---|
| 490 | //---------fetch results into Qx and Px --------------------------------------- |
---|
| 491 | setring `myPx`; |
---|
| 492 | Ms = fetch(`myOx`,Ms); |
---|
[82716e] | 493 | Ls = fetch(`myOx`,Ls); |
---|
[f1201a] | 494 | setring `myQx`; |
---|
| 495 | Ms = fetch(`myOx`,Ms); |
---|
[82716e] | 496 | Ls = fetch(`myOx`,Ls); |
---|
[f1201a] | 497 | ML = Ms*Ls; |
---|
[82716e] | 498 | ML = matrix(reduce(ideal(ML),null),f0,f2); |
---|
[f1201a] | 499 | tet = imap(`myOx`,tet); |
---|
| 500 | if (tet[1]==0) { break;} |
---|
[82716e] | 501 | } |
---|
| 502 | //------- end of loop, final output ------------------------------------------- |
---|
[f1201a] | 503 | if (@out != "no") |
---|
| 504 | { string out = @out+"_"+string(@d); |
---|
[82716e] | 505 | "// writing file '"+out+"' with matrix Js, matrix Ms, matrix Ls |
---|
[f1201a] | 506 | ready for reading in rings "+myPx+" or "+myQx; |
---|
| 507 | write(out,"matrix Js[1][",e2,"]=",Js,";matrix Ms[",f0,"][",f1,"]=",Ms, |
---|
| 508 | ";matrix Ls[",f1,"][",f2,"]=",Ls,";"); |
---|
| 509 | } |
---|
[f0c6f4] | 510 | dbprint(p-3,">>> TIME = "+string(timer-time)); |
---|
[f1201a] | 511 | if (@is_qh != 0) |
---|
| 512 | { @degr = qhweight(ideal(Js)); |
---|
| 513 | @degr = @degr[1..e1']; |
---|
| 514 | dbprint(p-1,"// quasi-homogeneous weights of miniversal base",@degr); |
---|
[82716e] | 515 | } |
---|
[f1201a] | 516 | dbprint(p-1,"// Result belongs to qring "+myQx, |
---|
| 517 | "// Equations of total space of miniversal deformation are in Js", |
---|
| 518 | simplify(ideal(Js),10), |
---|
| 519 | "// Matrix of the deformed module is Ms and lifted syzygies are Ls.", |
---|
| 520 | "// Make "+myQx+" the basering and list objects defined in "+myQx+ |
---|
| 521 | " by typing:", |
---|
| 522 | " listvar(ring);setring "+myQx+"; show("+myQx+");listvar(ideal);"+ |
---|
| 523 | "listvar(matrix);", |
---|
| 524 | "// NOTE: rings "+myQx+", "+myOx+", "+mySo+" are still alive!", |
---|
| 525 | "// (use: 'kill_rings("+@my+");' to remove them)"); |
---|
| 526 | return(); |
---|
[3d124a7] | 527 | } |
---|
[6f2edc] | 528 | example |
---|
[3d124a7] | 529 | { "EXAMPLE:"; echo = 2; |
---|
[f1201a] | 530 | int p = printlevel; |
---|
| 531 | printlevel = 1; |
---|
| 532 | ring Ro = 0,(x,y),wp(3,4); |
---|
| 533 | ideal Io = x4+y3; |
---|
| 534 | matrix Mo[2][2] = x2,y,-y2,x2; |
---|
| 535 | mod_versal(Mo,Io); |
---|
| 536 | printlevel = p; |
---|
[c67136] | 537 | if(system("with","Namespaces")) { kill Ring::Px,Top::Qx,Ring::So; } |
---|
[82716e] | 538 | kill Px,Qx,So; |
---|
[3d124a7] | 539 | } |
---|
[82716e] | 540 | //============================================================================= |
---|
[3d124a7] | 541 | /////////////////////////////////////////////////////////////////////////////// |
---|
[f1201a] | 542 | proc kill_rings(list #) |
---|
[d2b2a7] | 543 | "USAGE: kill_rings([string]); |
---|
[3fe3582] | 544 | RETURN: nothing, but kills exported rings generated by procedures |
---|
| 545 | 'versal' and 'mod_versal' with optional prefix 'string' |
---|
[d2b2a7] | 546 | " |
---|
[3d124a7] | 547 | { |
---|
[f1201a] | 548 | string my,br; |
---|
| 549 | if (size(#)>0) { my = #[1];} |
---|
| 550 | string na=nameof(basering); |
---|
| 551 | br = my+"Qx"; |
---|
| 552 | if (defined(`br`)) { kill `br`;} |
---|
| 553 | br = my+"Px"; |
---|
| 554 | if (defined(`br`)) { kill `br`;} |
---|
| 555 | br = my+"So"; |
---|
| 556 | if (defined(`br`)) { kill `br`;} |
---|
| 557 | br = my+"Ox"; |
---|
| 558 | if (defined(`br`)) { kill `br`;} |
---|
| 559 | br = my+"Sx"; |
---|
| 560 | if (defined(`br`)) { kill `br`} |
---|
[917fb5] | 561 | if(system("with","Namespaces")) |
---|
| 562 | { |
---|
[c67136] | 563 | br = my+"Qx"; |
---|
| 564 | if (defined(Top::`br`)) { kill Top::`br`;} |
---|
| 565 | br = my+"Ox"; |
---|
| 566 | if (defined(Top::`br`)) { kill Top::`br`;} |
---|
| 567 | br = my+"Px"; |
---|
| 568 | if (defined(Ring::`br`)) { kill Ring::`br`;} |
---|
| 569 | br = my+"So"; |
---|
| 570 | if (defined(Ring::`br`)) { kill Ring::`br`;} |
---|
| 571 | } |
---|
[f1201a] | 572 | if (defined(basering)==0) |
---|
| 573 | { "// choose new basering?"; |
---|
[c67136] | 574 | if(system("with","Namespaces")) { listvar(Top,ring); } |
---|
| 575 | else { listvar(ring); } |
---|
[f1201a] | 576 | } |
---|
| 577 | return(); |
---|
[3d124a7] | 578 | } |
---|
| 579 | /////////////////////////////////////////////////////////////////////////////// |
---|
[f1201a] | 580 | proc compute_ext(matrix Mo,int p) |
---|
[d2b2a7] | 581 | " |
---|
[f1201a] | 582 | Sub-procedure: obtain Ext1 and Ext2 and other objects used by mod_versal |
---|
[d2b2a7] | 583 | " |
---|
[82716e] | 584 | { |
---|
[f1201a] | 585 | int l,f0,f1,f2,f3,e1,e2,ok_ann; |
---|
| 586 | module Co,Do,ima,ex1,ex2; |
---|
[82716e] | 587 | matrix M0,M1,M2,ker,kb1,lift1,kb2,A,B,C,D; |
---|
[f1201a] | 588 | //------- resM --------------------------------------------------------------- |
---|
[3939bc] | 589 | list resM = nres(Mo,3); |
---|
[f1201a] | 590 | M0 = resM[1]; |
---|
| 591 | M1 = resM[2]; |
---|
| 592 | M2 = resM[3]; kill resM; |
---|
| 593 | f0 = nrows(M0); |
---|
| 594 | f1 = ncols(M0); |
---|
| 595 | f2 = ncols(M1); |
---|
| 596 | f3 = ncols(M2); |
---|
| 597 | //------ compute Ext^2 ------------------------------------------------------ |
---|
[82716e] | 598 | B = kohom(M0,f3); |
---|
[f1201a] | 599 | A = kontrahom(M2,f0); |
---|
[82716e] | 600 | D = modulo(A,B); |
---|
| 601 | Do = std(D); |
---|
[f1201a] | 602 | ima = kohom(M0,f2),kontrahom(M1,f0); |
---|
| 603 | ex2 = modulo(D,ima); |
---|
| 604 | ex2 = std(ex2); |
---|
| 605 | e2 = vdim(ex2); |
---|
| 606 | kb2 = kbase(ex2); |
---|
| 607 | dbprint(p,"// vdim (Ext^2) = "+string(e2)); |
---|
| 608 | //------ test: max = Ann(Ext2) ----------------------------------------------- |
---|
| 609 | for (l=1;l<=e2;l=l+1) |
---|
| 610 | { ok_ann = ok_ann+ord(kb2[l]); |
---|
| 611 | } |
---|
| 612 | if (ok_ann==0) |
---|
[82716e] | 613 | { e2 =nrows(ex2); |
---|
[f1201a] | 614 | dbprint(p,"// Ann(Ext2) is maximal"); |
---|
| 615 | } |
---|
| 616 | //------ compute Ext^1 ------------------------------------------------------- |
---|
[82716e] | 617 | B = kohom(M0,f2); |
---|
[f1201a] | 618 | A = kontrahom(M1,f0); |
---|
| 619 | ker = modulo(A,B); |
---|
[82716e] | 620 | ima = kohom(M0,f1),kontrahom(M0,f0); |
---|
[f1201a] | 621 | ex1 = modulo(ker,ima); |
---|
| 622 | ex1 = std(ex1); |
---|
| 623 | e1 = vdim(ex1); |
---|
| 624 | dbprint(p,"// vdim (Ext^1) = "+string(e1)); |
---|
| 625 | kb1 = kbase(ex1); |
---|
| 626 | kb1 = ker*kb1; |
---|
| 627 | C = concat(A,B); |
---|
| 628 | Co = std(C); |
---|
| 629 | //------ compute the liftings of Ext^1 --------------------------------------- |
---|
| 630 | lift1 = A*kb1; |
---|
[82716e] | 631 | lift1 = lift(B,lift1); |
---|
[f1201a] | 632 | intvec iv = f0,f1,f2,e1,e2,ok_ann; |
---|
| 633 | list L' = ex2,kb2,C,Co,D,Do; |
---|
| 634 | return(iv,M1,kb1,lift1,L'); |
---|
[3d124a7] | 635 | } |
---|
[f1201a] | 636 | ////////////////////////////////////////////////////////////////////////////// |
---|
| 637 | proc get_rings(ideal Io,int e1,int switch, list #) |
---|
[d2b2a7] | 638 | " |
---|
[82716e] | 639 | Sub-procedure: creating ring-extensions |
---|
[d2b2a7] | 640 | " |
---|
[82716e] | 641 | { |
---|
| 642 | def Po = basering; |
---|
[f1201a] | 643 | string my; |
---|
| 644 | string my_ord = "ds"; |
---|
[82716e] | 645 | string my_var = "A"; |
---|
[f1201a] | 646 | if (size(#)>2) |
---|
[3d124a7] | 647 | { |
---|
[f1201a] | 648 | my = #[1]; |
---|
| 649 | my_ord = #[2]; |
---|
| 650 | my_var = #[3]; |
---|
[3d124a7] | 651 | } |
---|
[82716e] | 652 | string my_Px = my+"Px"; |
---|
| 653 | string my_Qx = my+"Qx"; |
---|
| 654 | string my_Ox = my+"Ox"; |
---|
| 655 | string my_So = my+"So"; |
---|
[f1201a] | 656 | extendring(my_Px,e1,my_var,my_ord); |
---|
| 657 | ideal Io = imap(Po,Io); attrib(Io,"isSB",1); |
---|
| 658 | my ="qring "+my_Qx+" = Io; export("+my_Qx+");"; |
---|
| 659 | execute(my); |
---|
| 660 | if (switch) |
---|
[3d124a7] | 661 | { |
---|
[f1201a] | 662 | setring `my_Px`; |
---|
| 663 | my = "qring "+my_Ox+" = std(ideal(0));export("+my_Ox+");"; |
---|
[3d124a7] | 664 | } |
---|
[f1201a] | 665 | else |
---|
[6f2edc] | 666 | { |
---|
[f1201a] | 667 | my = "def "+my_Ox+" = "+my_Qx+";export("+my_Ox+");"; |
---|
[3d124a7] | 668 | } |
---|
[f1201a] | 669 | execute(my); |
---|
| 670 | defring(my_So,charstr(Po),e1,my_var,my_ord); |
---|
| 671 | return(); |
---|
[3d124a7] | 672 | } |
---|
[f1201a] | 673 | ////////////////////////////////////////////////////////////////////////////// |
---|
[d2b2a7] | 674 | proc get_inf_def(list #) |
---|
| 675 | " |
---|
[82716e] | 676 | Sub-procedure: compute infinitesimal family of a module and its syzygies |
---|
[f1201a] | 677 | from a kbase of Ext1 and its lifts |
---|
[d2b2a7] | 678 | " |
---|
[f1201a] | 679 | { |
---|
| 680 | matrix Ms = #[1]; |
---|
| 681 | matrix Ls = #[2]; |
---|
| 682 | matrix kb1 = #[3]; |
---|
| 683 | matrix li1 = #[4]; |
---|
| 684 | int e1,f0,f1,f2; |
---|
| 685 | poly X_s = #[5]; |
---|
| 686 | e1 = ncols(kb1); |
---|
| 687 | f0 = nrows(Ms); |
---|
| 688 | f1 = nrows(Ls); |
---|
| 689 | f2 = ncols(Ls); |
---|
| 690 | int l; |
---|
| 691 | for (l=1;l<=e1;l=l+1) |
---|
| 692 | { |
---|
| 693 | Ms = Ms + var(l)*matrix(ideal(kb1[l]),f0,f1); |
---|
| 694 | Ls = Ls - var(l)*matrix(ideal(li1[l]),f1,f2); |
---|
| 695 | } |
---|
| 696 | return(Ms,Ls); |
---|
[82716e] | 697 | } |
---|
[f1201a] | 698 | ////////////////////////////////////////////////////////////////////////////// |
---|
| 699 | proc lift_rel_kb (module N, module M, list #) |
---|
[d2b2a7] | 700 | " |
---|
[3fe3582] | 701 | USAGE: lift_rel_kb(N,M[,kbaseM,p]); |
---|
| 702 | ASSUME: [p a monomial ] or the product of all variables |
---|
| 703 | N, M modules of same rank, |
---|
| 704 | M depending only on variables not in p and vdim(M) finite in this ring, |
---|
| 705 | [ kbaseM the kbase of M in the subring given by variables not in p ] |
---|
| 706 | warning: check that these assumtions are fulfilled! |
---|
| 707 | RETURN: matrix A, whose j-th columnes present the coeff's of N[j] in kbaseM, |
---|
| 708 | i.e. kbaseM*A = reduce(N,std(M)) |
---|
| 709 | EXAMPLE: example lift_rel_kb; shows examples |
---|
[d2b2a7] | 710 | " |
---|
[f1201a] | 711 | { |
---|
| 712 | poly p = product(maxideal(1)); |
---|
| 713 | M = std(M); |
---|
[82716e] | 714 | matrix A; |
---|
[f1201a] | 715 | if (size(#)>0) { p=#[2]; module kbaseM=#[1];} |
---|
[82716e] | 716 | else |
---|
[f1201a] | 717 | { if (vdim(M)<=0) { "// vdim(M) not finite";return(A);} |
---|
| 718 | module kbaseM = kbase(M); |
---|
| 719 | } |
---|
| 720 | N = reduce(N,M); |
---|
| 721 | if (simplify(N,10)[1]==[0]) {return(A);} |
---|
| 722 | A = coeffs(N,kbaseM,p); |
---|
| 723 | return(A); |
---|
[82716e] | 724 | } |
---|
[3d124a7] | 725 | example |
---|
[f1201a] | 726 | { |
---|
[3fe3582] | 727 | "EXAMPLE:"; echo=2; |
---|
[f1201a] | 728 | ring r=0,(A,B,x,y),dp; |
---|
| 729 | module M = [x2,xy],[xy,y3],[y2],[0,x]; |
---|
| 730 | module kbaseM = [1],[x],[xy],[y],[0,1],[0,y],[0,y2]; |
---|
| 731 | poly f=xy; |
---|
| 732 | module N = [AB,BBy],[A3xy+x4,AB*(1+y2)]; |
---|
| 733 | matrix A = lift_rel_kb(N,M,kbaseM,f); |
---|
| 734 | print(A); |
---|
| 735 | "TEST:"; |
---|
| 736 | print(matrix(kbaseM)*A-matrix(reduce(N,std(M)))); |
---|
[82716e] | 737 | } |
---|
[f0c6f4] | 738 | /////////////////////////////////////////////////////////////////////////////// |
---|
| 739 | proc lift_kbase (N, M) |
---|
[d2b2a7] | 740 | "USAGE: lift_kbase(N,M); N,M=poly/ideal/vector/module |
---|
[f0c6f4] | 741 | RETURN: matrix A, coefficient matrix expressing N as linear combination of |
---|
| 742 | k-basis of M. Let the k-basis have k elements and size(N)=c columns. |
---|
| 743 | Then A satisfies: |
---|
| 744 | matrix(reduce(N,std(M)),k,c) = matrix(kbase(std(M)))*A |
---|
| 745 | ASSUME: dim(M)=0 and the monomial ordering is a well ordering or the last |
---|
| 746 | block of the ordering is c or C |
---|
| 747 | EXAMPLE: example lift_kbase; shows an example |
---|
[d2b2a7] | 748 | " |
---|
[f0c6f4] | 749 | { |
---|
| 750 | return(lift_rel_kb(N,M)); |
---|
| 751 | } |
---|
| 752 | example |
---|
| 753 | {"EXAMPLE:"; echo=2; |
---|
| 754 | ring R=0,(x,y),ds; |
---|
| 755 | module M=[x2,xy],[y2,xy],[0,xx],[0,yy]; |
---|
| 756 | module N=[x3+xy,x],[x,x+y2]; |
---|
| 757 | print(M); |
---|
| 758 | module kb=kbase(std(M)); |
---|
| 759 | print(kb); |
---|
| 760 | print(N); |
---|
| 761 | matrix A=lift_kbase(N,M); |
---|
| 762 | print(A); |
---|
| 763 | matrix(reduce(N,std(M)),nrows(kb),ncols(A)) - matrix(kbase(std(M)))*A; |
---|
| 764 | } |
---|
| 765 | |
---|
| 766 | |
---|
[f1201a] | 767 | /////////////////////////////////////////////////////////////////////////////// |
---|
| 768 | proc interact1 () |
---|
[d2b2a7] | 769 | " |
---|
[82716e] | 770 | Sub_procedure: asking for and reading your input-strings |
---|
[d2b2a7] | 771 | " |
---|
[f1201a] | 772 | { |
---|
| 773 | string my = "@"; |
---|
| 774 | string str,out,my_ord,my_var; |
---|
| 775 | my_ord = "ds"; |
---|
[82716e] | 776 | my_var = "A"; |
---|
[f1201a] | 777 | "INPUT: name of output-file (ENTER = no output, do not use \"my\"!)"; |
---|
[82716e] | 778 | str = read(""); |
---|
| 779 | if (size(str)>1) |
---|
[f1201a] | 780 | { out = str[1..size(str)-1];} |
---|
| 781 | else |
---|
| 782 | { out = "no";} |
---|
| 783 | "INPUT: prefix-string of ring-extension (ENTER = '@')"; |
---|
[82716e] | 784 | str = read(""); |
---|
| 785 | if ( size(str) > 1 ) |
---|
| 786 | { my = str[1..size(str)-1]; } |
---|
| 787 | "INPUT:parameter-string |
---|
[f1201a] | 788 | (give a letter corresponding to first new variable followed by the next letters, |
---|
| 789 | or 'T(' - a letter + '(' - getting a string of indexed variables) |
---|
| 790 | (ENTER = A) :"; |
---|
[82716e] | 791 | str = read(""); |
---|
[f1201a] | 792 | if (size(str)>1) { my_var=str[1..size(str)-1]; } |
---|
| 793 | "INPUT:order-string (local or weighted!) (ENTER = ds) :"; |
---|
[82716e] | 794 | str = read(""); |
---|
| 795 | if (size(str)>1) { my_ord=str[1..size(str)-1]; } |
---|
[f1201a] | 796 | if( find(my_ord,"s")+find(my_ord,"w") == 0 ) |
---|
| 797 | { "// ordering must be an local! changed into 'ds'"; |
---|
| 798 | my_ord = "ds"; |
---|
| 799 | } |
---|
| 800 | return(my,my_var,my_ord,out); |
---|
[3d124a7] | 801 | } |
---|
| 802 | /////////////////////////////////////////////////////////////////////////////// |
---|
[f1201a] | 803 | proc interact2 (matrix A, intvec col_vec, list #) |
---|
[d2b2a7] | 804 | " |
---|
[f1201a] | 805 | Sub-procedure: asking for and reading your input |
---|
[d2b2a7] | 806 | " |
---|
[3d124a7] | 807 | { |
---|
[f1201a] | 808 | module B,C; |
---|
| 809 | matrix D; |
---|
| 810 | int flag; |
---|
| 811 | if (size(#)>0) { D=#[1];flag=1;} |
---|
| 812 | int t1 = ncols(A); |
---|
| 813 | ">>Do you want all deformations? (ENTER=yes)"; |
---|
| 814 | string str = read(""); |
---|
| 815 | if (size(str)>1) |
---|
| 816 | { ">> Choose columnes of the matrix"; |
---|
[82716e] | 817 | ">> (Enter = all columnes)"; |
---|
[f1201a] | 818 | "INPUT (number of columnes to use as integer-list 'i_1,i_2,.. ,i_t' ):"; |
---|
| 819 | string columnes = read(""); |
---|
| 820 | if (size(columnes)<2) {columnes=string(col_vec);} |
---|
| 821 | t1 = size(columnes)/2; |
---|
| 822 | int l,l1; |
---|
| 823 | for (l=1;l<=t1;l=l+1) |
---|
[3d124a7] | 824 | { |
---|
[f1201a] | 825 | execute("l1= "+columnes[2*l-1]+";"); |
---|
| 826 | B[l] = A[l1]; |
---|
[82716e] | 827 | if(flag) { C[l]=D[l1];} |
---|
[3d124a7] | 828 | } |
---|
[f1201a] | 829 | A = matrix(B,nrows(A),size(B)); |
---|
| 830 | D = matrix(C,nrows(D),size(C)); |
---|
[6f2edc] | 831 | } |
---|
[f1201a] | 832 | return(A,D,t1); |
---|
[6f2edc] | 833 | } |
---|
[f1201a] | 834 | /////////////////////////////////////////////////////////////////////////////// |
---|
| 835 | proc negative_part(intvec iv) |
---|
[d2b2a7] | 836 | " |
---|
[82716e] | 837 | RETURNS intvec of indices of jv having negative entries (or iv, if non) |
---|
[d2b2a7] | 838 | " |
---|
[f1201a] | 839 | { |
---|
| 840 | intvec jv; |
---|
| 841 | int l,k; |
---|
| 842 | for (l=1;l<=size(iv);l=l+1) |
---|
[82716e] | 843 | { if (iv[l]<0) |
---|
[f1201a] | 844 | { k = k+1; |
---|
| 845 | jv[k]=l; |
---|
| 846 | } |
---|
| 847 | } |
---|
[75089b] | 848 | if (jv==0) {jv=1; dbprint(printlevel-1,"// empty negative part, return all ");} |
---|
[f1201a] | 849 | return(jv); |
---|
[3d124a7] | 850 | } |
---|
| 851 | /////////////////////////////////////////////////////////////////////////////// |
---|
[f1201a] | 852 | proc find_ord(matrix A, intvec w_vec) |
---|
[d2b2a7] | 853 | " |
---|
[f1201a] | 854 | Sub-proc: return martix ord(a_ij) with respect to weight_vec, or |
---|
| 855 | 0 if A non-qh |
---|
[d2b2a7] | 856 | " |
---|
[f1201a] | 857 | { |
---|
| 858 | int @r = nrows(A); |
---|
| 859 | int @c = ncols(A); |
---|
| 860 | int i,j; |
---|
| 861 | string ord_str = "wp("+string(w_vec)+")"; |
---|
| 862 | def br = basering; |
---|
| 863 | changeord("nr",ord_str); |
---|
| 864 | matrix A = imap(br,A); |
---|
| 865 | intmat degA[@r][@c]; |
---|
[82716e] | 866 | if (homog(ideal(A))) |
---|
[f1201a] | 867 | { for (i=1;i<=@r;i=i+1) |
---|
| 868 | { for(j=1;j<=@c;j=j+1) |
---|
| 869 | { degA[i,j]=ord(A[i,j]); } |
---|
| 870 | } |
---|
| 871 | } |
---|
| 872 | setring br; |
---|
[c67136] | 873 | if(system("with","Namespaces")) { kill Ring::nr; } |
---|
[82716e] | 874 | kill nr; |
---|
[f1201a] | 875 | return(degA); |
---|
| 876 | } |
---|
| 877 | ////////////////////////////////////////////////////////////////////////////////// |
---|
| 878 | proc homog_test(intvec w_vec, matrix Mo, matrix A) |
---|
[d2b2a7] | 879 | " |
---|
[82716e] | 880 | Sub proc: return relative weight string of columnes of A with respect |
---|
| 881 | to the given w_vec and to Mo, or \"\" if not qh |
---|
[f1201a] | 882 | NOTE: * means weight is not determined |
---|
[d2b2a7] | 883 | " |
---|
[f1201a] | 884 | { |
---|
| 885 | int k,l; |
---|
| 886 | intvec tv; |
---|
| 887 | string @nv; |
---|
| 888 | int @r = nrows(A); |
---|
| 889 | int @c = ncols(A); |
---|
[82716e] | 890 | A = concat(matrix(ideal(Mo),@r,1),A); |
---|
| 891 | intmat a = find_ord(A,w_vec); |
---|
[f1201a] | 892 | intmat b[@r][@c]; |
---|
| 893 | for (l=1;l<=@c;l=l+1) |
---|
[82716e] | 894 | { |
---|
[f1201a] | 895 | for (k=1;k<=@r;k=k+1) |
---|
[82716e] | 896 | { if (A[k,l+1]!=0) |
---|
[f1201a] | 897 | { b[k,l] = a[k,l+1]-a[k,1];} |
---|
| 898 | } |
---|
| 899 | tv = 0; |
---|
| 900 | for (k=1;k<=@r;k=k+1) |
---|
[82716e] | 901 | { if (A[k,l+1]*A[k,1]!=0) |
---|
[f1201a] | 902 | {tv = tv,b[k,l];} |
---|
| 903 | } |
---|
| 904 | if (size(tv)>1) |
---|
[82716e] | 905 | { k = tv[2]; |
---|
[f1201a] | 906 | tv = tv[2..size(tv)]; tv = tv -k; |
---|
[82716e] | 907 | if (tv==0) { @nv = @nv+string(-k)+",";} |
---|
[f1201a] | 908 | else {return("");} |
---|
| 909 | } |
---|
| 910 | else { @nv = @nv+"*,";} |
---|
| 911 | } |
---|
| 912 | @nv = @nv[1..size(@nv)-1]; |
---|
| 913 | return(@nv); |
---|
| 914 | } |
---|
| 915 | ////////////////////////////////////////////////////////////////////////////////// |
---|
| 916 | proc homog_t(intvec d_vec, matrix Fo, matrix A) |
---|
[d2b2a7] | 917 | " |
---|
[82716e] | 918 | Sub-procedure: Computing relative (with respect to flatten(Fo)) weight_vec |
---|
[f1201a] | 919 | of columnes of A (return zero if Fo or A not qh) |
---|
[d2b2a7] | 920 | " |
---|
[f1201a] | 921 | { |
---|
| 922 | Fo = matrix(Fo,nrows(A),1); |
---|
| 923 | A = concat(Fo,A); |
---|
| 924 | A = transpose(A); |
---|
| 925 | def br = basering; |
---|
| 926 | string o_str = "wp("+string(d_vec)+")"; |
---|
| 927 | changeord("nr",o_str); |
---|
| 928 | module A = fetch(br,A); |
---|
| 929 | intvec dv; |
---|
| 930 | int l = homog(A) ; |
---|
[c67136] | 931 | if (l==0) { |
---|
| 932 | setring br; |
---|
| 933 | if(system("with","Namespaces")) { kill Ring::nr; } |
---|
| 934 | kill nr; |
---|
| 935 | return(l); |
---|
| 936 | } |
---|
[f1201a] | 937 | dv = attrib(A,"isHomog"); |
---|
| 938 | l = dv[1]; |
---|
| 939 | dv = dv[2..size(dv)]; |
---|
| 940 | dv = dv-l; |
---|
[82716e] | 941 | setring br; |
---|
[c67136] | 942 | if(system("with","Namespaces")) { kill Ring::nr; } |
---|
[f1201a] | 943 | kill nr; |
---|
| 944 | return(dv); |
---|
| 945 | } |
---|
[e7a0fa] | 946 | |
---|