Annotation of OpenXM/src/kan96xx/Doc/complex.sm1, Revision 1.1
1.1 ! maekawa 1: %% lib/complex.sm1 [ functions for complex ], 1999, 9/9
! 2: %% cf. yama:1999/Int/uli.sm1
! 3: %%%%%%%%%%%%%%%%%%% commands %%%%%%%%%%%%%%%%%%%%%%%%%
! 4: %%% res-div, res-solv, res-kernel-image, res-dual
! 5: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! 6: [(complex.sm1 : 1999, 9/28, res-div, res-solv, res-kernel-image, res-dual )
! 7: (In this package, complex is expressed in terms of matrices.)
! 8: ] {message} map
! 9: /uli.verbose 0 def
! 10: /uli.weight [(x) -1 (y) -1 (Dx) 1 (Dy) 1] def
! 11:
! 12: %%% M = [M_1, ..., M_p], M_i has the length q
! 13: %%% D^p (row vector) --- M ---> D^q (row vector), v --> v M
! 14: %%% In this package (res-***), all data are expressed by matrices.
! 15: /res-nextShift {
! 16: /arg1 set
! 17: [/in-nextShift /f /mm /m /p /q /i /fi] pushVariables
! 18: [
! 19: /f arg1 0 get def
! 20: /mm arg1 1 get def
! 21: %% D^p[m] ---f---> D^q[mm] [f mm] nextShift m
! 22: /p f length def
! 23: [1 1 p { pop 0 } for] /m set
! 24: 0 1 p 1 sub {
! 25: /i set
! 26: /fi f i get def
! 27: m i << mm fi { uli.weight ord_w } map add maxInArray >> put
! 28: } for
! 29: /arg1 m def
! 30: ] pop
! 31: popVariables
! 32: arg1
! 33: } def
! 34:
! 35: [(res-nextShift)
! 36: [([f mm] nextShift m)
! 37: $Example: [(x,y) ring_of_differential_operators 0] define_ring$
! 38: $ [ [ [ (x). (x^2). (x^3). ] $
! 39: $ [ (Dx). (Dx^2). (Dx^3).]] [5 6 7]] res-nextShift :: $
! 40: ]] putUsages
! 41:
! 42:
! 43: %% Input must be a matrix.
! 44: /res-init {
! 45: /arg1 set
! 46: [/in-initv /v /n] pushVariables
! 47: [
! 48: /v arg1 def
! 49: /n v length def
! 50: [n [v] fromVectors {init} map] toVectors2
! 51: /arg1 set
! 52: ] pop
! 53: popVariables
! 54: arg1
! 55: } def
! 56:
! 57:
! 58: /res-isVadapted {
! 59: /arg1 set
! 60: [/in-res-isVstrict /f /m /mm /ans] pushVariables
! 61: [
! 62: /f arg1 0 get def
! 63: /m arg1 1 get def
! 64: /mm arg1 2 get def
! 65: %% D^p[m] ---f---> D^q[mm] [f m mm] res-isVadapted
! 66: f [ [ ] ] eq {
! 67: /ans 1 def
! 68: } {
! 69: [f mm] res-nextShift m eq {/ans 1 def} { /ans 0 def} ifelse
! 70: } ifelse
! 71: /arg1 ans def
! 72: ] pop
! 73: popVariables
! 74: arg1
! 75: } def
! 76:
! 77: /res-gb {
! 78: /arg1 set
! 79: [/in-res-gb /aa /gg /qq /ans] pushVariables
! 80: [(KanGBmessage)] pushEnv
! 81: [
! 82: /aa arg1 def %% Input is a matrix.
! 83: aa [ ] eq { /arg1 [ ] def /res-gb.LLL goto } { } ifelse
! 84: aa 0 get isArray {
! 85: }{ aa { [ 2 1 roll ] } map /aa} ifelse
! 86: /qq aa 0 get length def
! 87: aa { dehomogenize homogenize } map /aa set
! 88: uli.verbose { } { [(KanGBmessage) 0] system_variable} ifelse
! 89: [aa] groebner 0 get /ans set
! 90: ans 0 get isArray { }
! 91: { [qq ans] toVectors2 /ans set } ifelse
! 92: /arg1 ans def
! 93: /res-gb.LLL
! 94: ] pop
! 95: popEnv
! 96: popVariables
! 97: arg1
! 98: } def
! 99:
! 100: %% Utility functions res-setRing and res-toString
! 101: /res-toString {
! 102: /arg1 set
! 103: [/in-res-toString /s /ans] pushVariables
! 104: [
! 105: /s arg1 def
! 106: s isArray {
! 107: s {res-toString} map /ans set
! 108: }{
! 109: s isPolynomial {
! 110: /ans s toString def
! 111: } {
! 112: /ans s def
! 113: } ifelse
! 114: } ifelse
! 115: ans /arg1 set
! 116: ] pop
! 117: popVariables
! 118: arg1
! 119: } def
! 120:
! 121: %% res-setRing.v res-setRing.vlist are global variables that contain,
! 122: %% for example, (x,y) and [(x) (y)].
! 123: /res-setRing {
! 124: /arg1 set
! 125: [/in-res-setRing /R /v] pushVariables
! 126: [
! 127: /v arg1 def
! 128: v isArray {
! 129: /v v res-toString from_records def
! 130: }{
! 131: v isString {
! 132: }{
! 133: [(res-setRing: ) v toString
! 134: ( is not a set of variables to define a ring.)] cat
! 135: error
! 136: }ifelse
! 137: }ifelse
! 138: /res-setRing.v v def
! 139: /res-setRing.vlist [v to_records pop] def
! 140: [v ring_of_differential_operators 0] define_ring /R set
! 141: /arg1 R def
! 142: ] pop
! 143: popVariables
! 144: arg1
! 145: } def
! 146:
! 147:
! 148: %% [M N] res-div It returns ker(M/N) i.e. D^*/ [M N] res-div = M/N
! 149: %% First size(M) part of the syzygy of M and N.
! 150: /res-div {
! 151: /arg1 set
! 152: [/in-res-div /M /N /ss /m /n /ss2 /ans] pushVariables
! 153: [(KanGBmessage)] pushEnv
! 154: [
! 155: /M arg1 0 get def
! 156: /N arg1 1 get def
! 157: /m M length def
! 158: /n N length def
! 159: M 0 get isArray {
! 160: }{ M { [ 2 1 roll ] } map /M } ifelse
! 161: M { dehomogenize homogenize } map /M set
! 162:
! 163: n 0 eq not {
! 164: N 0 get isArray {
! 165: }{ N { [ 2 1 roll ] } map /N } ifelse
! 166: N { dehomogenize homogenize } map /N set
! 167: } { } ifelse
! 168:
! 169: uli.verbose { } { [(KanGBmessage) 0] system_variable} ifelse
! 170: [M N join [(needSyz)]] groebner 2 get /ss set
! 171: ss dehomogenize /ss set
! 172: ss { [ 2 1 roll aload pop 1 1 n { pop pop } for ] } map
! 173: /ss2 set
! 174: ss2 {homogenize} map /ss2 set
! 175: ss2 [ ] eq {
! 176: [ m res-newpvec ] /ans set
! 177: }{
! 178: [ss2 0 get length [ss2] groebner 0 get dehomogenize ] toVectors2
! 179: /ans set
! 180: } ifelse
! 181:
! 182: /arg1 ans def
! 183: ] pop
! 184: popEnv
! 185: popVariables
! 186: arg1
! 187: } def
! 188: [(res-div)
! 189: [( [M N] res-div K )
! 190: ( matrix M, N, K ; Each element of M and N must be an element of a ring.)
! 191: ( coker(K) is isomorphic to M/N. )
! 192: (Example: [(x,y) ring_of_differential_operators 0] define_ring )
! 193: ( [[[(x+x^2+y^2).] [(x y).]] [[(x+x^2+y^2).] [(x y).]]] res-div)
! 194: ( )
! 195: $res*div accepts string inputs, too. For example,$
! 196: $ [[[[(x+x^2+y^2)] [(x y)]] [[(x+x^2+y^2)] [(x y)]]]$
! 197: $ [(x) (y)]] res*div ::$
! 198: (See also res-toString, res-setRing.)
! 199: ]] putUsages
! 200:
! 201: /res*div {
! 202: /arg1 set
! 203: [/in-res*div /A] pushVariables
! 204: [(CurrentRingp)] pushEnv
! 205: [
! 206: /A arg1 def
! 207: A 1 get res-setRing pop
! 208: A 0 get res-toString expand res-div /arg1 set
! 209: ] pop
! 210: popEnv
! 211: popVariables
! 212: arg1
! 213: } def
! 214:
! 215: /res-syz {
! 216: /arg1 set
! 217: [/in-res-syz /M /m] pushVariables
! 218: [
! 219: /M arg1 def
! 220:
! 221: M 0 get isArray {
! 222: }{ M { [ 2 1 roll ] } map /M } ifelse
! 223:
! 224: M { dehomogenize homogenize } map /M set
! 225: [M [(needSyz)]] groebner 2 get dehomogenize /arg1 set
! 226: ] pop
! 227: popVariables
! 228: arg1
! 229: } def
! 230: [(res-syz)
! 231: [( M res-syz N)
! 232: ( matrix M, N ; each element of M and N must be an element of a ring.)
! 233: ( N is a set of generators of the syzygy module of M.)
! 234: (res*syz is also provided. It accepts string inputs.)
! 235: ]] putUsages
! 236: /res*syz {
! 237: /arg1 set
! 238: [/in-res*syz /A] pushVariables
! 239: [(CurrentRingp)] pushEnv
! 240: [
! 241: /A arg1 def
! 242: A 1 get res-setRing pop
! 243: A 0 get res-toString expand res-syz /arg1 set
! 244: ] pop
! 245: popEnv
! 246: popVariables
! 247: arg1
! 248: } def
! 249:
! 250: /res-getx {
! 251: /arg1 set
! 252: [/in-res-getx /xx /nn /ff] pushVariables
! 253: [
! 254: /ff arg1 def
! 255: /xx ff getvNamesCR def
! 256: [(N)] system_variable /nn set
! 257: [ xx aload pop 1 1 nn { pop pop } for pop ] rest
! 258: /arg1 set
! 259: ] pop
! 260: popVariables
! 261: arg1
! 262: } def
! 263:
! 264: %% Solving \sum c_i M_i = d
! 265: %% [M d] res-solv c'/r ; M : matrix, d, c' : vectors, r : scalar, c'/r =c
! 266: /res-solv {
! 267: /arg1 set
! 268: [/in-res-solv /M /d /ans /B /vv /G /rr /rng] pushVariables
! 269: [(CurrentRingp) (KanGBmessage)] pushEnv
! 270: [
! 271: /M arg1 0 get def
! 272: /d arg1 1 get def
! 273: M getRing /rng set
! 274: rng res-getx /vv set
! 275: uli.verbose { (res-solv : vv = ) messagen vv message } { } ifelse
! 276: uli.verbose { } { [(KanGBmessage) 0] system_variable } ifelse
! 277: M dehomogenize /M set
! 278: [vv from_records ring_of_differential_operators 0] define_ring
! 279: M 0 get isArray {
! 280: M { { toString . } map } map /M set
! 281: } {
! 282: M { toString . } map /M set
! 283: } ifelse
! 284: [M [(needBack)]] groebner_sugar /G set
! 285: G 1 get /B set
! 286:
! 287: d isArray {
! 288: d 0 get isArray { [d] fromVectors 0 get /d set } { } ifelse
! 289: [d] fromVectors 0 get /d set
! 290: } { } ifelse
! 291: d toString . dehomogenize /d set
! 292:
! 293: /res-solv.d d def
! 294: /res-solv.G G def
! 295:
! 296: d G 0 get reduction-noH /rr set
! 297: rr 0 get (0). eq {
! 298: [rr 2 get] B mul 0 get /ans set
! 299: /ans [ ans { toString rng ,, (-1) rng ,, mul} map
! 300: rr 1 get toString .. ] def
! 301: } {
! 302: /ans null def
! 303: } ifelse
! 304: /arg1 ans def
! 305: ] pop
! 306: popEnv
! 307: popVariables
! 308: arg1
! 309: } def
! 310: [(res-solv)
! 311: [$[M d] res-solv [c' r] $
! 312: $ M : matrix, d, c' : vectors, r : scalar(integer) $
! 313: $ c:=c'/r is a solutions of Sum[c_i M_i] = d where c_i is the i-th element $
! 314: $ of the vector c and M_i is the i-th row vector of M.$
! 315: $If there is no solution, then res-solv returns null. $
! 316: (Note that M and d are not treated as an element of the homogenized Weyl)
! 317: (algebra. If M or d contains the homogenization variable h, it automatically)
! 318: (set to 1. If you need to use h, use the command res-solv-h)
! 319: $Example 1: [(x,y) ring_of_differential_operators [[(x) -1 (Dx) 1]] weight_vector 0] $
! 320: $ define_ring $
! 321: $ [ [ [(x Dx + 2).] [ (Dx (x Dx + 3) - (x Dx + 2) (x Dx -4)).]] [(1).]] $
! 322: $ res-solv :: $
! 323: $Example 2: $
! 324: $ [ [ (x Dx + 2). (Dx (x Dx + 3) - (x Dx + 2) (x Dx -4)).] (1).] $
! 325: $ res-solv :: $
! 326: $Example 3: $
! 327: $ [ [[(x Dx + 2). (0).] $
! 328: $ [(Dx+3). (x^3).]$
! 329: $ [(3). (x).]$
! 330: $ [(Dx (x Dx + 3) - (x Dx + 2) (x Dx -4)). (0).]] [(1). (0).]] $
! 331: $ res-solv :: $
! 332: $Example 4: $
! 333: $ [[ (x*Dx+h^2). (Dx^2+x*h).] [(x^2+h^2). (h Dx + x^2).]] /ff set $
! 334: $ [[ (x^2 Dx + x h^2). (Dx^3).]] /gg set $
! 335: $ [ff gg ff mul 0 get ] res-solv-h :: $
! 336: $ $
! 337: $res*solv and res*solv*h accept string inputs, too. For example,$
! 338: $ [[ [ [(x Dx + 2)] [ (Dx (x Dx + 3) - (x Dx + 2) (x Dx -4))]] [(1)]] $
! 339: $ (x)] res*solv :: $
! 340: ]] putUsages
! 341: /res*solv {
! 342: /arg1 set
! 343: [/in-res*solv /A] pushVariables
! 344: [(CurrentRingp)] pushEnv
! 345: [
! 346: /A arg1 def
! 347: A 1 get res-setRing pop
! 348: A 0 get res-toString expand res-solv /arg1 set
! 349: ] pop
! 350: popEnv
! 351: popVariables
! 352: arg1
! 353: } def
! 354:
! 355: %% Solving \sum c_i M_i = d
! 356: %% [M d] res-solv-h c'/r ;
! 357: %% M : matrix, d, c' : vectors, r : scalar, c'/r =c
! 358: /res-solv-h {
! 359: /arg1 set
! 360: [/in-res-solv-h /M /d /ans /B /vv /G /rr /rng] pushVariables
! 361: [(CurrentRingp) (KanGBmessage)] pushEnv
! 362: [
! 363: /M arg1 0 get def
! 364: /d arg1 1 get def
! 365: M getRing /rng set
! 366: rng res-getx /vv set
! 367: uli.verbose { (res-solv-h : vv = ) messagen vv message } { } ifelse
! 368: uli.verbose { } { [(KanGBmessage) 0] system_variable } ifelse
! 369: [vv from_records ring_of_differential_operators 0] define_ring
! 370: M 0 get isArray {
! 371: M { { toString . } map } map /M set
! 372: } {
! 373: M { toString . } map /M set
! 374: } ifelse
! 375:
! 376: getOptions /options set
! 377: (grade) (module1v) switch_function
! 378: [M [(needBack)]] groebner /G set
! 379: options restoreOptions
! 380:
! 381: G 1 get /B set
! 382:
! 383: d isArray {
! 384: d 0 get isArray { [d] fromVectors 0 get /d set } { } ifelse
! 385: [d] fromVectors 0 get /d set
! 386: } { } ifelse
! 387: d toString . /d set
! 388:
! 389: /res-solv.d d def
! 390: /res-solv.G G def
! 391:
! 392: d G 0 get reduction /rr set
! 393: rr 0 get (0). eq {
! 394: [rr 2 get] B mul 0 get /ans set
! 395: /ans [ ans { toString rng ,, (-1) rng ,, mul} map
! 396: rr 1 get toString .. ] def
! 397: } {
! 398: /ans null def
! 399: } ifelse
! 400: /arg1 ans def
! 401: ] pop
! 402: popEnv
! 403: popVariables
! 404: arg1
! 405: } def
! 406: /res*solv*h {
! 407: /arg1 set
! 408: [/in-res*solv*h /A] pushVariables
! 409: [(CurrentRingp)] pushEnv
! 410: [
! 411: /A arg1 def
! 412: A 1 get res-setRing pop
! 413: A 0 get res-toString expand res-solv-h /arg1 set
! 414: ] pop
! 415: popEnv
! 416: popVariables
! 417: arg1
! 418: } def
! 419:
! 420: %% See also xm, sm1_mul, sm1_mul_d, sm1_mul_h
! 421: /res*mul {
! 422: /arg1 set
! 423: [/in-res*mul /A] pushVariables
! 424: [(CurrentRingp)] pushEnv
! 425: [
! 426: /A arg1 def
! 427: A 1 get res-setRing pop
! 428: A 0 get 0 get res-toString expand
! 429: A 0 get 1 get res-toString expand
! 430: mul dehomogenize
! 431: /arg1 set
! 432: ] pop
! 433: popEnv
! 434: popVariables
! 435: arg1
! 436: } def
! 437: /res*mul*h {
! 438: /arg1 set
! 439: [/in-res*mul*h /A] pushVariables
! 440: [(CurrentRingp)] pushEnv
! 441: [
! 442: /A arg1 def
! 443: A 1 get res-setRing pop
! 444: A 0 get 0 get res-toString expand
! 445: A 0 get 1 get res-toString expand
! 446: mul
! 447: /arg1 set
! 448: ] pop
! 449: popEnv
! 450: popVariables
! 451: arg1
! 452: } def
! 453:
! 454: %% cf. sm1_adjoint
! 455: /res*adjoint {
! 456: /arg1 set
! 457: [/in-res*adjoint /A /p /v /p0 /ans] pushVariables
! 458: [(CurrentRingp)] pushEnv
! 459: [
! 460: /A arg1 def
! 461: A 1 get res-setRing pop
! 462: A 0 get res-toString expand dehomogenize /p set
! 463: /v res-setRing.v def
! 464: p isArray {
! 465: p { /p0 set [p0 v] res*adjoint } map /ans set
! 466: }{
! 467: p v adjoint dehomogenize /ans set
! 468: }ifelse
! 469: /arg1 ans def
! 470: ] pop
! 471: popEnv
! 472: popVariables
! 473: arg1
! 474: } def
! 475:
! 476: /res-init-m {
! 477: /arg1 set
! 478: [/in-res-init-m /A /ans] pushVariables
! 479: [
! 480: /A arg1 def
! 481: A isArray {
! 482: A { res-init-m } map /ans set
! 483: }{
! 484: A init /ans set
! 485: }ifelse
! 486: /arg1 ans def
! 487: ] pop
! 488: popVariables
! 489: arg1
! 490: } def
! 491:
! 492: /res-ord_w-m {
! 493: /arg2 set
! 494: /arg1 set
! 495: [/in-ord_w-m /A /ans /w] pushVariables
! 496: [
! 497: /A arg1 def
! 498: /w arg2 def
! 499: A isArray {
! 500: A { w res-ord_w-m } map /ans set
! 501: }{
! 502: A w ord_w /ans set
! 503: }ifelse
! 504: /arg1 ans def
! 505: ] pop
! 506: popVariables
! 507: arg1
! 508: } def
! 509:
! 510: %% cf. sm1_resol1
! 511: /res*resol1 {
! 512: /arg1 set
! 513: [/in-res*resol1 /A /ans /w /ans1 /ans2] pushVariables
! 514: [
! 515: /A arg1 def
! 516: A length 3 ge {
! 517: /w A 2 get def %% weight vector
! 518: } {
! 519: /w null def
! 520: }ifelse
! 521: A resol1 /ans set
! 522: /ans1 ans res-init-m def
! 523: w tag 0 eq {
! 524: /ans [ans ans1] def
! 525: }{
! 526: ans w 0 get res-ord_w-m /ans2 set
! 527: /ans [ans ans1 ans2] def
! 528: }ifelse
! 529: /arg1 ans def
! 530: ] pop
! 531: popVariables
! 532: arg1
! 533: } def
! 534:
! 535: %% @@@
! 536:
! 537: %% submodule to quotient module
! 538: %% M res-sub2Q ==> J, where M \simeq D^m/J
! 539: /res-sub2Q {
! 540: /arg1 set
! 541: [/in-res-sub2Q /M /m] pushVariables
! 542: [
! 543: /M arg1 def
! 544: M 0 get isArray {
! 545: }{ M { [ 2 1 roll ] } map /M } ifelse
! 546: M { dehomogenize homogenize } map /M set
! 547: [M [(needSyz)]] groebner 2 get dehomogenize /arg1 set
! 548: ] pop
! 549: popVariables
! 550: arg1
! 551: } def
! 552: [(res-sub2Q)
! 553: [(M res-sub2Q J)
! 554: (matrix M, J; )
! 555: (The submodule generated by M is isomorphic to D^m/J.)
! 556: ]] putUsages
! 557:
! 558:
! 559: %% submodules to quotient module
! 560: %% [M N] res-subsub2Q ==> J, where M \simeq D^m/J
! 561: /res-subsub2Q {
! 562: /arg1 set
! 563: [/in-res-subsub2Q /M /N /ss /m /n /ss2] pushVariables
! 564: [
! 565: /M arg1 0 get def
! 566: /N arg1 1 get def
! 567: /m M length def
! 568: /n N length def
! 569: M 0 get isArray {
! 570: }{ M { [ 2 1 roll ] } map /M } ifelse
! 571: N 0 get isArray {
! 572: }{ N { [ 2 1 roll ] } map /N } ifelse
! 573: M { dehomogenize homogenize } map /M set
! 574: N { dehomogenize homogenize } map /N set
! 575: [M N join [(needSyz)]] groebner 2 get /ss set
! 576: ss dehomogenize /ss set
! 577: ss { [ 2 1 roll aload pop 1 1 n { pop pop } for ] } map
! 578: /ss2 set
! 579: ss2 {homogenize} map /ss2 set
! 580: [ss2 0 get length [ss2] groebner 0 get dehomogenize ] toVectors2
! 581: /arg1 set
! 582: ] pop
! 583: popVariables
! 584: arg1
! 585: } def
! 586:
! 587: /res-newpvec {
! 588: /arg1 set
! 589: [/in-res-newpvec /n ] pushVariables
! 590: [
! 591: /n arg1 def
! 592: [1 1 n { pop (0). } for] /arg1 set
! 593: ] pop
! 594: popVariables
! 595: arg1
! 596: } def
! 597:
! 598: %% ki.sm1 kernel/image, 1999, 2/4
! 599: %% ki.sm1 is now moved to gbhg3/Int.
! 600: %% It is included in lib/complex.sm1
! 601: /kernel-image.v 1 def
! 602: /kernel-image.p 0 def % characteristic
! 603: %%
! 604: %% D^p <-- m --- D^q <-- n -- D^r
! 605: %% ker(m)/im(n)
! 606: %%
! 607: /res-kernel-image {
! 608: /arg1 set
! 609: [/in-res-kernel-image /p /q /r /m /n /t
! 610: /vlist /s0 /s1 /ans
! 611: ] pushVariables
! 612: [
! 613: /m arg1 0 get def
! 614: /n arg1 1 get def
! 615: /vlist arg1 2 get def
! 616: vlist isArray {
! 617: vlist from_records /vlist
! 618: } { } ifelse
! 619: [vlist ring_of_differential_operators kernel-image.p] define_ring
! 620: m { {toString . dehomogenize toString} map } map /m set
! 621: m length /q set
! 622: n { {toString . dehomogenize toString} map } map /n set
! 623: n length /r set
! 624:
! 625: [m vlist] syz 0 get {{toString} map} map /s0 set
! 626: /t s0 length def
! 627: [ s0 n join vlist ] syz 0 get /s1 set
! 628: s1 { t carN } map /ans set
! 629:
! 630: /arg1 ans def
! 631: ] pop
! 632: popVariables
! 633: arg1
! 634: } def
! 635: [(res-kernel-image)
! 636: [( [m n vlist] res-kernel-image c )
! 637: (When, D^p <-- m --- D^q <-- n -- D^r )
! 638: (D^q/c is isomorhic to ker(m)/im(n).)
! 639: (vlist is a list of variables.)
! 640: ]] putUsages
! 641:
! 642:
! 643: /res-dual {
! 644: /arg1 set
! 645: [/in-res-dual ] pushVariables
! 646: [
! 647: arg1 0 get /input set
! 648: arg1 1 get /vlist set
! 649: /n vlist length def
! 650: /vv vlist from_records def
! 651:
! 652: %% preprocess to input resol0. Future version of resol1 should do them.
! 653: input 0 get isArray {
! 654: /kernel-image.unknowns input 0 get length def
! 655: } { /kernel-image.unknowns 1 def } ifelse
! 656: [vv ring_of_differential_operators
! 657: kernel-image.p ] define_ring
! 658: input 0 get isArray {
! 659: input { {toString . dehomogenize toString} map
! 660: } map /input set
! 661: }{ input { toString . dehomogenize toString} map /input set } ifelse
! 662:
! 663: [input vv]
! 664: resol0 /rr set
! 665:
! 666: %% Postprocess of resol0
! 667: [vv ring_of_differential_operators
! 668: kernel-image.p ] define_ring
! 669: [ [kernel-image.unknowns rr 0 get { toString . dehomogenize } map]
! 670: toVectors2 { {toString} map } map ]
! 671: rr 1 get join /rr-syz set
! 672: %%% end. The result is in rr-syz.
! 673:
! 674: /M rr-syz << n >> get def
! 675: /N rr-syz << n 1 sub >> get def
! 676: M [ ] eq {
! 677: /q N length def
! 678: /M [ [0 1 q 1 sub { pop (0). } for] ] def
! 679: } { } ifelse
! 680:
! 681: %% regard them as a map from row vector v to row vector w; v M --> w
! 682: uli.verbose {
! 683: (M = ) messagen M pmat
! 684: (N = ) messagen N pmat
! 685: } { } ifelse
! 686: M transpose { { toString . dehomogenize vv adjoint} map } map /M set
! 687: N transpose { { toString . dehomogenize vv adjoint} map } map /N set
! 688: uli.verbose {
! 689: $We are now computing ker (*N)/im (*M).$ message
! 690: (*N = ) messagen N pmat
! 691: (*M = ) messagen M pmat
! 692: ( *N *M = ) messagen N M mul dehomogenize message
! 693: ( ) message
! 694: }{ } ifelse
! 695: /M M {{toString} map } map def
! 696: /N N {{toString} map } map def
! 697: [M N vv] res-kernel-image {{toString} map}map /ans1 set
! 698: [ans1 vv] gb 0 get /arg1 set
! 699: ] pop
! 700: popVariables
! 701: arg1
! 702: } def
! 703:
! 704: [(res-dual)
! 705: [$[F V] res-dual G$
! 706: $G is the dual D-module of F. V is a list of variables.$
! 707: $Example 1: [ [( x^3-y^2 ) ( 2 x Dx + 3 y Dy + 6 ) ( 2 y Dx + 3 x^2 Dy) ] $
! 708: $ [(x) (y)]] res-dual $
! 709: $Example 2: [[1 3 4 5]] appell1 res-dual $
! 710: $Example 3: [ [(-x1 Dx1 + x1 + 2) (x2 Dx2 - Dx2 -3)] [(x1) (x2)]] res-dual $
! 711: $Example 4: [ [(x2 Dx2 - Dx2 + 4) (x1 Dx1 + x1 +3)] [(x1) (x2)]] res-dual $
! 712: $ 3 and 4 are res-dual each other. $
! 713: $Example 5: [ [[1 1 1][0 1 2]] [0 0]] gkz res-dual $
! 714: $Example 6: [ [[1 1 1][0 1 2]] [-2 -1]] gkz res-dual $
! 715: $ $
! 716: $Example 7: [ [(x Dx -1) (Dx^2)] [(x)]] res-dual $
! 717: $Example 8: [ [[(1) (0)] [(0) (Dx)]] [(x)]] res-dual $
! 718: $Example 9: [ [((x Dx + x +1) (Dx-1))] [(x)]] res-dual $
! 719: ]] putUsages
! 720:
! 721: %%% From 1999/Int/sst.sm1
! 722: /saturation1 {
! 723: /arg1 set
! 724: [/in-saturation1 /ff /vlist /ulist /mm /hlist /iii
! 725: /i /uweight /aaa
! 726: ] pushVariables
! 727: [(KanGBmessage) (CurrentRingp)] pushEnv
! 728: [
! 729: /ff arg1 def
! 730: /iii ff 0 get {toString} map def %% ideal
! 731: /hlist ff 1 get {toString} map def %% saturation polynomials
! 732: /vlist [ff 2 get to_records pop] def
! 733: /mm hlist length def
! 734:
! 735: [(KanGBmessage) 0] system_variable
! 736: /ulist [ 0 1 mm 1 sub { /i set [(_u) i] cat } for ] def
! 737: /uweight ulist { 1 } map def
! 738: [vlist ulist join from_records ring_of_polynomials
! 739: [uweight] weight_vector 0] define_ring
! 740: [0 1 mm 1 sub { /i set hlist i get .
! 741: ulist i get . mul (1). sub } for]
! 742: /hlist set
! 743: %%hlist pmat
! 744: [iii {.} map hlist join] groebner_sugar 0 get /aaa set
! 745: %%[aaa ulist] pmat
! 746: aaa ulist eliminatev /arg1 set
! 747: ] pop
! 748: popEnv
! 749: popVariables
! 750: arg1
! 751: } def
! 752:
! 753: [(saturation1)
! 754: [([ideal saturation-poly vlist] saturation jjj)
! 755: $It returns(((ideal:f_1^\infty):f_2^\infty) ...) where$
! 756: $saturation-poly is [f_1, f_2, ...]$
! 757: $Example 1: $
! 758: $ [[(x1 y1 + x2 y2 + x3 y3 + x4 y4) $
! 759: $ (x2 y2 + x4 y4) (x3 y3 + x4 y4) (y1 y4 - y2 y3)]$
! 760: $ [(y1) (y2) (y3) (y4)] (x1,x2,x3,x4,y1,y2,y3,y4)] saturation1$
! 761: $ /ff set [ff (x1,x2,x3,x4,y1,y2,y3,y4) $
! 762: $ [[(y1) 1 (y2) 1 (y3) 1 (y4) 1]]] pgb $
! 763: $ 0 get [(y1) (y2) (y3) (y4)] eliminatev ::$
! 764: ]] putUsages
! 765:
! 766:
! 767: /intersection {
! 768: /arg1 set
! 769: [/in-intersection2 /ii /jj /rr /vlist /ii2 /jj2 ] pushVariables
! 770: [(CurrentRingp) (KanGBmessage)] pushEnv
! 771: [
! 772: /ii arg1 0 get def
! 773: /jj arg1 1 get def
! 774: /vlist arg1 2 get def
! 775:
! 776: [(KanGBmessage) 0] system_variable
! 777:
! 778: [vlist to_records pop] /vlist set
! 779: [vlist [(_t)] join from_records ring_of_differential_operators
! 780: [[(_t) 1]] weight_vector 0] define_ring
! 781: ii { toString . (_t). mul } map /ii2 set
! 782: jj { toString . (1-_t). mul } map /jj2 set
! 783: [ii2 jj2 join] groebner_sugar 0 get
! 784: [(_t)] eliminatev /arg1 set
! 785: ] pop
! 786: popEnv
! 787: popVariables
! 788: arg1
! 789: } def
! 790:
! 791: [(intersection)
! 792: [(Ideal intersections in the ring of differential operators.)
! 793: $Example 1: [[[(x1) (x2)] [(x2) (x4)] (x1,x2,x3,x4)] intersection$
! 794: $ [(x2) (x4^2)] (x1,x2,x3,x4)] intersection :: $
! 795: $Example 2: [[[(x1) (x2)] [(x2) (x4)] (x1,x2,x3,x4)] intersection$
! 796: $ [(x2) (x4^2)] (x1,x2,x3,x4)] intersection /ff set ff message$
! 797: $ [ ff [(x2^2) (x3) (x4)] (x1,x2,x3,x4)] intersection :: $
! 798: $Example 3: [[[(x1) (x2)] [(x2) (x4^2)] (x1,x2,x3,x4)] intersection$
! 799: $ [(x2^2) (x3) (x4)] (x1,x2,x3,x4)] intersection :: $
! 800: ]] putUsages
! 801:
! 802:
! 803: /saturation2 {
! 804: /arg1 set
! 805: [/in-saturation2 /ff /vlist /mm /slist /iii
! 806: /i /aaa
! 807: ] pushVariables
! 808: [(KanGBmessage) (CurrentRingp)] pushEnv
! 809: [
! 810: /ff arg1 def
! 811: /iii ff 0 get {toString} map def %% ideal
! 812: /slist ff 1 get {toString} map def %% saturation polynomials
! 813: /vlist ff 2 get def
! 814: /mm slist length def
! 815:
! 816: /aaa [iii [slist 0 get] vlist] saturation1 def
! 817: 1 1 mm 1 sub {
! 818: /i set
! 819: [[iii [slist i get] vlist] saturation1
! 820: aaa vlist] intersection /aaa set
! 821: } for
! 822: /arg1 aaa def
! 823: ] pop
! 824: popEnv
! 825: popVariables
! 826: arg1
! 827: } def
! 828:
! 829: [(saturation2)
! 830: [([ideal saturation-poly vlist] saturations jjj)
! 831: $It returns (ideal:f_1^infty) \cap (ideal:f_2^\infty) \cap ... where$
! 832: $saturation-poly is [f_1, f_2, ...]$
! 833: $Example 1: $
! 834: $ [[(x1 y1 + x2 y2 + x3 y3 + x4 y4) $
! 835: $ (x2 y2 + x4 y4) (x3 y3 + x4 y4) (y1 y4 - y2 y3)]$
! 836: $ [(y1) (y2) (y3) (y4)] (x1,x2,x3,x4,y1,y2,y3,y4)] saturation2$
! 837: $ /ff set [ff (x1,x2,x3,x4,y1,y2,y3,y4) $
! 838: $ [[(y1) 1 (y2) 1 (y3) 1 (y4) 1]]] pgb $
! 839: $ 0 get [(y1) (y2) (y3) (y4)] eliminatev ::$
! 840: $Example 2: [[(x2^2) (x2 x4) (x2) (x4^2)] [(x2) (x4)] (x2,x4)] saturation2$
! 841: ]] putUsages
! 842:
! 843: /innerProduct {
! 844: { [ 2 1 roll ] } map /innerProduct.tmp2 set
! 845: /innerProduct.tmp1 set
! 846: [innerProduct.tmp1] innerProduct.tmp2 mul
! 847: 0 get 0 get
! 848: } def
! 849:
! 850: /saturation {
! 851: /arg1 set
! 852: [/in-saturation /ff /vlist /mm /slist /iii
! 853: /i /aaa /vlist2
! 854: ] pushVariables
! 855: [(KanGBmessage) (CurrentRingp)] pushEnv
! 856: [
! 857: /ff arg1 def
! 858: /iii ff 0 get {toString} map def %% ideal
! 859: /slist ff 1 get {toString} map def %% saturation polynomials
! 860: /vlist ff 2 get def
! 861: /mm slist length def
! 862:
! 863: [vlist to_records pop] [(_z) (_y)] join /vlist2 set
! 864: [vlist2 from_records ring_of_polynomials
! 865: [[(_z) 1 (_y) 1]] weight_vector
! 866: 0] define_ring
! 867:
! 868: [
! 869: [
! 870: [0 1 mm 1 sub { /i set (_y). i npower } for ]
! 871: slist {.} map innerProduct (_z). sub
! 872: ]
! 873: iii {.} map join
! 874:
! 875: [(_z)]
! 876: vlist2 from_records
! 877: ] saturation1 /aaa set
! 878:
! 879: [(KanGBmessage) 0] system_variable
! 880: aaa {toString .} map /aaa set
! 881: [aaa] groebner_sugar 0 get
! 882: [(_z) (_y)] eliminatev
! 883: /arg1 set
! 884: ] pop
! 885: popEnv
! 886: popVariables
! 887: arg1
! 888: } def
! 889:
! 890: [(saturation)
! 891: [([ideal J vlist] saturations jjj)
! 892: $It returns (ideal : J^\infty) $
! 893: (Saturation is computed in the ring of polynomials.)
! 894: $When J=[f_1, f_2, ...], it is equal to $
! 895: $((ideal, z-(f_1 + y f_2 + y^2 f_3 +...)) : z^\infty) \cap k[x].$
! 896: $Example 1: $
! 897: $ [[(x1 y1 + x2 y2 + x3 y3 + x4 y4) $
! 898: $ (x2 y2 + x4 y4) (x3 y3 + x4 y4) (y1 y4 - y2 y3)]$
! 899: $ [(y1) (y2) (y3) (y4)] (x1,x2,x3,x4,y1,y2,y3,y4)] saturation$
! 900: $ /ff set [ff (x1,x2,x3,x4,y1,y2,y3,y4) $
! 901: $ [[(y1) 1 (y2) 1 (y3) 1 (y4) 1]]] pgb $
! 902: $ 0 get [(y1) (y2) (y3) (y4)] eliminatev ::$
! 903: $Example 2: [[(x2^2) (x2 x4) (x2) (x4^2)] [(x2) (x4)] (x2,x4)] saturation$
! 904: ]] putUsages
! 905:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>