Changeset abbd22 in git
- Timestamp:
- Aug 10, 2010, 2:17:49 PM (14 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 71ea75859d658e8bb0cf07f0242fb4ef13f452a1
- Parents:
- 7f8587b3752e6d6a92df017bafdfb3d03198e66b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/monomial.lib
r7f8587 rabbd22 40 40 "; 41 41 LIB "poly.lib"; // Para "maxdeg1" en "isprimeMon" 42 //--------------------------------------------------------------------------- 42 //--------------------------------------------------------------------------- 43 43 //----------------------- INTERNOS ------------------------------------- 44 //--------------------------------------------------------------------------- 44 //--------------------------------------------------------------------------- 45 45 ///////////////////////////////////////////////////////////////////////////// 46 46 // … … 54 54 int i,n; 55 55 n = ncols(I); 56 for (i = 1 ; i <= n ; i ++)57 58 59 60 61 62 56 for (i = n ; i >= 1 ; i --) 57 { 58 if ( size(I[i]) > 1 ) 59 { 60 return (0); 61 } 62 } 63 63 return (1); 64 64 } … … 80 80 J = 0; 81 81 82 int sizI = size(I);82 int sizI = ncols(I); 83 83 for (i = 1 ; i <= sizI ; i++) 84 85 g = gcdMon(I[i],f);86 87 88 89 90 91 92 93 94 84 { 85 g = gcd(I[i],f); 86 // Cociente de dos monomios: restamos los exponentes, y en el 87 // denominador va el mcd 88 v = leadexp(I[i]) - leadexp(g); 89 generator = monomial (v); 90 if (membershipMon(generator,J) == 0) 91 { 92 J=J,generator; 93 } 94 } 95 95 // minimal monomial basis 96 96 return ( minbase(J) ); … … 107 107 " 108 108 { 109 def R = basering;110 109 // Variables 111 int nvar,i,cont,sop;110 int i,cont,sop; 112 111 intvec expf; 113 nvar = nvars(R);112 int nvar = nvars(basering); 114 113 expf = leadexp(f); 115 114 cont = 0; 116 115 // cont va a contar el numero de componentes del vector no nulas. 117 116 // En sop guardamos el subindice de la componente no nula. 118 for (i = 1 ; i <= nvar ; i++)119 120 121 122 123 124 125 126 127 128 129 130 117 for (i = nvar ; i >= 1 ; i--) 118 { 119 if (expf[i] > 0) 120 { 121 cont ++; 122 sop = i; 123 // Si cont > 1 ==> aparece mas de una variable, devolvemos 0 124 if (cont > 1) 125 { 126 return (0); 127 } 128 } 129 } 131 130 return(sop); 132 131 } … … 145 144 " 146 145 { 147 def R = basering;148 146 // Variables 149 147 int sizI,i,nvar,j,sum; 150 148 intvec w,exp; 151 sizI = size(I);152 nvar = nvars( R);149 sizI = ncols(I); 150 nvar = nvars(basering); 153 151 for (i = 1 ; i <= sizI ; i++) 154 155 156 157 158 159 160 161 162 163 sum = sum + 1;164 165 166 167 168 169 170 171 172 173 152 { 153 sum = 0; 154 exp = leadexp(I[i]); 155 for (j = 1 ; j <= nvar ; j++) 156 { 157 // Al menos tenemos una variable en cada generador, luego 158 // entramos minimo 1 vez, luego sum >= 1. 159 if (exp[j] <> 0) 160 { 161 sum++; 162 w[sum] = j; 163 } 164 } 165 // Si hay mas de una variable la suma sera mayor que 1; y ya 166 // sabemos que I no es irreducible. 167 if (sum <> 1) 168 { 169 return(i,w); 170 } 171 } 174 172 return(1); 175 173 } … … 186 184 poly f; 187 185 int i,resp; 188 int n = size(I);186 int n = ncols(I); 189 187 // Desde que haya un generador que no pertenzca al ideal, ya no se da 190 188 // el contenido y terminamos. 191 189 for (i = 1 ; i <= n ; i++) 192 193 194 195 196 197 198 190 { 191 resp = membershipMon(I[i],J); 192 if (resp == 0) 193 { 194 return(0); 195 } 196 } 199 197 return(1); 200 198 } … … 215 213 // que vienen dados por el sistema minimal de generadores. 216 214 if (size(I) <> size(J)) 217 { 218 return(0); 219 } 220 n = size(I); 215 { 216 return(0); 217 } 221 218 // Como ambos ideales vienen dados por la base minimal, no vamos a 222 219 // tener problemas con que comparemos uno de I con otro de J, pues 223 220 // no puede haber generadores iguales en el mismo ideal. 224 221 // Si los ordenamos, se puede comparar uno a uno 225 I = sort(I)[1]; 226 J = sort(J)[1]; 227 for (i = 1 ; i <= n ; i++) 228 { 229 if (I[i] <> J[i]) 230 { 231 return(0); 232 } 233 } 234 return(1); 222 return(matrix( sort(I)[1])==matrix(sort(J)[1])); 223 //n = size(I); 224 //I = sort(I)[1]; 225 //J = sort(J)[1]; 226 //for (i = 1 ; i <= n ; i++) 227 //{ 228 // if (I[i] <> J[i]) 229 // { 230 // return(0); 231 // } 232 //} 233 //return(1); 235 234 } 236 235 ///////////////////////////////////////////////////////////////////////////// … … 245 244 { 246 245 // Cambiamos de anillo 247 def R = basering; 248 int nvar = nvars(R); 249 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 250 execute(s); 246 int nvar = nvars(basering); 251 247 // Variables 252 248 int i,cont; 253 249 intvec exp; 254 250 ideal rad; 255 ideal I = fetch(R,I);256 251 // Como en cada generador aparece solo una variable, y ademas la 257 252 // la misma variable no va a aparecer dos veces, es suficiente 258 253 // con sumar los exponentes de todos los generadores para saber que 259 254 // variables aparecen. 260 int n = size(I);255 int n = ncols(I); 261 256 for (i = 1 ; i <= n ; i++) 262 263 264 257 { 258 exp = exp + leadexp (I[i]); 259 } 265 260 cont = 1; 266 261 for (i = 1 ; i <= nvar ; i++) 267 { 268 if (exp[i] <> 0) 269 { 270 rad[cont] = x(i); 271 cont ++; 272 } 273 } 274 setring R; 275 ideal rad = fetch(R1,rad); 276 kill R1; 262 { 263 if (exp[i] <> 0) 264 { 265 rad[cont] = var(i); 266 cont ++; 267 } 268 } 277 269 return (rad); 278 270 } … … 292 284 " 293 285 { 294 def R = basering;295 286 // Variables 296 287 int control,nvar,i,sub_in,l,j; 297 288 intvec v,w,exp_gen; 298 289 // El ideal ya entra generado por el sistema minimal 299 nvar = nvars( R);300 int sizI = size(I);290 nvar = nvars(basering); 291 int sizI = ncols(I); 301 292 v[nvar] = 0; 302 293 int cont = 1; … … 305 296 // generadores de I que hay que comprobar. 306 297 for (i = 1 ; i <= sizI ; i++ ) 307 308 309 310 311 312 313 314 315 316 317 318 298 { 299 sub_in = soporte(I[i]); 300 if ( sub_in <> 0) 301 { 302 v[sub_in] = 1; 303 } 304 else 305 { 306 w[cont] = i; 307 cont ++; 308 } 309 } 319 310 l = size(w); 320 311 // No hay ningun generador que tenga productos de variables, luego 321 312 // este ideal ya es primario. 322 313 if (l == 1 && w[1] == 0) 323 324 325 314 { 315 return (1); 316 } 326 317 for (i = 1 ; i <= l ; i++) 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 318 { 319 exp_gen = leadexp(I[w[i]]); 320 // Ahora hay que ver que valor tiene el exponente de los 321 // generadores oportunos en la posicion que es cero dentro del 322 // vector v. 323 for (j = 1 ; j <= nvar ; j++) 324 { 325 if (v[j] == 0) 326 { 327 if (exp_gen[j] <> 0) 328 { 329 return (0,j,w); 330 } 331 } 332 } 333 } 343 334 // Si hemos llegado hasta aqui hemos recorrido todo el ideal y por tanto 344 335 // es primario. … … 371 362 max = 0; 372 363 for (i = 1 ; i <= n ; i++) 373 374 375 376 377 378 379 364 { 365 exp = leadexp (I[v[i+2]]); 366 if (exp[v[2]] > max) 367 { 368 max = exp[v[2]]; 369 } 370 } 380 371 return (max); 381 372 } … … 396 387 int sizl = size(l); 397 388 for (i = 1 ; i <= sizl ; i++) 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 389 { 390 J = 1; 391 for (j = 1 ; j <= sizl ; j++) 392 { 393 // Hacemos la interseccion de todos los ideales menos uno y 394 // luego se estudia el contenido. 395 if (j <> i) 396 { 397 J = intersect (J,l[j]); 398 } 399 } 400 J = minbase(J); 401 resp = contents(J,l[i]); 402 if (resp == 1) 403 { 404 l = delete (l,i); 405 i--; 406 sizl = size(l); 407 } 408 } 418 409 return (l); 419 410 } … … 432 423 { 433 424 // Cambiamos de anillo 434 def R = basering; 435 int nvar = nvars(R); 436 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 437 execute(s); 425 int nvar = nvars(basering); 438 426 // Variables 439 427 int i,j; … … 441 429 list l; 442 430 ideal J; 443 ideal I = fetch (R,I); 444 int sizI = size(I); 431 int sizI = ncols(I); 445 432 // Vamos a tener tantas componentes como generadores minimales tiene el 446 433 // ideal, por eso el bucle es de 1 a size(I). 447 for (i = 1 ; i <= sizI ; i++) 448 { 449 J = 0; 450 exp_I = leadexp (I[i]); 451 for (j = 1 ; j <= nvar ; j++) 452 { 453 if (exp_I[j] <> 0) 454 { 455 exp[j] = v[j] + 1 - exp_I[j]; 456 J = J, x(j)^exp[j]; 457 } 458 } 459 // Tenemos siempre un cero por la inicializacion de J, entonces 460 // lo quitamos. 461 J = simplify (J,2); 462 l = insert (l,J); 463 } 464 setring R; 465 list l = fetch (R1,l); 466 kill R1; 467 return (l); 434 for (i = 1 ; i <= sizI ; i++) 435 { 436 J = 0; 437 exp_I = leadexp (I[i]); 438 for (j = 1 ; j <= nvar ; j++) 439 { 440 if (exp_I[j] <> 0) 441 { 442 exp[j] = v[j] + 1 - exp_I[j]; 443 J = J, var(j)^exp[j]; 444 } 445 } 446 // Tenemos siempre un cero por la inicializacion de J, entonces 447 // lo quitamos. 448 J = simplify (J,2); 449 l = insert (l,J); 450 } 451 return (l); 468 452 } 469 453 ///////////////////////////////////////////////////////////////////////////// … … 485 469 sizl1 = size(l1); 486 470 for (i = 1 ; i <= sizl1 ; i++) 487 488 489 471 { 472 l2[i] = radicalAux (l1[i]); 473 } 490 474 sizl2 = size(l2); 491 475 int sizl2i, sizl2j; … … 495 479 // l3 = primary components list 496 480 for (i = 1 ; i <= sizl1 ; i++) 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 481 { 482 J = l2[i]; 483 sizl2i = size(l2[i]); 484 K = l1[i]; 485 for (j = i+1 ; j <= sizl2 ; j++) 486 { 487 sizl2j = size(l2[j]); 488 if (sizl2i == sizl2j) 489 { 490 if (equal (J,l2[j]) == 1) 491 { 492 K = minbase(intersect (K,l1[j])); 493 l1 = delete (l1,j); 494 sizl1 = size(l1); 495 l2 = delete (l2,j); 496 sizl2 = size(l2); 497 j--; 498 } 499 } 500 } 501 l3 = insert (l3,K); 502 } 519 503 return (l3); 520 504 } 521 505 ///////////////////////////////////////////////////////////////////////////// 522 506 // 523 static proc isMinimal (ideal I) 507 static proc isMinimal (ideal I) 524 508 " 525 509 USAGE: isMinimal (I); I ideal. … … 535 519 I = simplify(I,2); 536 520 int resp = 1; 537 int sizI = size(I);521 int sizI = ncols(I); 538 522 // Cambiamos el tamano de I cuando eliminamos generadores 539 523 for (i = 1 ; i <= sizI ; i++) 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 // generadores como debemos.562 563 564 565 566 567 568 569 570 524 { 525 if (sizI <> 1) 526 { 527 if (i == 1) 528 { 529 J = I[2..sizI]; 530 } 531 else 532 { 533 if (i > 1 && i < sizI) 534 { 535 J = I[1..i-1], I[i+1..sizI]; 536 } 537 else 538 { 539 J = I[1..sizI-1]; 540 } 541 } 542 // Si quitamos el generador del lugar "i", luego el que 543 // ocupa ahora el lugar "i" es el "i+1", de ahi que restemos 544 // 1 al i para volver al for de manera que recorramos los 545 // generadores como debemos. 546 if (membershipMon(I[i],J) == 1) 547 { 548 resp = 0; 549 I = J; 550 i--; 551 sizI = size(I); 552 } 553 } 554 } 571 555 if (resp == 1) 572 573 574 556 { 557 return (1); 558 } 575 559 else 576 577 578 560 { 561 return (0,I); 562 } 579 563 } 580 564 ///////////////////////////////////////////////////////////////////////////// 581 // 582 static proc isMonomialGB (ideal I) 565 // 566 static proc isMonomialGB (ideal I) 583 567 " 584 568 USAGE: isMonomialGB (I); I ideal. … … 591 575 " 592 576 { 593 // Cambiamos de anillo594 def R = basering;595 int nvar = nvars(R);596 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";597 execute(s);598 599 577 // Variables 600 int resp,m,k; 601 // Queremos la base de Grobner reducida, para uncidad. 602 ideal I = fetch(R,I); 603 option(redSB); 578 int resp; 604 579 // Si el ideal es cero, no es monomial. 605 580 if ( size(I) == 0) 606 { 607 return(0); 608 } 581 { 582 return(0); 583 } 584 // Queremos la base de Grobner reducida, para uncidad. 585 intvec save_opt=option(get); 586 option(redSB); 609 587 // Base de Grobner 610 588 I = std(I); 589 option(set,save_opt); 611 590 // Una vez que tenemos la GB, no es mas que comprobar que el ideal 612 591 // esta generado por monomios. 613 592 resp = checkIdeal(I); 614 593 if (resp == 0) 615 { 616 setring R; 617 kill R1; 618 return (0); 619 } 594 { 595 return (0); 596 } 620 597 else 621 { 622 setring R; 623 I = fetch (R1,I); 624 kill R1; 625 return (1,I); 626 } 598 { 599 return (1,I); 600 } 627 601 } 628 602 ///////////////////////////////////////////////////////////////////////////// … … 635 609 proc areEqual(list l1,list l2) 636 610 { 637 def R = basering;638 l1 = fetch(R,l1);639 l2 = fetch(R,l2);640 611 int i,j,sizIdeal; 641 612 poly generator; … … 643 614 int sizl1 = size(l1); 644 615 for (i = 1 ; i <= sizl1 ; i ++) 645 646 647 648 649 650 651 652 653 616 { 617 sizIdeal = size(l1[i]); 618 generator = 1; 619 for (j = 1 ; j <= sizIdeal ; j ++) 620 { 621 generator = generator*l1[i][j]; 622 } 623 l1Ideal[i] = generator; 624 } 654 625 int sizl2 = size(l2); 655 626 for (i = 1 ; i <= sizl2 ; i ++) 656 657 658 659 660 661 662 663 664 627 { 628 sizIdeal = size(l2[i]); 629 generator = 1; 630 for (j = 1 ; j <= sizIdeal ; j ++) 631 { 632 generator = generator*l2[i][j]; 633 } 634 l2Ideal[i] = generator; 635 } 665 636 return (equal(l1Ideal,l2Ideal)); 666 637 } … … 670 641 //-------------------------------------------------------------------------// 671 642 ///////////////////////////////////////////////////////////////////////////// 672 // 673 proc isMonomial (ideal I) 643 // 644 proc isMonomial (ideal I) 674 645 "USAGE: isMonomial (I); I ideal. 675 646 RETURN: 1, if I is monomial ideal; 0, otherwise. … … 678 649 " 679 650 { 680 // Cambiamos de anillo 681 def R = basering; 682 int nvar = nvars(R); 683 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 684 execute(s); 651 // Si el ideal es cero, no es monomial. 652 if ( size(I) == 0) 653 { 654 return(0); 655 } 656 // Si ya viene dado por sistema de generadores monomiales, devolvemos 1 657 if (checkIdeal (I) == 1) 658 { 659 return(1); 660 } 685 661 // Variables 686 662 int resp,m,k; 687 663 // Queremos la base de Grobner reducida, para uncidad. 688 ideal I = fetch(R,I); 689 option(redSB); 690 // Si el ideal es cero, no es monomial. 691 if ( size(I) == 0) 692 { 693 return(0); 694 } 695 // Si ya viene dado por sistema de generadores monomiales, devolvemos 1 696 if (checkIdeal (I) == 1) 697 { 698 return(1); 699 } 664 intvec save_opt=option(get); 665 option(redSB); 700 666 // Hallamos GB 701 667 I = std(I); 668 option(set,save_opt); 702 669 // Una vez que tenemos la GB, no es mas que comprobar si el ideal 703 670 // esta generado por monomios. 704 671 resp = checkIdeal(I); 705 672 // Volvemos a dejar el comando "std" devolviendo una GB estandar. 706 option(noredSB);707 setring R;708 kill R1;709 673 return(resp); 710 674 } … … 733 697 int control = checkIdeal(I); 734 698 if (control == 0) 735 736 737 699 { 700 return (-1); 701 } 738 702 // Quitamos los ceros del sistema de generadores. 739 703 I = simplify(I,2); 740 int sizI = size(I);704 int sizI = ncols(I); 741 705 for (i = 1 ; i <= sizI ; i++) 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 // generadores como debemos.767 768 769 770 771 sizI = size(I);772 773 774 706 { 707 if (sizI > 1) 708 { 709 if (i == 1) 710 { 711 J = I[2..sizI]; 712 } 713 else 714 { 715 if (i > 1 && i < sizI) 716 { 717 J = I[1..i-1], I[i+1..sizI]; 718 } 719 else 720 { 721 if (i == sizI) 722 { 723 J = I[1..sizI-1]; 724 } 725 } 726 } 727 // Si quitamos el generador del lugar "i", luego el que 728 // ocupa ahora el lugar "i" es el "i+1", de ahi que restemos 729 // 1 al i para volver al for de manera que recorramos los 730 // generadores como debemos. 731 if (membershipMon(I[i],J) == 1) 732 { 733 I = J; 734 i--; 735 sizI = ncols(I); 736 } 737 } 738 } 775 739 return (I); 776 740 } … … 841 805 ERROR ("the input must be 2 monomials."); 842 806 } 843 // Variables. 844 int k; 845 intvec exp; 846 int nvar = nvars(basering); 807 return(f*g/gcd(f,g)); 808 //// Variables. 809 //int k; 810 //intvec exp; 811 //int nvar = nvars(basering); 847 812 848 // No tenemos mas que tomar el mayor exponente.849 intvec expf = leadexp (f);850 intvec expg = leadexp (g);851 852 for (k = 1 ; k <= nvar ; k ++)853 {854 if (expf[k] <= expg[k])855 {856 exp[k] = expg[k];857 }858 else859 {860 exp[k] = expf[k];861 }862 }863 // Transformamos el vector de exponentes al monomio correspondiente.864 return(monomial (exp));813 //// No tenemos mas que tomar el mayor exponente. 814 //intvec expf = leadexp (f); 815 //intvec expg = leadexp (g); 816 817 //for (k = 1 ; k <= nvar ; k ++) 818 //{ 819 // if (expf[k] <= expg[k]) 820 // { 821 // exp[k] = expg[k]; 822 // } 823 // else 824 // { 825 // exp[k] = expf[k]; 826 // } 827 //} 828 //// Transformamos el vector de exponentes al monomio correspondiente. 829 //return(monomial (exp)); 865 830 } 866 831 example … … 873 838 ////////////////////////////////////////////////////////////////////// 874 839 // 875 proc membershipMon(poly f,ideal I) 840 proc membershipMon(poly f,ideal I) 876 841 "USAGE: membershipMon(f,I); f polynomial, I ideal. 877 842 RETURN: 1, if f lies in I; 0 otherwise. … … 881 846 " 882 847 { 883 def R = basering;884 848 // Variables 885 849 int i,j,resp,k,control; … … 914 878 // Quitamos ceros. 915 879 I = simplify(I,2); 916 int n = size(I);880 int n = ncols(I); 917 881 int m = size(f); 918 int nvar = nvars( R);882 int nvar = nvars(basering); 919 883 for (i=1 ; i<=m ; i++) 920 884 { … … 976 940 ////////////////////////////////////////////////////////////////////// 977 941 // 978 proc intersectMon (ideal I,ideal J) 942 proc intersectMon (ideal I,ideal J) 979 943 "USAGE: intersectMon (I,J); I,J ideals. 980 944 RETURN: an ideal, the intersection of I and J. … … 991 955 // El ideal trivial no es monomial. 992 956 if ( size(I) == 0 || size(J) == 0) 993 994 995 957 { 958 ERROR("one of the ideals is zero, hence not monomial."); 959 } 996 960 // COMPROBACIONES 997 961 control = checkIdeal(I); 998 962 if (control == 0) 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 963 { 964 isMon = isMonomialGB(I); 965 if (isMon[1] == 0) 966 { 967 ERROR ("the first ideal is not monomial."); 968 } 969 else 970 { 971 // Sabemos que I ya viene dado por el sistema minimal de 972 // generadores, aunque aqui no sea necesario. 973 I = isMon[2]; 974 } 975 } 1012 976 else 1013 1014 1015 1016 977 { 978 // Los generadores son monomiales, hallamos el sistema minimal 979 I = minbase(I); 980 } 1017 981 control = checkIdeal(J); 1018 982 if (control == 0) 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 983 { 984 isMon = isMonomialGB (J); 985 if (isMon[1] == 0) 986 { 987 ERROR ("the second ideal is not monomial."); 988 } 989 else 990 { 991 // Sabemos que J ya viene dado por el sistema minimal de 992 // generadores, aunque aqui no sea necesario. 993 J = isMon[2]; 994 } 995 } 1032 996 else 1033 1034 1035 1036 997 { 998 // Los generadores son monomiales,hallamos la base minimal 999 J = minbase(J); 1000 } 1037 1001 // Hemos asegurado que los ideales sean monomiales. 1038 1002 // Quitamos ceros de la base para no alargar calculos. 1039 int n = size(I);1040 int m = size(J);1003 int n = ncols(I); 1004 int m = ncols(J); 1041 1005 // Hallamos el m.c.m.de cada par de generadores de uno y otro ideal 1042 1006 // y los a?adimos al ideal interseccion. 1043 1007 for (i=1 ; i<=n ; i++) 1044 1045 1046 1047 1048 1049 1008 { 1009 for (j=1 ; j<=m ; j++) 1010 { 1011 K = K , lcmMon (I[i],J[j]); 1012 } 1013 } 1050 1014 // Devolvemos el ideal ya dado por la base minimal porque sabemos 1051 1015 // que este procedimiento genera muchos generadores redundantes. … … 1061 1025 ////////////////////////////////////////////////////////////////////// 1062 1026 // 1063 proc quotientMon (ideal I,ideal J) 1027 proc quotientMon (ideal I,ideal J) 1064 1028 "USAGE: quotientMon (I,J); I,J ideals. 1065 1029 RETURN: an ideal, the quotient I:J. … … 1076 1040 //COMPROBACIONES 1077 1041 if (size(I) == 0 || size(J) == 0) 1078 1079 1080 1042 { 1043 ERROR("one of the ideals is zero, hence not monomial."); 1044 } 1081 1045 control = checkIdeal(I); 1082 1046 if (control == 0) 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1047 { 1048 isMon = isMonomialGB (I); 1049 if (isMon[1] == 0) 1050 { 1051 ERROR ("the first ideal is not monomial."); 1052 } 1053 else 1054 { 1055 // Sabemos que I ya viene dado por el sistema minimal de 1056 // generadores, aunque aqui no sea necesario. 1057 I = isMon[2]; 1058 } 1059 } 1096 1060 else 1097 1098 1099 1100 1061 { 1062 // Los generadores son monomiales,hallamos sistema minimal 1063 I = minbase(I); 1064 } 1101 1065 control = checkIdeal(J); 1102 1066 if (control == 0) 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1067 { 1068 isMon = isMonomialGB (J); 1069 if (isMon[1] == 0) 1070 { 1071 ERROR ("the second ideal is not monomial."); 1072 return (-1); 1073 } 1074 else 1075 { 1076 // Sabemos que J ya viene dado por el sistema minimal de 1077 // generadores, aunque aqui no sea necesario. 1078 J = isMon[2]; 1079 } 1080 } 1117 1081 else 1118 1119 1120 1121 1082 { 1083 // Los generadores son monomiales, hallamos el sistema minimal 1084 J = minbase(J); 1085 } 1122 1086 // Tenemos los ideales dados por su sistema minimal (aunque no es necesario, ahorra 1123 1087 // calculos. En K vamos a tener la interseccion de los ideales. … … 1126 1090 // Los ideales estan dados por su sistema minimal, con lo que no aparecen ceros. 1127 1091 // Luego podemos usar size(J). 1128 n = size(J);1092 n = ncols(J); 1129 1093 for (i = 1 ; i <= n ; i++) 1130 1131 1132 1094 { 1095 K = intersect (K ,quotientIdealMon(I,J[i])); 1096 } 1133 1097 // Aqui tambien surgen muchos generadores que no forman parte de la 1134 1098 // base minimal del ideal obtenido. … … 1154 1118 { 1155 1119 // Cambiamos de anillo 1156 def R = basering; 1157 int nvar = nvars(R); 1158 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 1159 execute(s); 1120 int nvar = nvars(basering); 1160 1121 // Variables 1161 1122 int i,m,j,control; … … 1163 1124 intvec v; 1164 1125 ideal rad_I; 1165 ideal I = fetch(R,I);1166 1126 // COMPROBACIONES 1167 1127 control = checkIdeal(I); … … 1169 1129 // que comprobar si el ideal es monomial. 1170 1130 if (control == 0) 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1131 { 1132 list isMon = isMonomialGB (I); 1133 if (isMon[1] == 0) 1134 { 1135 ERROR ("the ideal is not monomial."); 1136 } 1137 else 1138 { 1139 I = isMon[2]; 1140 // Ya lo tenemos con los generadores monomiales minimales 1141 } 1142 } 1183 1143 else 1184 1185 1186 1187 1144 { 1145 // Generadores monomiales, hallamos sistema minimal 1146 I = minbase(I); 1147 } 1188 1148 // Ya tenemos el ideal generado por la BASE MINIMAL MONOMIAL 1189 m = size(I);1149 m = ncols(I); 1190 1150 // Solo hay que poner exponente 1 a todas las variables que tengan 1191 1151 // exponente >1. 1192 1152 for (i = 1 ; i <= m ; i++) 1193 { 1194 v = leadexp(I[i]); 1195 f = 1; 1196 for (j = 1 ; j <= nvar ; j++) 1197 { 1198 if (v[j] <> 0) 1199 { 1200 f = f*x(j); 1201 } 1202 } 1203 rad_I = rad_I,f; 1204 } 1205 setring R; 1153 { 1154 v = leadexp(I[i]); 1155 f = 1; 1156 for (j = 1 ; j <= nvar ; j++) 1157 { 1158 if (v[j] <> 0) 1159 { 1160 f = f*var(j); 1161 } 1162 } 1163 rad_I = rad_I,f; 1164 } 1206 1165 // Hay que devolver el ideal dado por la base minimal, pues se 1207 1166 // producen muchos generadores redundantes. 1208 ideal rad_I = fetch(R1,rad_I);1209 kill R1;1210 1167 return( minbase (rad_I)); 1211 1168 } … … 1218 1175 ////////////////////////////////////////////////////////////////////// 1219 1176 // 1220 proc isprimeMon (ideal I) 1177 proc isprimeMon (ideal I) 1221 1178 "USAGE: isprimeMon (I); I ideal 1222 1179 RETURN: 1, if I is prime; 0, otherwise. … … 1234 1191 // que comprobar si el ideal es monomial. 1235 1192 if (control == 0) 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1193 { 1194 list isMon = isMonomialGB (I); 1195 if (isMon[1] == 0) 1196 { 1197 ERROR ("the ideal is not monomial."); 1198 } 1199 else 1200 { 1201 I = isMon[2]; 1202 // Ya lo tenemos con los generadores minimales 1203 } 1204 } 1248 1205 else 1249 1250 1251 1252 1206 { 1207 // Generadores monomiales, hallamos el sistema minimal 1208 I = minbase(I); 1209 } 1253 1210 // Ya tenemos el ideal generado por la BASE MINIMAL 1254 1211 if (maxdeg1(I) == 1) 1255 1256 1257 1258 return (0); 1212 { 1213 return (1); 1214 } 1215 return (0); 1259 1216 } 1260 1217 example … … 1268 1225 ////////////////////////////////////////////////////////////////////// 1269 1226 // 1270 proc isprimaryMon (ideal I) 1227 proc isprimaryMon (ideal I) 1271 1228 "USAGE: isprimaryMon (I); I ideal 1272 1229 RETURN: 1, if I is primary; 0, otherwise. … … 1276 1233 " 1277 1234 { 1278 def R = basering;1279 1235 // Variables 1280 1236 int nvar,control,m,l,sub_in,i,j,k; … … 1285 1241 // que comprobar si el ideal es monomial. 1286 1242 if (control == 0) 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1243 { 1244 list isMon = isMonomialGB (I); 1245 if (isMon[1] == 0) 1246 { 1247 ERROR ("the ideal is not monomial."); 1248 } 1249 else 1250 { 1251 I = isMon[2]; 1252 // Ya lo tenemos con los generadores minimales 1253 } 1254 } 1299 1255 else 1300 1301 1302 1303 1256 { 1257 // Generadores monomiales, hallamos el sistema minimal 1258 I = minbase(I); 1259 } 1304 1260 // Ya tenemos el ideal generado por la BASE MINIMAL 1305 1261 // Usamos la funcion "soporte" que hemos creado, para saber que … … 1307 1263 // mismas y tambien cuales son los generadores del ideal donde 1308 1264 // tenemos que comprobar si aparecen tales variables. 1309 nvar = nvars( R);1310 m = size(I);1265 nvar = nvars(basering); 1266 m = ncols(I); 1311 1267 // Inicializo la ultima componente del vector para que contenga a 1312 1268 // todas las variables (el subindice de la variable es el lugar … … 1317 1273 // w = lugar de los generadores de I que son producto de mas de una variable. 1318 1274 for (i = 1 ; i <= m ; i++) 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1275 { 1276 sub_in = soporte(I[i]); 1277 // Si soporte <> 0 la variable aparece sola, en caso contrario 1278 // el generador es producto de mas de una variable 1279 if (sub_in <> 0) 1280 { 1281 v[sub_in] = 1; 1282 } 1283 else 1284 { 1285 w[k] = i; 1286 k++; 1287 } 1288 } 1333 1289 // Ahora solo hay que ver que no aparecen variables distintas de 1334 1290 // las que tenemos marcadas con 1 en v. … … 1337 1293 // son producto de una sola variable, luego es primario. 1338 1294 if (l == 1 && w[1] == 0) 1339 1340 1341 1295 { 1296 return(1); 1297 } 1342 1298 // Estudiamos el exponente de los generadores de I oportunos (los 1343 1299 // que nos indica w). 1344 1300 for (i = 1 ; i <= l ; i++) 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1301 { 1302 exp_gen = leadexp(I[w[i]]); 1303 for (j = 1 ; j <= nvar ; j++) 1304 { 1305 if (v[j] == 0) 1306 { 1307 if (exp_gen[j] <> 0) 1308 { 1309 return (0); 1310 } 1311 } 1312 } 1313 } 1358 1314 // Si hemos recorrido todo el ideal sin que salte el "for" 1359 1315 // quiere decir que no se ha contradicho la caracterizacion, … … 1386 1342 // que comprobar si el ideal es monomial. 1387 1343 if (control == 0) 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1344 { 1345 list isMon = isMonomialGB (I); 1346 if (isMon[1] == 0) 1347 { 1348 ERROR ("the ideal is not monomial."); 1349 } 1350 else 1351 { 1352 I = isMon[2]; 1353 // Ya lo tenemos con los generadores minimales 1354 } 1355 } 1400 1356 else 1401 1402 1403 1404 1357 { 1358 // Generadores monomiales, hallamos sistema minimal 1359 I = minbase(I); 1360 } 1405 1361 // Ya tenemos el ideal generado por la BASE MINIMAL 1406 n = size(I);1362 n = ncols(I); 1407 1363 // La funcion soporte devuelve 0 si el monomio es producto de mas 1408 1364 // de una variable. Chequeamos generador a generador si el ideal 1409 1365 // esta generado por potencias de variables. 1410 1366 for (i = 1 ; i <= n ; i ++) 1411 1412 1413 1414 1415 1416 1367 { 1368 if (soporte(I[i]) == 0) 1369 { 1370 return(0); 1371 } 1372 } 1417 1373 return (1); 1418 1374 } … … 1435 1391 " 1436 1392 { 1437 def R = basering; 1438 int nvar = nvars(R); 1393 int nvar = nvars(basering); 1439 1394 // Declaracion de variables 1440 1395 int i,j,k,cont,sizI; … … 1445 1400 // que comprobar si el ideal es monomial. 1446 1401 if (control == 0) 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1402 { 1403 list isMon = isMonomialGB (I); 1404 if (isMon[1] == 0) 1405 { 1406 ERROR ("the ideal is not monomial."); 1407 } 1408 else 1409 { 1410 I = isMon[2]; 1411 // Ya lo tenemos con los generadores minimales 1412 } 1413 } 1459 1414 else 1460 1461 1462 1463 1415 { 1416 // Generadores monomiales, hallamos sistema minimal 1417 I = minbase(I); 1418 } 1464 1419 // Ya tenemos el ideal generado por la BASE MINIMAL 1465 sizI = size(I);1420 sizI = ncols(I); 1466 1421 // Comprobamos que entre los generadores minimales aparece una 1467 1422 // potencia de cada. Cuando encontramos un generador que es potencia … … 1469 1424 cont = 0; 1470 1425 for (i = 1 ; i <= sizI ; i++) 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1426 { 1427 if (soporte(I[i]) <> 0) 1428 { 1429 cont ++; 1430 // Solo volvemos a evaluar en caso de que hayamos aumentado 1431 if (cont == nvar) 1432 { 1433 // Ya hemos encontrado que todas las variables aparrecen en 1434 // el sistema minimal como potencia pura. No queremos seguir 1435 // buscando 1436 return (1); 1437 } 1438 } 1439 } 1485 1440 // Si ha salido, es que faltan variables 1486 1441 return(0); … … 1504 1459 " 1505 1460 { 1506 def R = basering; 1507 int nvar = nvars(R); 1461 int nvar = nvars(basering); 1508 1462 // Declaracion de variables 1509 1463 int sizI,i,j,k; … … 1514 1468 // que comprobar si el ideal es monomial. 1515 1469 if (control == 0) 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1470 { 1471 list isMon = isMonomialGB (I); 1472 if (isMon[1] == 0) 1473 { 1474 ERROR ("the ideal is not monomial."); 1475 } 1476 else 1477 { 1478 I = isMon[2]; 1479 // Ya lo tenemos con los generadores minimales 1480 } 1481 } 1528 1482 else 1529 1530 1531 1532 1483 { 1484 // Generadores monomiales, hallamos sistema minimal 1485 I = minbase(I); 1486 } 1533 1487 // Ya tenemos el ideal generado por la BASE MINIMAL 1534 sizI = size(I);1488 sizI = ncols(I); 1535 1489 // Creamos una lista que tenga los exponentes de todos los 1536 1490 // generadores. 1537 1491 for (i = 1 ; i <= sizI ; i++) 1538 1539 1540 1492 { 1493 exp[i] = leadexp(I[i]); 1494 } 1541 1495 // Ahora hay que ver si alguno se repite, y si uno de ellos 1542 1496 // lo hace, ya no es gen?rico. 1543 1497 for (i = 1 ; i <= nvar ; i++) 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1498 { 1499 for (j = 1 ; j <= sizI-1 ; j++) 1500 { 1501 for (k = j+1 ; k <= sizI ; k++) 1502 { 1503 // Notar que no se pueden repetir si la variable realmente 1504 // aparece en el generador, es decir, exponente >1. 1505 if (exp[j][i] == exp[k][i] & exp[j][i] <> 0) 1506 { 1507 return (0); 1508 } 1509 } 1510 } 1511 } 1558 1512 return (1); 1559 1513 } … … 1577 1531 " 1578 1532 { 1579 def R = basering; 1580 int nvar = nvars(R); 1533 // El ideal trivial no es monomial. 1534 if ( size(I) == 0 ) 1535 { 1536 ERROR("the ideal is zero, hence not monomial."); 1537 } 1581 1538 // VARIABLES 1582 1539 int control,sizSum,sumandos,i,j,k,cont; 1583 intvec index,indexAux,vaux,w;1584 list sum, sumAux;1585 // La base del ideal tiene que ser la monomial1586 // El ideal trivial no es monomial.1587 if ( size(I) == 0 )1588 {1589 ERROR("the ideal is zero, hence not monomial.");1590 }1591 1540 // COMPROBACIONES 1592 1541 control = checkIdeal(I); 1593 1542 if (control == 0) 1594 { 1595 list isMon = isMonomialGB (I); 1596 if (isMon[1] == 0) 1597 { 1598 ERROR ("the ideal is not monomial."); 1599 } 1600 else 1601 { 1602 // Sabemos que I ya viene dado por el sistema minimal de 1603 // generadores, aunque aqui no sea necesario. 1604 I = isMon[2]; 1605 } 1606 } 1607 // Si el ideal es artiniano, es 0-dimensional 1608 if (isartinianMon(I) == 1) 1609 { 1610 return (0); 1611 } 1612 int sizI = size(I); 1613 // v(i) = vector con sizI entradas y donde cada entrada "j" se corresponde 1614 // con el exponente del generador "i" en la variable "j" 1615 for (i = 1 ; i <= nvar ; i++) 1616 { 1617 intvec v(i); 1618 for (j = 1 ; j <= sizI ;j++ ) 1619 { 1620 v(i)[j] = leadexp(I[j])[i]; 1621 } 1622 } 1623 // Vamos a guardar en el vector "index" la ultima variable que se ha 1624 // sumado y en cada "sum(i)" el vector suma que se corresponde con la 1625 // entrada "i" del vector index. 1626 // Inicializo los valores de index y de cada sum 1627 w[sizI] = 0; 1628 sum[1] = w; 1629 index[1] = 0; 1630 sizSum = 1; 1631 while ( 1 ) 1632 { 1633 cont = 1; 1634 sumandos ++; 1635 for (i = 1 ; i <= sizSum ; i ++) 1636 { 1637 for (j = index[i] + 1 ; j <= nvar ; j ++) 1638 { 1639 w = sum[i]; 1640 vaux = w + v(j); 1641 // Comprobamos 1642 for (k = 1 ; k <= sizI ; k ++) 1643 { 1644 if (vaux[k] == 0) 1645 { 1646 break; 1647 } 1648 } 1649 if (k == sizI +1) 1650 { 1651 return (nvar - sumandos); 1652 } 1653 if (j <> nvar) 1654 { 1655 sumAux[cont] = vaux; 1656 indexAux[cont] = j; 1657 cont ++; 1658 } 1659 } 1660 1661 } 1662 index = indexAux; 1663 sum = sumAux; 1664 sizSum = size(sumAux); 1665 } 1543 { 1544 list isMon = isMonomialGB (I); 1545 if (isMon[1] == 0) 1546 { 1547 ERROR ("the ideal is not monomial."); 1548 } 1549 else 1550 { 1551 // Sabemos que I ya viene dado por el sistema minimal de 1552 // generadores, aunque aqui no sea necesario. 1553 I = isMon[2]; 1554 } 1555 } 1556 attrib(I,"isSB",1); 1557 return (dim(I)); 1558 // int nvar = nvars(basering); 1559 // intvec index,indexAux,vaux,w; 1560 // list sum, sumAux; 1561 // // La base del ideal tiene que ser la monomial 1562 // // Si el ideal es artiniano, es 0-dimensional 1563 // if (isartinianMon(I) == 1) 1564 // { 1565 // return (0); 1566 // } 1567 // int sizI = ncols(I); 1568 // // v(i) = vector con sizI entradas y donde cada entrada "j" se corresponde 1569 // // con el exponente del generador "i" en la variable "j" 1570 // for (i = 1 ; i <= nvar ; i++) 1571 // { 1572 // intvec v(i); 1573 // for (j = 1 ; j <= sizI ;j++ ) 1574 // { 1575 // v(i)[j] = leadexp(I[j])[i]; 1576 // } 1577 // } 1578 // // Vamos a guardar en el vector "index" la ultima variable que se ha 1579 // // sumado y en cada "sum(i)" el vector suma que se corresponde con la 1580 // // entrada "i" del vector index. 1581 // // Inicializo los valores de index y de cada sum 1582 // w[sizI] = 0; 1583 // sum[1] = w; 1584 // index[1] = 0; 1585 // sizSum = 1; 1586 // while ( 1 ) 1587 // { 1588 // cont = 1; 1589 // sumandos ++; 1590 // for (i = 1 ; i <= sizSum ; i ++) 1591 // { 1592 // for (j = index[i] + 1 ; j <= nvar ; j ++) 1593 // { 1594 // w = sum[i]; 1595 // vaux = w + v(j); 1596 // // Comprobamos 1597 // for (k = 1 ; k <= sizI ; k ++) 1598 // { 1599 // if (vaux[k] == 0) 1600 // { 1601 // break; 1602 // } 1603 // } 1604 // if (k == sizI +1) 1605 // { 1606 // return (nvar - sumandos); 1607 // } 1608 // if (j <> nvar) 1609 // { 1610 // sumAux[cont] = vaux; 1611 // indexAux[cont] = j; 1612 // cont ++; 1613 // } 1614 // } 1615 // } 1616 // index = indexAux; 1617 // sum = sumAux; 1618 // sizSum = size(sumAux); 1619 // } 1666 1620 } 1667 1621 example … … 1690 1644 static proc irredDec1 (ideal I) 1691 1645 { 1692 // Cambiamos de anillo1693 def R = basering;1694 int nvar = nvars(R);1695 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";1696 execute(s);1697 1646 // Variables 1698 1647 int i,j,n,resp; … … 1700 1649 intvec exp,v; 1701 1650 ideal J,K; 1702 ideal I = fetch(R,I);1703 1651 // ----- DESCOMPOSICION IRREDUCIBLE 1704 1652 // Inicializamos la lista que va a estar formada por los ideales … … 1707 1655 l1 = I; 1708 1656 while (size(l1) > 0) 1709 1710 1711 1712 1713 n = size(J);1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 K = J,x(v[j+1])^exp[v[j+1]];1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1657 { 1658 for (i = 1 ; i <= size(l1) ; i++) 1659 { 1660 J = l1[i]; 1661 n = ncols(J); 1662 l1 = delete(l1,i); 1663 // Llamamos a la funcion que va a detectar si el ideal es o 1664 // no irreducible, y en caso de no serlo sabemos sobre que 1665 // generador y con que variables hay que aplicar el 1666 // el resultado teorico. 1667 v = irredAux (J); 1668 // No irreducible 1669 if (size(v) > 1) 1670 { 1671 // En este caso, v[1] nos indica el generador del ideal 1672 // que debemos eliminar. 1673 exp = leadexp(J[v[1]]); 1674 if (v[1] == 1) 1675 { 1676 J = J[2..n]; 1677 } 1678 if (v[1] > 1 && v[1] < n) 1679 { 1680 J = J[1..v[1]-1],J[v[1]+1..n]; 1681 } 1682 if (v[1] == n) 1683 { 1684 J = J[1..n-1]; 1685 } 1686 // Ahora vamos a introducir los nuevos generadores en 1687 // cada uno de los nuevos ideales que generamos. Los 1688 // ponemos en la lista en la que comprobamos. 1689 for (j = 1 ; j <= size(v)-1 ; j++) 1690 { 1691 K = J,var(v[j+1])^exp[v[j+1]]; 1692 l1 = insert(l1,minbase(K)); 1693 } 1694 } 1695 // Si v[1]=0, el ideal es irreducible y lo introducimos en 1696 // la lista l2, que es la que finalmente devolvera las 1697 // componentes de la descomposicion. 1698 else 1699 { 1700 l2 = insert(l2,J); 1701 } 1702 } 1703 } 1756 1704 // ---- IRREDUNDANTE 1757 1705 l2 = irredundant (l2); 1758 1706 // La salida es la lista de los ideales irreducibles. 1759 setring R;1760 list l2 = fetch(R1,l2);1761 kill R1;1762 1707 return (l2); 1763 1708 } … … 1767 1712 ////////////////////////////////////////////////////////////////////// 1768 1713 // 1769 static proc primDec1 (ideal I) { 1714 static proc primDec1 (ideal I) 1715 { 1770 1716 // Variables 1771 1717 list l1,l2; … … 1779 1725 // METODO 2: Metodo directo para descomp. primaria (ver Vasconcelos) 1780 1726 // 1781 ////////////////////////////////////////////////////////////////////// 1727 ////////////////////////////////////////////////////////////////////// 1782 1728 // La siguiente funcion va a calcular una descomposicion primaria // 1783 1729 // minimal de un ideal monomial, pero esta vez usando la // … … 1786 1732 ////////////////////////////////////////////////////////////////////// 1787 1733 // 1788 static proc primDec2 (ideal I) { 1789 // Cambiamos de anillo 1790 def R = basering; 1791 int nvar = nvars(R); 1792 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 1793 execute(s); 1734 static proc primDec2 (ideal I) 1735 { 1794 1736 // Variables en el nuevo anillo 1795 1737 int i,n,max; … … 1797 1739 intvec v; 1798 1740 ideal J,K; 1799 ideal I = fetch(R,I);1800 1741 // Vamos a tener dos listas: l1 que va a guardar todos los ideales 1801 1742 // que vayamos generando con el resultado citado antes, que seran … … 1805 1746 l1 = I; 1806 1747 while (size(l1) > 0) 1807 1808 1809 1810 1811 n = size(J);1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 K = J,x(v[2])^max;1827 1828 K = quotientIdealMon(J,x(v[2])^max);1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1748 { 1749 for (i = 1 ; i <= size(l1) ; i++) 1750 { 1751 J = l1[i]; 1752 n = ncols(J); 1753 l1 = delete (l1,i); 1754 // Usamos la funcion que hemos creado para saber si el ideal 1755 // es primario. Si no lo es devuelve la variable que crea 1756 // conflicto y los generadores del ideal que luego hay que 1757 // usar (los que tienen productos de mas de una vble). 1758 // Se le llama con el sistema minimal de generadores 1759 v = primAux (J); 1760 // En caso de no ser primario, hay que buscar el maximo 1761 // exponente de la variable que aparece en los generadores 1762 // del ideal multiplicada siempre por otras variables, 1763 // nunca por si misma. 1764 if (v[1] == 0) 1765 { 1766 max = maxExp(J,v); 1767 K = J,var(v[2])^max; 1768 l1 = insert (l1,minbase(K)); 1769 K = quotientIdealMon(J,var(v[2])^max); 1770 // quotientidealMon devuelve sistema minimal de generadores 1771 l1 = insert (l1,minbase(K)); 1772 } 1773 // En caso de ser primario, lo introducimos en la lista 1774 // conveniente. 1775 else 1776 { 1777 l2 = insert (l2,J); 1778 } 1779 } 1780 } 1840 1781 // ------ IRREDUNDANTE 1841 1782 l2 = irredundant (l2); 1842 setring R;1843 list l2 = fetch (R1,l2);1844 kill R1;1845 1783 return (l2); 1846 1784 } … … 1854 1792 ////////////////////////////////////////////////////////////////////// 1855 1793 // 1856 static proc irredDec3 (ideal I) {1857 def R = basering; 1794 static proc irredDec3 (ideal I) 1795 { 1858 1796 int i,n,j; 1859 1797 poly lcm; … … 1862 1800 list l; 1863 1801 // Hallamos el m.c.m. de los generadores minimales del ideal. 1864 n = size(I);1802 n = ncols (I); 1865 1803 lcm = I[1]; 1866 1804 for ( i = 2 ; i <= n ; i++ ) 1867 1868 1869 1805 { 1806 lcm = lcmMon (lcm,I[i]); 1807 } 1870 1808 v = leadexp (lcm); 1871 1809 // Calculamos el dual de Alexander. … … 1889 1827 ////////////////////////////////////////////////////////////////////// 1890 1828 // 1891 static proc primDec3 (ideal I) { 1829 static proc primDec3 (ideal I) 1830 { 1892 1831 // Variables 1893 1832 list l1,l2; … … 1907 1846 ////////////////////////////////////////////////////////////////////// 1908 1847 // 1909 static proc irredDec4 (ideal I) { 1848 static proc irredDec4 (ideal I) 1849 { 1910 1850 // Cambiamos de anillo. 1911 def R = basering; 1912 int nvar = nvars(R); 1913 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 1914 execute(s); 1851 int nvar = nvars(basering); 1915 1852 // Variables 1916 1853 int n,i,j,m,resp; … … 1919 1856 ideal J,K; 1920 1857 list L; 1921 ideal I = fetch (R,I);1922 1858 // Calculamos el l.c.m. de los generadores minimales del ideal. 1923 n = size(I);1859 n = ncols (I); 1924 1860 lcm = I[1]; 1925 1861 for ( i = 2 ; i <= n ; i++ ) 1926 1927 1928 1862 { 1863 lcm = lcmMon (lcm,I[i]); 1864 } 1929 1865 v = leadexp (lcm); 1930 1866 // Hallamos el ideal J = (x(1)^(l(1)+1),...,x(n)^(l(n)+1)). Como … … 1933 1869 // el ideal J. 1934 1870 for ( i = 1 ; i <= nvar ; i++ ) 1935 1936 J[i] = (x(i))^(v[i]+1);1937 1871 { 1872 J[i] = (var(i))^(v[i]+1); 1873 } 1938 1874 // Ahora hacemos el cociente oportuno. 1939 1875 K = minbase(quotient (J,I)); … … 1941 1877 // generadores de J. Los generadores que son divisibles los hacemos 1942 1878 // cero y luego los eliminamos. 1943 m = size(K);1879 m = ncols (K); 1944 1880 for ( i = 1 ; i <= m ; i++ ) 1945 1946 1947 1948 1949 1950 1951 1881 { 1882 resp = membershipMon(K[i],J); 1883 if ( resp == 1) 1884 { 1885 K[i] = 0; 1886 } 1887 } 1952 1888 K = simplify (K,2); 1953 1889 // Ahora obtenemos las componentes de la descomposicion irreducible, … … 1956 1892 // Volvemos al anillo de partida y devolvemos la lista de las 1957 1893 // componentes irreducibles irredundantes. 1958 setring R;1959 list L = fetch(R1,L);1960 kill R1;1961 1894 return (L); 1962 1895 } … … 1967 1900 ////////////////////////////////////////////////////////////////////// 1968 1901 // 1969 static proc primDec4 (ideal I) { 1902 static proc primDec4 (ideal I) 1903 { 1970 1904 // Variables 1971 1905 list l1,l2; … … 1987 1921 static proc irredDec5 (ideal I) 1988 1922 { 1989 // New ring 1990 def R = basering; 1991 int nvar = nvars(R); 1992 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 1993 execute(s); 1994 ideal I = fetch (R,I); 1923 int nvar = nvars(basering); 1995 1924 //Variables 1996 1925 int i,j; … … 1999 1928 list artiniano = artinian (I); 2000 1929 if (artiniano[1] == 0) 2001 2002 2003 2004 1930 { 1931 I = artiniano[2]; 1932 intvec elimina = artiniano[3]; 1933 } 2005 1934 // Quotient 2006 ideal M = (x(1..nvar));1935 ideal M = maxideal(1); 2007 1936 ideal J = quotient (I,M); 2008 1937 // Deleting generators lying in I 2009 for (i = 1 ; i <= size(J) ; i ++)2010 2011 2012 2013 2014 2015 J = J[2..size(J)];2016 2017 2018 2019 2020 if (i == size(J))2021 2022 J = J[1..size(J)-1];2023 2024 2025 2026 2027 J = J[1..i-1],J[i+1..size(J)];2028 2029 2030 2031 2032 1938 for (i = 1 ; i <= ncols(J) ; i ++) 1939 { 1940 if (membershipMon(J[i],I) == 1) 1941 { 1942 if (i == 1) 1943 { 1944 J = J[2..ncols(J)]; 1945 i --; 1946 } 1947 else 1948 { 1949 if (i == ncols(J)) 1950 { 1951 J = J[1..i-1]; 1952 i --; 1953 } 1954 else 1955 { 1956 J = J[1..i-1],J[i+1..ncols(J)]; 1957 i --; 1958 } 1959 } 1960 } 1961 } 2033 1962 // Exponents of the ideals are going to form the decomposition 2034 int sizJ = size(J);1963 int sizJ = ncols(J); 2035 1964 for (i = 1 ; i <= sizJ ; i ++ ) 2036 2037 2038 1965 { 1966 intvec exp(i) = leadexp(J[i]) + 1; 1967 } 2039 1968 // Deleting artinianization process 2040 1969 if (artiniano[1] == 0) 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 1970 { 1971 // En elimina estan guardadas las variables que hay que eliminar 1972 for (i = 1 ; i <= nvar ; i ++) 1973 { 1974 if (elimina[i] <> 0) 1975 { 1976 for (j = 1 ; j <= sizJ ; j ++) 1977 { 1978 if (exp(j)[i] == elimina[i]) 1979 { 1980 exp(j)[i] = 0; 1981 } 1982 } 1983 } 1984 } 1985 } 2057 1986 // En exp(i) tengo los exponentes de cada variable de las que aparecen 2058 1987 // en cada ideal. 2059 1988 list facets; 2060 1989 for (i = 1 ; i <= sizJ ; i ++) 2061 { 2062 J = 0; 2063 for (j = 1 ; j <= nvar ; j ++) 2064 { 2065 if (exp(i)[j] <> 0) 2066 { 2067 J = J,x(j)^exp(i)[j]; 2068 } 2069 } 2070 J = simplify(J,2); 2071 facets[i] = J; 2072 } 2073 setring R; 2074 list facets = fetch (R1,facets); 2075 kill R1; 1990 { 1991 J = 0; 1992 for (j = 1 ; j <= nvar ; j ++) 1993 { 1994 if (exp(i)[j] <> 0) 1995 { 1996 J = J,var(j)^exp(i)[j]; 1997 } 1998 } 1999 J = simplify(J,2); 2000 facets[i] = J; 2001 } 2076 2002 return (facets); 2077 2003 } … … 2082 2008 ////////////////////////////////////////////////////////////////////// 2083 2009 // 2084 static proc primDec5 (ideal I) { 2010 static proc primDec5 (ideal I) 2011 { 2085 2012 // Variables 2086 2013 list l1,l2; … … 2108 2035 int max,j,k,sizI; 2109 2036 intvec exp; 2110 sizI = size(I);2037 sizI = ncols(I); 2111 2038 max = 0; 2112 2039 for (j = 1 ; j <= sizI ; j ++) 2113 2114 2115 2116 2117 2118 2119 2040 { 2041 exp = leadexp(I[j]); 2042 if ( exp[i] > max) 2043 { 2044 max = exp[i]; 2045 } 2046 } 2120 2047 return(max); 2121 2048 } … … 2130 2057 { 2131 2058 // Cambiamos de anillo 2132 def R = basering; 2133 int nvar = nvars(R); 2134 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 2135 execute(s); 2059 int nvar = nvars(basering); 2136 2060 // Declaracion de variables 2137 2061 int i,j,k,cont1,cont2,sizI,marcavar,max; … … 2139 2063 list nuevo; 2140 2064 ideal J; 2141 ideal I = fetch(R,I); 2142 sizI = size(I); 2065 sizI = ncols(I); 2143 2066 // Comprobamos que entre los generadores minimales aparece una 2144 2067 // potencia de cada 2145 2068 cont2 = 0; 2146 2069 for (i = 1 ; i <= sizI ; i++) 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2070 { 2071 v = leadexp(I[i]); 2072 marcavar = 0; 2073 cont1 = 0; 2074 for (j = 1 ; j <= nvar ; j++) 2075 { 2076 if (v[j] <> 0) 2077 { 2078 cont1 ++; 2079 marcavar = j; 2080 } 2081 } 2082 // Si cont1=1 hemos encontrado un generador de los que nos 2083 // interesa."variablesin" guarda el indice de las que estan. 2084 if (cont1 == 1) 2085 { 2086 cont2 ++; 2087 variablesin[cont2] = marcavar; 2088 } 2089 } 2167 2090 // Notar que como el sistema de generadores es minimal no se 2168 2091 // va a repetir la potencia de la misma variable. Por tanto basta 2169 2092 // comprobar si cont2 es o no nvar. 2170 2093 if (cont2 == nvar) 2171 { 2172 setring R; 2173 list output; 2174 output[1] = 1; 2175 return(output); 2176 } 2094 { 2095 list output; 2096 output[1] = 1; 2097 return(output); 2098 } 2177 2099 else 2178 { 2179 J = I; 2180 // Buscamos las que no estan 2181 if (cont2 == 0) 2182 { 2183 for (i = 1 ; i <= nvar ; i ++) 2184 { 2185 max = maximoExp(I,i); 2186 cambio[i] = max + 1; 2187 J = J,x(i)^(max + 1); 2188 } 2189 } 2190 else 2191 { 2192 for (i = 1 ; i <= nvar ; i++) 2193 { 2194 for (j = 1 ; j <= cont2 ; j ++) 2195 { 2196 if (i == variablesin[j]) 2197 { 2198 cambio[i] = 0; 2199 break; 2200 } 2201 } 2202 if (j == cont2 + 1) 2203 { 2204 max = maximoExp(I,i); 2205 cambio[i] = max + 1; 2206 J = J,x(i)^(max + 1); 2207 } 2208 } 2209 } 2210 list output; 2211 output[1] = 0; 2212 output[2] = J; 2213 output[3] = cambio; 2214 setring R; 2215 list output = fetch (R1,output); 2216 kill R1; 2217 return(output); 2218 } 2100 { 2101 J = I; 2102 // Buscamos las que no estan 2103 if (cont2 == 0) 2104 { 2105 for (i = 1 ; i <= nvar ; i ++) 2106 { 2107 max = maximoExp(I,i); 2108 cambio[i] = max + 1; 2109 J = J,var(i)^(max + 1); 2110 } 2111 } 2112 else 2113 { 2114 for (i = 1 ; i <= nvar ; i++) 2115 { 2116 for (j = 1 ; j <= cont2 ; j ++) 2117 { 2118 if (i == variablesin[j]) 2119 { 2120 cambio[i] = 0; 2121 break; 2122 } 2123 } 2124 if (j == cont2 + 1) 2125 { 2126 max = maximoExp(I,i); 2127 cambio[i] = max + 1; 2128 J = J,var(i)^(max + 1); 2129 } 2130 } 2131 } 2132 list output; 2133 output[1] = 0; 2134 output[2] = J; 2135 output[3] = cambio; 2136 return(output); 2137 } 2219 2138 } 2220 2139 ////////////////////////////////////////////////////////////////////// … … 2227 2146 { 2228 2147 // New ring 2229 def R = basering; 2230 int nvar = nvars(R); 2231 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 2232 execute(s); 2233 ideal I = fetch(R,I); 2148 int nvar = nvars(basering); 2234 2149 // VARIABLES 2235 2150 int i,j,k; 2236 2151 // Cargamos la matriz con los exponentes 2237 int sizI = size(I);2152 int sizI = ncols(I); 2238 2153 intmat EXP[sizI][nvar]; 2239 2154 for (i = 1 ; i <= sizI ; i ++) 2240 2241 2242 2243 2155 { 2156 // Ordenamos el vector de exponentes oportuno 2157 EXP[i,1..nvar] = leadexp(I[i]); 2158 } 2244 2159 2245 2160 // Ahora tenemos que ordenarla segun la variable que este en conficto. … … 2249 2164 int count = 0; 2250 2165 for (i = 1 ; i <= nvar ; i ++) 2251 { 2252 // Buscamos conflicto en la variable x(i), para ello tengo que ordenar 2253 // la columna i de EXP 2254 vari = EXP[1..sizI,i]; 2255 aux = sort(vari); 2256 vari = aux[1]; 2257 change = aux[2]; 2258 for (j = 1 ; j <= sizI - 1 ; j ++) 2259 { 2260 if (vari[j] > 0) 2261 { 2262 while (NEWEXP[change[j + count] , i] >= vari[j + 1 + count]) 2263 { 2264 NEWEXP[change[j + 1 + count] , i] = NEWEXP[change[j + count] , i] + 1; 2265 count ++; 2266 if (j + 1 + count > sizI) 2267 { 2268 break; 2269 } 2270 } 2271 } 2272 j = j + count; 2273 count = 0; 2274 } 2275 } 2276 setring R; 2277 I = fetch(R1,I); 2166 { 2167 // Buscamos conflicto en la variable x(i), para ello tengo que ordenar 2168 // la columna i de EXP 2169 vari = EXP[1..sizI,i]; 2170 aux = sort(vari); 2171 vari = aux[1]; 2172 change = aux[2]; 2173 for (j = 1 ; j <= sizI - 1 ; j ++) 2174 { 2175 if (vari[j] > 0) 2176 { 2177 while (NEWEXP[change[j + count] , i] >= vari[j + 1 + count]) 2178 { 2179 NEWEXP[change[j + 1 + count] , i] = NEWEXP[change[j + count] , i] + 1; 2180 count ++; 2181 if (j + 1 + count > sizI) 2182 { 2183 break; 2184 } 2185 } 2186 } 2187 j = j + count; 2188 count = 0; 2189 } 2190 } 2278 2191 // Devolvemos tambien la matriz, pues aqui tengo la biyeccion entre los exponentes 2279 2192 if (EXP == NEWEXP) 2280 2281 2282 2193 { 2194 return (1,I); 2195 } 2283 2196 else 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2197 { 2198 // Hallamos el ideal con los nuevos exponentes 2199 intvec expI; 2200 for (i = 1 ; i <= sizI ; i ++) 2201 { 2202 expI = NEWEXP[i,1..nvar]; 2203 I[i] = monomial(expI); 2204 } 2205 return(0,I,EXP,NEWEXP); 2206 } 2294 2207 } 2295 2208 ////////////////////////////////////////////////////////////////////// … … 2301 2214 static proc nonGeneric (EXP,NEWEXP,Faces,sizI) 2302 2215 { 2303 def R = basering; 2304 int nvar = nvars(R); 2216 int nvar = nvars(basering); 2305 2217 int sizFaces = size(Faces); 2306 2218 // Variables … … 2311 2223 newFaces = Faces; 2312 2224 for (i = 1 ; i <= nvar ; i ++) 2313 { 2314 // comparamos las matrices de exponentes por columnas 2315 exp = EXP[1..sizI,i]; 2316 newexp = NEWEXP[1..sizI,i]; 2317 if (exp <> newexp) 2318 { 2319 for (j = 1 ; j <= sizI ; j ++) 2225 { 2226 // comparamos las matrices de exponentes por columnas 2227 exp = EXP[1..sizI,i]; 2228 newexp = NEWEXP[1..sizI,i]; 2229 if (exp <> newexp) 2230 { 2231 for (j = 1 ; j <= sizI ; j ++) 2232 { 2233 if (exp[j] <> newexp[j]) 2234 { 2235 for (k = 1 ; k <= sizFaces ; k ++) 2236 { 2237 if (Faces[k][i] == newexp[j]) 2320 2238 { 2321 if (exp[j] <> newexp[j]) 2322 { 2323 for (k = 1 ; k <= sizFaces ; k ++) 2324 { 2325 if (Faces[k][i] == newexp[j]) 2326 { 2327 newFaces[k][i] = exp[j]; 2328 } 2329 } 2330 } 2239 newFaces[k][i] = exp[j]; 2331 2240 } 2332 } 2333 } 2241 } 2242 } 2243 } 2244 } 2245 } 2334 2246 return (newFaces); 2335 2247 } … … 2344 2256 // Cambiamos de anillo 2345 2257 // Queremos usar x(1)..x(n) como variables. 2346 def R = basering; 2347 int nvar = nvars(R); 2348 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 2349 execute(s); 2258 int nvar = nvars(basering); 2350 2259 // Declaracion de variables. 2351 2260 int i,sizJ,j,max,aux,sizK,l, elim; 2352 2261 intvec v; 2353 2262 list face; 2354 // Traemos al nuevo anillo el ideal de entrada.2355 ideal I = fetch(R,I);2356 2263 // Hacemos una copia de I pues ahora modificaremos el sistema 2357 2264 // de generadores. 2358 2265 ideal J = I; 2359 sizJ = size(J);2266 sizJ = ncols(J); 2360 2267 // Para cada variable buscamos el maximo exponente, teniendo en 2361 2268 // cuenta que un mismo generador no puede dar dos exponentes. … … 2363 2270 intvec expIni; 2364 2271 for (i = 1 ; i <= nvar ; i++) 2365 { 2366 max = 0; 2272 { 2273 max = 0; 2274 for (j = 1 ; j <= sizJ ; j++) 2275 { 2276 aux = leadexp(J[j])[i]; 2277 if (aux > max) 2278 { 2279 max = aux; 2280 elim = j; 2281 } 2282 } 2283 // Guardamos el exponente 2284 expIni[i] = max; 2285 // Ahora tenemos el maximo de la variable x(i), por lo que 2286 // eliminamos el generador en el que la encontramos. 2287 // Si queda un generador no hay nada que hacer 2288 if (sizJ <> 1) 2289 { 2290 if (elim <> 1 & elim <> sizJ) 2291 { 2292 J = J[1..elim-1],J[elim+1..sizJ]; 2293 } 2294 else 2295 { 2296 if (elim == 1) 2297 { 2298 J = J[2..sizJ]; 2299 } 2300 else 2301 { 2302 J = J[1..sizJ-1]; 2303 } 2304 } 2305 sizJ = ncols(J); 2306 // Eliminamos la variable x(i) en todos los generadores. 2367 2307 for (j = 1 ; j <= sizJ ; j++) 2368 { 2369 aux = leadexp(J[j])[i]; 2370 if (aux > max) 2371 { 2372 max = aux; 2373 elim = j; 2374 } 2375 } 2376 // Guardamos el exponente 2377 expIni[i] = max; 2378 // Ahora tenemos el maximo de la variable x(i), por lo que 2379 // eliminamos el generador en el que la encontramos. 2380 // Si queda un generador no hay nada que hacer 2381 if (sizJ <> 1) 2382 { 2383 if (elim <> 1 & elim <> sizJ) 2384 { 2385 J = J[1..elim-1],J[elim+1..sizJ]; 2386 } 2387 else 2388 { 2389 if (elim == 1) 2390 { 2391 J = J[2..sizJ]; 2392 } 2393 else 2394 { 2395 J = J[1..sizJ-1]; 2396 } 2397 } 2398 sizJ = size(J); 2399 // Eliminamos la variable x(i) en todos los generadores. 2400 for (j = 1 ; j <= sizJ ; j++) 2401 { 2402 v = leadexp(J[j]); 2403 if (v [i] <> 0) 2404 { 2405 v[i] = 0; 2406 J[j] = monomial(v); 2407 } 2408 } 2409 // Hallamos el sistema minimal de generadores que 2410 // corresponde al ideal que nos ha quedado. 2411 J = minbase(J); 2412 sizJ = size(J); 2413 } 2414 } 2308 { 2309 v = leadexp(J[j]); 2310 if (v [i] <> 0) 2311 { 2312 v[i] = 0; 2313 J[j] = monomial(v); 2314 } 2315 } 2316 // Hallamos el sistema minimal de generadores que 2317 // corresponde al ideal que nos ha quedado. 2318 J = minbase(J); 2319 sizJ = ncols(J); 2320 } 2321 } 2415 2322 // En expIni tenemos los exponentes de los monomios que dan la cara 2416 2323 // inicial, ahora hay que buscar en el ideal original a que 2417 2324 // generador se corresponde (el ideal es generico) 2418 int sizI = size(I);2325 int sizI = ncols(I); 2419 2326 for (i = 1 ; i <= nvar ; i ++) 2420 { 2421 for (j = 1 ; j <= sizI ; j ++) 2422 { 2423 if (expIni[i] == leadexp(I[j])[i]) 2424 { 2425 face = insert(face, I[j]); 2426 // Si lo encontramos buscamos el siguiente 2427 break; 2428 } 2429 } 2430 } 2431 setring R; 2432 list face = fetch (R1,face); 2433 kill R1; 2327 { 2328 for (j = 1 ; j <= sizI ; j ++) 2329 { 2330 if (expIni[i] == leadexp(I[j])[i]) 2331 { 2332 face = insert(face, I[j]); 2333 // Si lo encontramos buscamos el siguiente 2334 break; 2335 } 2336 } 2337 } 2434 2338 return (face); 2435 2339 } … … 2443 2347 // Cambiamos de anillo 2444 2348 // Queremos usar x(1)..x(n) como variables. 2445 def R = basering; 2446 int nvar = nvars(R); 2447 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 2448 execute(s); 2349 int nvar = nvars(basering); 2449 2350 // Declaracion de variables. 2450 2351 int i,j,cambio,sizI,k,min,m,generador,max; … … 2452 2353 poly LCM,newLCM; 2453 2354 intvec v,newv,expgen; 2454 // Traemos al nuevo anillo las dos entradas. 2455 list l1 = fetch(R,l1); 2456 ideal I = fetch(R,I); 2457 sizI = size(I); 2355 sizI = ncols(I); 2458 2356 // Hallamos el lcm de los elementos, e. d., la faceta del 2459 2357 // complejo para luego comparar con los nuevos 2460 2358 LCM = 1; 2461 2359 for (i = 1 ; i <= nvar ; i++) 2462 2463 2464 2360 { 2361 LCM = lcmMon(LCM,l1[i]); 2362 } 2465 2363 v = leadexp(LCM); 2466 2364 // Calculo los exponentes de los monomios de I 2467 2365 for (i = 1 ; i <= sizI ; i++) 2468 2469 2470 2366 { 2367 expI[i] = leadexp(I[i]); 2368 } 2471 2369 // Hay que quitar cada elemento de la lista y comprobar si hay o no 2472 2370 // cara adyacente al simplice que queda, y en caso de haberla, la 2473 2371 // calculamos. 2474 2372 for (i = 1 ; i <= nvar ; i++) 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2373 { 2374 newl1 = delete(l1,i); 2375 // Hallamos el lcm de los elementos que hay en la nueva lista. 2376 newLCM = 1; 2377 for (j = 1 ; j <= nvar - 1 ; j++) 2378 { 2379 newLCM = lcmMon(newLCM,newl1[j]); 2380 } 2381 // Ahora hay que detectar si alguna variable ha desaparecido 2382 // en este LCM. 2383 newv = leadexp(newLCM); 2384 for (j = 1 ; j <= nvar ; j++) 2385 { 2386 if (newv[j] == 0) 2387 { 2388 l2[i] = 0; 2389 break; 2390 } 2391 } 2392 if (j == nvar+1) 2393 { 2496 2394 // Si no ha habido ceros, queremos hallar la cara adyacente, 2497 2395 // es decir, buscar un generador que introducido en l1 de una … … 2499 2397 // Comparamos los lcm entre s?, para comprobar en que variable 2500 2398 // contribu?a el monomio que hemos eliminado. 2501 for (j = 1 ; j <= nvar ; j++) 2399 for (j = 1 ; j <= nvar ; j++) 2400 { 2401 if (v[j] <> newv[j]) 2402 { 2403 cambio = j; 2404 // Una vez encontrado no hay mas 2405 break; 2406 } 2407 } 2408 // Hallamos los exponentes de los monomios que quedan 2409 // para ver cual da el exponente en "newv" 2410 for (j = 1 ; j <= nvar - 1 ; j++) 2411 { 2412 w[j] = leadexp(newl1[j]); 2413 } 2414 for (j = 1 ; j <= nvar ; j++) 2415 { 2416 for (k = 1 ; k <= nvar - 1 ; k++) 2417 { 2418 if (newv[cambio] == w[k][cambio]) 2419 { 2420 cambio = k; 2421 break; 2422 } 2423 } 2424 // Si no termino el for con k es que hemos encontrado ya 2425 // los que son iguales. 2426 if (k <> nvar) 2427 { 2428 break; 2429 } 2430 } 2431 2432 // Donde contribuye antes, e.d., en "v" 2433 for (j = 1 ; j <= nvar ; j++) 2434 { 2435 if (w[cambio][j] == v[j]) 2436 { 2437 cambio = j; 2438 break; 2439 } 2440 } 2441 // Ahora ya buscamos entre los generadores el nuevo monomio. 2442 // Ponemos de tope para encontrar el minimo el maximo de 2443 // las variables en el ideal 2444 max = 0; 2445 for (m = 1 ; m <= sizI ; m ++) 2446 { 2447 if (expI[m][cambio] > max) 2448 { 2449 max = expI[m][cambio]; 2450 } 2451 } 2452 min = max; 2453 for (j = 1 ; j <= sizI ; j++) 2454 { 2455 for (k = 1 ; k <= nvar ; k ++) 2456 { 2457 if (I[j] == l1[k]) 2458 { 2459 break; 2460 } 2461 } 2462 // El generador no esta en la lista, es de los que hay que 2463 // comprobar 2464 if (k == nvar +1) 2465 { 2466 for (m = 1 ; m <= nvar ; m++) 2467 { 2468 if (m <> cambio) 2502 2469 { 2503 if (v[j] <> newv[j]) 2504 { 2505 cambio = j; 2506 // Una vez encontrado no hay mas 2507 break; 2508 } 2470 if (expI[j][m] > newv[m]) 2471 { 2472 break; 2473 } 2509 2474 } 2510 // Hallamos los exponentes de los monomios que quedan 2511 // para ver cual da el exponente en "newv" 2512 for (j = 1 ; j <= nvar - 1 ; j++) 2475 else 2513 2476 { 2514 w[j] = leadexp(newl1[j]); 2477 if (expI[j][m] <= newv[m]) 2478 { 2479 break; 2480 } 2515 2481 } 2516 for (j = 1 ; j <= nvar ; j++) 2482 } 2483 // Si termina el bucle cumple las condiciones 2484 // oportunas, solo hay que comparar con el 2485 // otro que tengamos. 2486 if (m == nvar + 1) 2487 { 2488 if (expI[j][cambio] <= min) 2517 2489 { 2518 for (k = 1 ; k <= nvar - 1 ; k++) 2519 { 2520 if (newv[cambio] == w[k][cambio]) 2521 { 2522 cambio = k; 2523 break; 2524 } 2525 } 2526 // Si no termino el for con k es que hemos encontrado ya 2527 // los que son iguales. 2528 if (k <> nvar) 2529 { 2530 break; 2531 } 2490 min = expI[j][cambio]; 2491 generador = j; 2532 2492 } 2533 2534 // Donde contribuye antes, e.d., en "v" 2535 for (j = 1 ; j <= nvar ; j++) 2536 { 2537 if (w[cambio][j] == v[j]) 2538 { 2539 cambio = j; 2540 break; 2541 } 2542 } 2543 // Ahora ya buscamos entre los generadores el nuevo monomio. 2544 // Ponemos de tope para encontrar el minimo el maximo de 2545 // las variables en el ideal 2546 max = 0; 2547 for (m = 1 ; m <= sizI ; m ++) 2548 { 2549 if (expI[m][cambio] > max) 2550 { 2551 max = expI[m][cambio]; 2552 } 2553 } 2554 min = max; 2555 for (j = 1 ; j <= sizI ; j++) 2556 { 2557 for (k = 1 ; k <= nvar ; k ++) 2558 { 2559 if (I[j] == l1[k]) 2560 { 2561 break; 2562 } 2563 } 2564 // El generador no esta en la lista, es de los que hay que 2565 // comprobar 2566 if (k == nvar +1) 2567 { 2568 for (m = 1 ; m <= nvar ; m++) 2569 { 2570 if (m <> cambio) 2571 { 2572 if (expI[j][m] > newv[m]) 2573 { 2574 break; 2575 } 2576 } 2577 else 2578 { 2579 if (expI[j][m] <= newv[m]) 2580 { 2581 break; 2582 } 2583 } 2584 } 2585 // Si termina el bucle cumple las condiciones 2586 // oportunas, solo hay que comparar con el 2587 // otro que tengamos. 2588 if (m == nvar + 1) 2589 { 2590 if (expI[j][cambio] <= min) 2591 { 2592 min = expI[j][cambio]; 2593 generador = j; 2594 } 2595 } 2596 } 2597 } 2598 // En la lista ponemos en el lugar "i" el generador que 2599 // hay que introducir cuando eliminamos el generador 2600 // "i" de la lista de entrada. 2601 l2[i] = I[generador]; 2602 } 2603 } 2604 setring R; 2605 list l2 = fetch(R1,l2); 2606 kill R1; 2493 } 2494 } 2495 } 2496 // En la lista ponemos en el lugar "i" el generador que 2497 // hay que introducir cuando eliminamos el generador 2498 // "i" de la lista de entrada. 2499 l2[i] = I[generador]; 2500 } 2501 } 2607 2502 return(l2); 2608 2503 } … … 2616 2511 // Cambiamos de anillo 2617 2512 // Queremos usar x(1)..x(n) como variables. 2618 def R = basering; 2619 int nvar = nvars(R); 2513 int nvar = nvars(basering); 2620 2514 // Sabemos que dp siempre es mejor para trabajar, auqque luego para 2621 2515 // comparar I y genI vamos a cambiarlo al lexicografico. 2622 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";2623 execute(s);2624 2516 // Variables 2625 2517 int i,j,k,sizl1,sizl,cont1,cont2; … … 2629 2521 intvec v,w,betas; 2630 2522 ideal J,genI,artgenI; 2631 ideal I = fetch(R,I);2632 2523 // Comprobamos si el ideal es generico y artiniano, y, en caso de 2633 2524 // no serlo, obtenemos una modificacion de este ideal que si … … 2635 2526 list genericlist = generic(I); 2636 2527 if (genericlist[1] == 0) 2637 2638 2639 2528 { 2529 genI = genericlist[2]; 2530 } 2640 2531 else 2641 2642 2643 2532 { 2533 genI = I; 2534 } 2644 2535 list artinianization = artinian (genI); 2645 2536 if (artinianization[1] == 0) 2646 2647 2648 2537 { 2538 artgenI = artinianization[2]; 2539 } 2649 2540 else 2650 2651 2652 2541 { 2542 artgenI = genI; 2543 } 2653 2544 // Una vez tenemos el ideal artiniano y generico, podemos hallar 2654 2545 // el complejo de Scarf asociado al ideal modificado … … 2663 2554 LCM = 1; 2664 2555 for (i = 1 ; i <= nvar ; i++) 2665 2666 2667 2668 2556 { 2557 mon = initial[i]; 2558 LCM = lcmMon(LCM,mon); 2559 } 2669 2560 v = leadexp(LCM); 2670 2561 // Guardamos la primera faceta … … 2677 2568 // Ahora hayamos las posibles caras maximales adyacentes 2678 2569 while (sizl <> 0) 2679 { 2680 // Hallamos la lista de monomios que hay que introducir 2681 // cuando eliminamos cada monomio. 2682 auxl = adyacency(l[1],artgenI); 2683 cont1 = 1; 2684 cont2 = 0; 2685 l1 = 0; 2570 { 2571 // Hallamos la lista de monomios que hay que introducir 2572 // cuando eliminamos cada monomio. 2573 auxl = adyacency(l[1],artgenI); 2574 cont1 = 1; 2575 cont2 = 0; 2576 l1 = 0; 2577 for (j = 1 ; j <= nvar ; j++) 2578 { 2579 if (auxl[j] <> 0) 2580 { 2581 l2 = delete(l[1],j); 2582 l1[cont1] = insert(l2,auxl[j],cont1 + cont2 - 1); 2583 cont1 ++; 2584 } 2585 else 2586 { 2587 cont2 ++; 2588 } 2589 } 2590 // Hallamos los nuevos LCM 2591 sizl1 = size(l1); 2592 for (i = 1 ; i <= sizl1 ; i++) 2593 { 2594 newLCM[i] = 1; 2686 2595 for (j = 1 ; j <= nvar ; j++) 2687 2596 { 2688 if (auxl[j] <> 0) 2689 { 2690 l2 = delete(l[1],j); 2691 l1[cont1] = insert(l2,auxl[j],cont1 + cont2 - 1); 2692 cont1 ++; 2693 } 2694 else 2695 { 2696 cont2 ++; 2697 } 2698 } 2699 // Hallamos los nuevos LCM 2700 sizl1 = size(l1); 2701 for (i = 1 ; i <= sizl1 ; i++) 2702 { 2703 newLCM[i] = 1; 2704 for (j = 1 ; j <= nvar ; j++) 2705 { 2706 newLCM[i] = lcmMon(newLCM[i],l1[i][j]); 2707 } 2708 expl1[i] = leadexp(newLCM[i]); 2709 } 2710 // Hallamos los LCM de las nuevas caras y eliminamos las que 2711 // ya esten en la lista Faces 2712 cont1 = 0; 2713 cont2 = 0; 2714 for (i = 1 ; i <= sizl1 ; i++) 2715 { 2716 for (j = 1 ; j <= sizfaces ; j++) 2717 { 2718 v = expl1[i]; 2719 w = Faces[j]; 2720 if (v == w) 2721 { 2722 // Si ya esta el LCM en la lista, no queremos 2723 // seguir buscando 2724 break; 2725 } 2726 } 2727 // Si no ha salido del bucle en "j" es que este LCM 2728 // no esta en la lista de las caras, la introducimos 2729 if (j == sizfaces + 1) 2730 { 2731 Faces = insert(Faces,expl1[i],sizfaces + cont1); 2732 l = insert(l,l1[i]); 2733 cont1 ++; 2734 } 2735 } 2736 l = delete(l,cont1 + 1); 2737 sizl = size(l); 2738 sizfaces = size(Faces); 2739 } 2597 newLCM[i] = lcmMon(newLCM[i],l1[i][j]); 2598 } 2599 expl1[i] = leadexp(newLCM[i]); 2600 } 2601 // Hallamos los LCM de las nuevas caras y eliminamos las que 2602 // ya esten en la lista Faces 2603 cont1 = 0; 2604 cont2 = 0; 2605 for (i = 1 ; i <= sizl1 ; i++) 2606 { 2607 for (j = 1 ; j <= sizfaces ; j++) 2608 { 2609 v = expl1[i]; 2610 w = Faces[j]; 2611 if (v == w) 2612 { 2613 // Si ya esta el LCM en la lista, no queremos 2614 // seguir buscando 2615 break; 2616 } 2617 } 2618 // Si no ha salido del bucle en "j" es que este LCM 2619 // no esta en la lista de las caras, la introducimos 2620 if (j == sizfaces + 1) 2621 { 2622 Faces = insert(Faces,expl1[i],sizfaces + cont1); 2623 l = insert(l,l1[i]); 2624 cont1 ++; 2625 } 2626 } 2627 l = delete(l,cont1 + 1); 2628 sizl = size(l); 2629 sizfaces = size(Faces); 2630 } 2740 2631 // En "Faces" ya tengo los exponentes que luego seran los exponentes 2741 2632 // de los ideales que forman la descomposicion. … … 2743 2634 intvec elimin = artinianization[3]; 2744 2635 if (artinianization[1] == 0) 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2636 { 2637 // En elimina tenemos las variables que hemos introducido 2638 // y cual es la potencia 2639 // Solo miro las que tengan cambio 2640 for (i = 1 ; i <= nvar ; i ++) 2641 { 2642 if (elimin[i] <> 0) 2643 { 2644 for (j = 1 ; j <= sizfaces ; j ++) 2645 { 2646 if (Faces[j][i] == elimin[i]) 2647 { 2648 Faces[j][i] = 0; 2649 } 2650 } 2651 } 2652 } 2653 } 2763 2654 // Generico 2764 2655 sizI = size(I); 2765 2656 if (genericlist[1] == 0) 2766 2767 2768 2657 { 2658 Faces = nonGeneric(genericlist[3],genericlist[4],Faces,sizI); 2659 } 2769 2660 // Ya tenemos en Faces los exponentes de las componentes 2770 2661 // ahora solo hay que obtener los ideales. 2771 for (i = 1 ; i <= sizfaces ; i ++) 2772 { 2773 J = 0; 2774 for (j = 1 ; j <= nvar ; j ++) 2775 { 2776 if (Faces[i][j] <> 0) 2777 { 2778 J = J,x(j)^(Faces[i][j]); 2779 } 2780 } 2781 J = simplify(J,2); 2782 Faces[i] = J; 2783 } 2784 // Esta es la parte LENTA computacionalmente si el ideal de partida 2785 // no es generico 2786 if (genericlist[1] == 0) 2787 { 2788 Faces = irredundant(Faces); 2789 } 2790 setring R; 2791 list components = fetch(R1,Faces); 2792 kill R1; 2793 return(components); 2662 for (i = 1 ; i <= sizfaces ; i ++) 2663 { 2664 J = 0; 2665 for (j = 1 ; j <= nvar ; j ++) 2666 { 2667 if (Faces[i][j] <> 0) 2668 { 2669 J = J,var(j)^(Faces[i][j]); 2670 } 2671 } 2672 J = simplify(J,2); 2673 Faces[i] = J; 2674 } 2675 // Esta es la parte LENTA computacionalmente si el ideal de partida 2676 // no es generico 2677 if (genericlist[1] == 0) 2678 { 2679 Faces = irredundant(Faces); 2680 } 2681 return(Faces); 2794 2682 } 2795 2683 ////////////////////////////////////////////////////////////////////// … … 2821 2709 { 2822 2710 // Cambiamos de anillo 2823 def R = basering; 2824 int nvar = nvars(R); 2825 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 2826 execute(s); 2711 int nvar = nvars(basering); 2827 2712 // Variables 2828 2713 int sizF,i,j; … … 2830 2715 list listphi; 2831 2716 intvec exp,newexp; 2832 list F = fetch(R,F);2833 2717 // F es una lista de pares, que indica una x(i) etiqueta de una 2834 2718 // cara del ideal. Suponemos que F tiene ordenados sus elementos … … 2836 2720 sizF = size(F); 2837 2721 for (i = 1 ; i <= sizF ; i ++) 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2722 { 2723 f = F[i]; 2724 exp = leadexp(f); 2725 for (j = 1 ; j <= nvar ; j ++) 2726 { 2727 if (j <> i) 2728 { 2729 exp[j] = exp[j] + 1; 2730 } 2731 } 2732 listphi[i] = monomial(exp); 2733 } 2850 2734 // Ya tenemos la lista de los monomios a los que 2851 2735 // luego haremos el "lcm" 2852 setring R;2853 list listphi = fetch (R1,listphi);2854 kill R1;2855 2736 return (listphi); 2856 2737 } … … 2860 2741 { 2861 2742 // Cambiamos de anillo 2862 def R = basering; 2863 int nvar = nvars(R); 2864 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 2865 execute(s); 2743 int nvar = nvars(basering); 2866 2744 int i,sizI; 2867 2745 intvec exp; 2868 poly f = fetch (R,f);2869 2746 exp = leadexp(f); 2870 for (i = 1 ; i <= nvar ; i ++)2871 2872 2873 2874 2875 2876 2747 for (i = nvar ; i > 0 ; i --) 2748 { 2749 if (exp[i] <> 0) 2750 { 2751 exp[i] = exp[i] - 1; 2752 } 2753 } 2877 2754 f = monomial(exp); 2878 setring R;2879 f = fetch (R1,f);2880 kill R1;2881 2755 return (f); 2882 2756 } … … 2885 2759 static proc conditionComplex (intvec posActual,ideal I,ideal S) 2886 2760 { 2887 def R = basering; 2888 int nvar = nvars(R); 2761 int nvar = nvars(basering); 2889 2762 // VARIABLES 2890 2763 int i,nuevo; … … 2893 2766 // ultimo dentro de posActual que es distinto de 0. 2894 2767 for (i = 1 ; i <= nvar ; i ++) 2895 2896 2897 2898 break;2899 2900 2768 { 2769 if (posActual[i] == 0) 2770 { 2771 break; 2772 } 2773 } 2901 2774 nuevo = i - 1; 2902 2775 // No se pueden repetir generadores, se mira que el ultimo que se ha 2903 // ha introducido no sea de los que ya tenemos2776 // ha introducido no sea de los que ya tenemos 2904 2777 for (i = 1 ; i <= nuevo - 1 ; i ++) 2905 2906 2907 2908 2909 2910 2778 { 2779 if (posActual[i] == posActual[nuevo]) 2780 { 2781 return (0); 2782 } 2783 } 2911 2784 // Vemos si la variable oportuna divide al generador 2912 2785 if (leadexp(I[i]) == 0) 2913 2914 2915 2786 { 2787 return (0); 2788 } 2916 2789 // Caso de que el LCM sea multiplo de los que ya tenemos 2917 2790 poly LCM = 1; 2918 2791 for (i = 1 ; i <= nuevo ; i ++) 2919 2920 2921 2792 { 2793 F = insert (F,I[posActual[i]],size(F)); 2794 } 2922 2795 list phiF = phi(F); 2923 2796 for (i = 1 ; i <= nuevo ; i ++) 2924 2925 2926 2797 { 2798 LCM = lcmMon(phiF[i],LCM); 2799 } 2927 2800 // Comprobamos si ya tenemos algun divisor del actual 2928 2801 if (membershipMon(LCM,S) == 1) 2929 2930 2931 2802 { 2803 return (0); 2804 } 2932 2805 // Ahora vemos si la lista esta en el complejo simplicial 2933 2806 if (membershipMon(LCM,I) == 1) 2934 2935 2936 2937 2938 2939 2807 { 2808 if (membershipMon(pi(LCM),I) == 0) 2809 { 2810 return (1,LCM); 2811 } 2812 } 2940 2813 return (0); 2941 2814 } … … 2944 2817 static proc findFaces (ideal I) 2945 2818 { 2946 def R = basering; 2947 int nvar = nvars(R); 2819 int nvar = nvars(basering); 2948 2820 // Variables 2949 2821 int i; … … 2956 2828 2957 2829 int variable = 1; 2958 int sizI = size(I);2830 int sizI = ncols(I); 2959 2831 while (1) 2960 { 2961 while (posActual[variable] == sizI) 2962 { 2963 posActual[variable] = 0; 2964 variable --; 2965 if (variable == 0) 2966 { 2967 break; 2968 } 2969 } 2970 // Comprobamos si hemos recorrido todas las posibilidades. Si 2971 // es as?, terminamos el while 2832 { 2833 while (posActual[variable] == sizI) 2834 { 2835 posActual[variable] = 0; 2836 variable --; 2972 2837 if (variable == 0) 2973 { 2974 break; 2975 } 2976 posActual[variable] = posActual[variable] + 1; 2977 // Comprobamos las condiciones para saber si los generadores que 2978 // tenemos est?n o no en el complejo. 2979 condiciones = conditionComplex (posActual,I,S); 2838 { 2839 break; 2840 } 2841 } 2842 // Comprobamos si hemos recorrido todas las posibilidades. Si 2843 // es as?, terminamos el while 2844 if (variable == 0) 2845 { 2846 break; 2847 } 2848 posActual[variable] = posActual[variable] + 1; 2849 // Comprobamos las condiciones para saber si los generadores que 2850 // tenemos est?n o no en el complejo. 2851 condiciones = conditionComplex (posActual,I,S); 2980 2852 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2853 if (condiciones[1] == 1 ) 2854 { 2855 if (posActual[nvar] <> 0) 2856 { 2857 S = S,condiciones[2]; 2858 F = insert (F,condiciones[2]); 2859 } 2860 if (variable < nvar) 2861 { 2862 variable ++; 2863 } 2864 } 2865 } 2994 2866 return (F); 2995 2867 } … … 3002 2874 static proc labelAlgorithm(ideal I) 3003 2875 { 3004 def R = basering; 3005 int nvar = nvars(R); 3006 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 3007 execute(s); 3008 ideal I = fetch(R,I); 2876 int nvar = nvars(basering); 3009 2877 3010 2878 // Variables … … 3016 2884 list artiniano = artinian (I); 3017 2885 if (artiniano[1] == 0) 3018 3019 3020 3021 2886 { 2887 artI = artiniano[2]; 2888 intvec elimina = artiniano[3]; 2889 } 3022 2890 else 3023 3024 3025 2891 { 2892 artI = I; 2893 } 3026 2894 // Llamamos a findFaces para que encuentre las caras maximales del 3027 2895 // complejo asociado al ideal … … 3031 2899 poly f; 3032 2900 for (i = 1 ; i <= sizComponents ; i ++) 3033 3034 3035 3036 2901 { 2902 f = components[i]; 2903 expComponents[i] = leadexp(f); 2904 } 3037 2905 // Deshacemos la artinianizacion 3038 2906 if (artiniano[1] == 0) 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 2907 { 2908 // En elimina tenemos las variables que hemos introducido 2909 // y cual es la potencia 2910 // Solo miro las que tengan cambio 2911 for (i = 1 ; i <= nvar ; i ++) 2912 { 2913 if (elimina[i] <> 0) 2914 { 2915 for (j = 1 ; j <= sizComponents ; j ++) 2916 { 2917 if (expComponents[j][i] == elimina[i]) 2918 { 2919 expComponents[j][i] = 0; 2920 } 2921 } 2922 } 2923 } 2924 } 3057 2925 // En exp(i) tengo los exponentes de cada variable de las que aparecen 3058 2926 // en cada ideal. … … 3060 2928 list facets; 3061 2929 for (i = 1 ; i <= sizComponents ; i ++) 3062 { 3063 J = 0; 3064 for (j = 1 ; j <= nvar ; j ++) 3065 { 3066 if (expComponents[i][j] <> 0) 3067 { 3068 J = J,x(j)^expComponents[i][j]; 3069 } 3070 } 3071 J = simplify(J,2); 3072 facets[i] = J; 3073 } 3074 setring R; 3075 list facets = fetch (R1,facets); 3076 kill R1; 2930 { 2931 J = 0; 2932 for (j = 1 ; j <= nvar ; j ++) 2933 { 2934 if (expComponents[i][j] <> 0) 2935 { 2936 J = J,var(j)^expComponents[i][j]; 2937 } 2938 } 2939 J = simplify(J,2); 2940 facets[i] = J; 2941 } 3077 2942 return (facets); 3078 2943 } … … 3100 2965 static proc divide (intvec v, intvec w, int k) 3101 2966 { 3102 def R = basering; 3103 int nvar = nvars(R); 2967 int nvar = nvars(basering); 3104 2968 // Variables 3105 2969 int i; 3106 for (i = 1 ; i <= nvar ; i ++)3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 2970 for (i = nvar ; i > 0 ; i --) 2971 { 2972 if (i == k) 2973 { 2974 if (v[i] <> w[i]) 2975 { 2976 return (0); 2977 } 2978 } 2979 else 2980 { 2981 if (v[i] >= w[i]) 2982 { 2983 return (0); 2984 } 2985 } 2986 } 3123 2987 return (1); 3124 2988 } … … 3129 2993 static proc incrementalAlg (ideal I) 3130 2994 { 3131 def R = basering; 3132 int nvar = nvars(R); 3133 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 3134 execute(s); 3135 ideal I = fetch(R,I); 2995 int nvar = nvars(basering); 3136 2996 // COMPROBACIONES 3137 2997 // Variables … … 3143 3003 ideal artI; 3144 3004 if (artiniano[1] == 0) 3145 3146 3147 3148 3005 { 3006 artI = artiniano[2]; 3007 elimina = artiniano[3]; 3008 } 3149 3009 else 3150 3151 3152 3153 3010 { 3011 artI = I; 3012 elimina[nvar] = 0; 3013 } 3154 3014 // Buscamos la primera componente irreducible o, lo que es lo 3155 3015 // mismo, aquellos generadores que son potencia de una variable. … … 3158 3018 // ideal. 3159 3019 list MinI,componentes; 3160 int sizartI = size(artI);3020 int sizartI = ncols(artI); 3161 3021 int sizelimina = size(elimina); 3162 3022 for (i = 1 ; i <= nvar ; i ++) 3163 { 3164 if (elimina[i] == 0) 3165 { 3166 // Buscamos en el ideal los generadores que nos interesan 3167 for (j = 1 ; j <= sizartI ; j ++) 3023 { 3024 if (elimina[i] == 0) 3025 { 3026 // Buscamos en el ideal los generadores que nos interesan 3027 for (j = 1 ; j <= sizartI ; j ++) 3028 { 3029 sop = soporte(artI[j]); 3030 if (sop <> 0) 3031 { 3032 beta[sop] = leadexp(artI[j])[sop]; 3033 MinI = insert(MinI,leadexp(artI[j])); 3034 if (j <> 1 and j <> sizartI) 3035 { 3036 artI = artI[1..j - 1],artI[j + 1..sizartI]; 3037 } 3038 else 3039 { 3040 if (j == 1) 3168 3041 { 3169 sop = soporte(artI[j]); 3170 if (sop <> 0) 3171 { 3172 beta[sop] = leadexp(artI[j])[sop]; 3173 MinI = insert(MinI,leadexp(artI[j])); 3174 if (j <> 1 and j <> sizartI) 3175 { 3176 artI = artI[1..j - 1],artI[j + 1..sizartI]; 3177 } 3178 else 3179 { 3180 if (j == 1) 3181 { 3182 artI = artI[2..sizartI]; 3183 } 3184 else 3185 { 3186 artI = artI[1..sizartI - 1]; 3187 } 3188 } 3189 sizartI = size(artI); 3190 break; 3191 } 3042 artI = artI[2..sizartI]; 3192 3043 } 3193 } 3194 else 3195 { 3196 // Buscamos la que esta al final 3197 sop = soporte(artI[sizartI]); 3198 beta[sop] = leadexp(artI[sizartI])[sop]; 3199 MinI = insert(MinI,leadexp(artI[sizartI])); 3200 if (sizartI <> 1) 3044 else 3201 3045 { 3202 3046 artI = artI[1..sizartI - 1]; 3203 3047 } 3204 else 3205 { 3206 artI = artI[1]; 3207 } 3208 sizartI = size(artI); 3209 } 3210 } 3048 } 3049 sizartI = ncols(artI); 3050 break; 3051 } 3052 } 3053 } 3054 else 3055 { 3056 // Buscamos la que esta al final 3057 sop = soporte(artI[sizartI]); 3058 beta[sop] = leadexp(artI[sizartI])[sop]; 3059 MinI = insert(MinI,leadexp(artI[sizartI])); 3060 if (sizartI <> 1) 3061 { 3062 artI = artI[1..sizartI - 1]; 3063 } 3064 else 3065 { 3066 artI = artI[1]; 3067 } 3068 sizartI = ncols(artI); 3069 } 3070 } 3211 3071 // En beta tenemos la primera componente 3212 3072 componentes = insert(componentes,beta); … … 3219 3079 intvec expartI; 3220 3080 for(i = 1 ; i <= sizartI ; i ++) 3221 { 3222 expartI = leadexp(artI[1]); 3223 if (size(artI) <> 1) 3224 { 3225 artI = artI[2..size(artI)]; 3226 } 3227 // Hay que distinguir T_1 y T_2. Para ello se comparar vectores 3228 // de la lista actual de generadores con el que se acaba de 3229 // introducir. 3230 cont2 = 0; 3231 for (j = 1 ; j <= sizcomponents ; j ++) 3232 { 3233 beta = componentes[1 + cont2]; 3234 // Si el nuevo generador divide a la componente beta, hay 3235 // que buscar las nuevas componentes 3236 for (k = 1 ; k <= nvar ; k ++) 3081 { 3082 expartI = leadexp(artI[1]); 3083 if (size(artI) <> 1) 3084 { 3085 artI = artI[2..size(artI)]; 3086 } 3087 // Hay que distinguir T_1 y T_2. Para ello se comparar vectores 3088 // de la lista actual de generadores con el que se acaba de 3089 // introducir. 3090 cont2 = 0; 3091 for (j = 1 ; j <= sizcomponents ; j ++) 3092 { 3093 beta = componentes[1 + cont2]; 3094 // Si el nuevo generador divide a la componente beta, hay 3095 // que buscar las nuevas componentes 3096 for (k = 1 ; k <= nvar ; k ++) 3097 { 3098 if (expartI[k] >= beta[k]) 3099 { 3100 break; 3101 } 3102 } 3103 // Si el bucle anterior termino, divide y hay que hacer 3104 // los cambios. 3105 if (k == nvar + 1) 3106 { 3107 componentes = delete (componentes,1 + cont2); 3108 // Buscamos las nuevas componentes calculando las 3109 // distancias. Para cada variable busco d(beta,k,l) 3110 for (k = 1 ; k <= nvar ; k ++) 3111 { 3112 betaaux = beta; 3113 max = -1; 3114 cont = 0; 3115 dbeta = 0; 3116 for (l = 1 ; l <= nvar ; l ++) 3117 { 3118 if (l <> k) 3237 3119 { 3238 if (expartI[k] >= beta[k]) 3120 min = 32767; 3121 cont ++; 3122 for (m = 1 ; m <= sizMin ; m ++) 3123 { 3124 // Estos son de los buenos 3125 if (divide(MinI[m],beta,l) == 1) 3239 3126 { 3240 break; 3127 if (MinI[m][k] < min) 3128 { 3129 min = MinI[m][k]; 3130 } 3241 3131 } 3132 } 3133 dbeta[cont] = min; 3242 3134 } 3243 // Si el bucle anterior termino, divide y hay que hacer 3244 // los cambios. 3245 if (k == nvar + 1) 3135 } 3136 // Aqui ya tenemos d(beta,k,l) para cada k 3137 // Hallamos el maximo cuando terminemos 3138 for (l = 1 ; l <= cont ; l ++) 3139 { 3140 if (dbeta[l] > max) 3246 3141 { 3247 componentes = delete (componentes,1 + cont2); 3248 // Buscamos las nuevas componentes calculando las 3249 // distancias. Para cada variable busco d(beta,k,l) 3250 for (k = 1 ; k <= nvar ; k ++) 3251 { 3252 betaaux = beta; 3253 max = -1; 3254 cont = 0; 3255 dbeta = 0; 3256 for (l = 1 ; l <= nvar ; l ++) 3257 { 3258 if (l <> k) 3259 { 3260 min = 32767; 3261 cont ++; 3262 for (m = 1 ; m <= sizMin ; m ++) 3263 { 3264 // Estos son de los buenos 3265 if (divide(MinI[m],beta,l) == 1) 3266 { 3267 if (MinI[m][k] < min) 3268 { 3269 min = MinI[m][k]; 3270 } 3271 } 3272 } 3273 dbeta[cont] = min; 3274 } 3275 } 3276 // Aqui ya tenemos d(beta,k,l) para cada k 3277 // Hallamos el maximo cuando terminemos 3278 for (l = 1 ; l <= cont ; l ++) 3279 { 3280 if (dbeta[l] > max) 3281 { 3282 max = dbeta[l]; 3283 } 3284 } 3285 // Condicion para introducir nueva componente 3286 if (max < expartI[k]) 3287 { 3288 betaaux[k] = expartI[k]; 3289 componentes = insert(componentes,betaaux,size(componentes)); 3290 } 3291 } 3142 max = dbeta[l]; 3292 3143 } 3293 else 3294 { 3295 cont2 ++; 3296 } 3297 } 3298 MinI = insert(MinI,expartI); 3299 sizMin = size(MinI); 3300 sizcomponents = size(componentes); 3301 } 3144 } 3145 // Condicion para introducir nueva componente 3146 if (max < expartI[k]) 3147 { 3148 betaaux[k] = expartI[k]; 3149 componentes = insert(componentes,betaaux,size(componentes)); 3150 } 3151 } 3152 } 3153 else 3154 { 3155 cont2 ++; 3156 } 3157 } 3158 MinI = insert(MinI,expartI); 3159 sizMin = size(MinI); 3160 sizcomponents = size(componentes); 3161 } 3302 3162 // Deahacer los cambios de artiniano si se han hecho 3303 3163 if (artiniano[1] == 0) 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3164 { 3165 // En elimina tenemos las variables que hemos introducido 3166 // y cual es la potencia 3167 // Solo miro las que tengan cambio 3168 for (i = 1 ; i <= nvar ; i ++) 3169 { 3170 if (elimina[i] <> 0) 3171 { 3172 for (j = 1 ; j <= sizcomponents ; j ++) 3173 { 3174 if (componentes[j][i] == elimina[i]) 3175 { 3176 componentes[j][i] = 0; 3177 } 3178 } 3179 } 3180 } 3181 } 3322 3182 // En exp(i) tengo los exponentes de cada variable de las que aparecen 3323 3183 // en cada ideal. … … 3325 3185 list facets; 3326 3186 for (i = 1 ; i <= sizcomponents ; i ++) 3327 { 3328 J = 0; 3329 for (j = 1 ; j <= nvar ; j ++) 3330 { 3331 if (componentes[i][j] <> 0) 3332 { 3333 J = J,x(j)^componentes[i][j]; 3334 } 3335 } 3336 J = simplify(J,2); 3337 facets[i] = J; 3338 } 3339 setring R; 3340 list facets = fetch (R1,facets); 3341 kill R1; 3187 { 3188 J = 0; 3189 for (j = 1 ; j <= nvar ; j ++) 3190 { 3191 if (componentes[i][j] <> 0) 3192 { 3193 J = J,var(j)^componentes[i][j]; 3194 } 3195 } 3196 J = simplify(J,2); 3197 facets[i] = J; 3198 } 3342 3199 return (facets); 3343 3200 } … … 3364 3221 static proc divideMon (poly f , poly g) 3365 3222 { 3366 def R = basering;3367 int nvar = nvars(R);3368 intvec expf = leadexp(f);3369 intvec expg = leadexp(g);3370 for (int i = 1 ; i <= nvar ; i ++)3371 3372 3373 3374 3375 3376 3377 return (1);3223 return (lead(g)/lead(f)!=0); 3224 //int nvar = nvars(basering); 3225 //intvec expf = leadexp(f); 3226 //intvec expg = leadexp(g); 3227 //for (int i = 1 ; i <= nvar ; i ++) 3228 //{ 3229 // if (expf[i] > expg[i]) 3230 // { 3231 // return (0); 3232 // } 3233 //} 3234 //return (1); 3378 3235 } 3379 3236 ////////////////////////////////////////////////////////////////////// … … 3382 3239 { 3383 3240 // I is monomial ideal 3384 def R = basering; 3385 I = fetch (R,I); 3386 S = fetch(R,S); 3387 int sizI = size(I); 3388 int nvar = nvars(R); 3241 int sizI = ncols(I); 3242 int nvar = nvars(basering); 3389 3243 intvec explcmMin = leadexp(lcmMin); 3390 3244 // Variables … … 3395 3249 intvec xiexp; 3396 3250 for (i = 1 ; i <= nvar ; i ++) 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 p = x(i)^median;3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 return(x(i)^(max-1));3440 3441 3442 3443 3444 3251 { 3252 if (explcmMin[i] >= 2 ) 3253 { 3254 // Median exponent of x(i) from intersection(minI,x(i)) 3255 cont = 0; 3256 for (j = 1 ; j <= sizI ; j ++) 3257 { 3258 exp = leadexp(I[j])[i]; 3259 if (exp > 0) 3260 { 3261 cont ++; 3262 xiexp[cont] = exp; 3263 } 3264 } 3265 xiexp = sort(xiexp)[1]; 3266 sizxi = size(xiexp); 3267 if (size(xiexp) == 1) 3268 { 3269 median = xiexp[1] - 1; 3270 } 3271 else 3272 { 3273 if (size(xiexp) == 2) 3274 { 3275 median = xiexp[2] - 1; 3276 } 3277 else 3278 { 3279 median = xiexp[(size(xiexp) + 1) / 2]; 3280 } 3281 } 3282 p = var(i)^median; 3283 // valid pivot?? 3284 if ( membershipMon(p,S) == 0) 3285 { 3286 return(p); 3287 } 3288 else 3289 { 3290 max = maximoExp(S,i); 3291 if ( xiexp[sizxi] == max ) 3292 { 3293 return(var(i)^(max-1)); 3294 } 3295 } 3296 xiexp = 0; 3297 } 3298 } 3445 3299 } 3446 3300 ////////////////////////////////////////////////////////////////////// … … 3451 3305 int i, j, k, cont, numdeleted; 3452 3306 intvec isMaximal; 3453 def R = basering; 3454 I = fetch(R,I); 3455 int sizI = size(I); 3456 int nvar = nvars(R); 3307 int sizI = ncols(I); 3308 int nvar = nvars(basering); 3457 3309 poly lcmMinI = 1; 3458 3310 for (i = 1 ; i <= sizI ; i ++) 3459 3460 3461 3311 { 3312 lcmMinI = lcmMon(I[i],lcmMinI); 3313 } 3462 3314 intvec explcmMinI = leadexp(lcmMinI); 3463 3315 // Buscamos los elementos que son x(i) maximales. En caso de que … … 3466 3318 isMaximal[sizI] = 0; 3467 3319 intvec genexp; 3468 for (i = 1 ; i <= sizI ; i ++) 3469 { 3470 genexp = leadexp(I[i]); 3471 cont = 0; 3472 for ( j = 1 ; j <= nvar ; j ++) 3473 { 3474 if (genexp[j] <> 0 && genexp[j] == explcmMinI[j]) 3320 for (i = 1 ; i <= sizI ; i ++) 3321 { 3322 genexp = leadexp(I[i]); 3323 cont = 0; 3324 for ( j = 1 ; j <= nvar ; j ++) 3325 { 3326 if (genexp[j] <> 0 && genexp[j] == explcmMinI[j]) 3327 { 3328 if (cont == 0) 3329 { 3330 cont ++; 3331 isMaximal[i] = j; 3332 } 3333 else 3334 { 3335 // Porque cuando encontramos que era maximal para 3336 // la primera variable, lo guardamos 3337 isMaximal[i] = 0; 3338 // Eliminamos del ideal 3339 if (i <> 1 && i <> sizI) 3340 { 3341 I = I[1..i - 1],I[i + 1..sizI]; 3342 } 3343 else 3344 { 3345 if (i == 1) 3475 3346 { 3476 3477 if (cont == 0) 3478 { 3479 cont ++; 3480 isMaximal[i] = j; 3481 } 3482 else 3483 { 3484 // Porque cuando encontramos que era maximal para 3485 // la primera variable, lo guardamos 3486 isMaximal[i] = 0; 3487 // Eliminamos del ideal 3488 if (i <> 1 && i <> sizI) 3489 { 3490 I = I[1..i - 1],I[i + 1..sizI]; 3491 } 3492 else 3493 { 3494 if (i == 1) 3495 { 3496 I = I[2..sizI]; 3497 } 3498 else 3499 { 3500 I = I[1..sizI - 1]; 3501 } 3502 } 3503 i --; 3504 sizI = size(I); 3505 // Generador i eliminado, miramos el siguiente 3506 break; 3507 } 3347 I = I[2..sizI]; 3508 3348 } 3509 } 3510 } 3349 else 3350 { 3351 I = I[1..sizI - 1]; 3352 } 3353 } 3354 i --; 3355 sizI = ncols(I); 3356 // Generador i eliminado, miramos el siguiente 3357 break; 3358 } 3359 } 3360 } 3361 } 3511 3362 // En isMaximal[i] tenemos 0 si I[i] no es maximal, 3512 // y j si I[i] es maximal en x(j). 3363 // y j si I[i] es maximal en x(j). 3513 3364 // Matriz de exponentes de los generadores del ideal 3514 3365 intmat expI[sizI][nvar]; 3515 3366 for (i = 1 ; i <= sizI ; i++) 3516 3517 3518 3367 { 3368 expI[i,1..nvar] = leadexp(I[i]); 3369 } 3519 3370 // Buscamos ahora cota inferior 3520 3371 poly lcmMi = 1; … … 3522 3373 intvec Mi, mincol,expgcd; 3523 3374 for (i = 1 ; i <= nvar ; i ++) 3524 { 3525 Mi = 0; 3526 cont = 0; 3527 for (j = 1 ; j <= sizI ; j ++) 3528 { 3529 // De isMaximal solo se usan las entradas que se corresponden con elementos del ideal 3530 if (expI[j,i] <> 0) 3531 { 3532 if (isMaximal[j] == 0 or isMaximal[j] == i) 3533 { 3534 // Elementos del sistema minimal que estan 3535 // en Mi 3536 cont ++; 3537 Mi[cont] = j; 3538 } 3539 } 3540 } 3541 // Si solo hay un elemento en Mi, no hay nada que hacer 3542 if (cont > 1) 3543 { 3544 gcdMi = I[Mi[1]]; 3545 // Tenemos los generadores a los que hay que hallar el gcd 3546 for (j = 2; j <= cont ; j ++) 3547 { 3548 gcdMi = gcdMon(gcdMi,I[Mi[j]]); 3549 } 3550 } 3375 { 3376 Mi = 0; 3377 cont = 0; 3378 for (j = 1 ; j <= sizI ; j ++) 3379 { 3380 // De isMaximal solo se usan las entradas que se corresponden con elementos del ideal 3381 if (expI[j,i] <> 0) 3382 { 3383 if (isMaximal[j] == 0 or isMaximal[j] == i) 3384 { 3385 // Elementos del sistema minimal que estan 3386 // en Mi 3387 cont ++; 3388 Mi[cont] = j; 3389 } 3390 } 3391 } 3392 // Si solo hay un elemento en Mi, no hay nada que hacer 3393 if (cont > 1) 3394 { 3395 gcdMi = I[Mi[1]]; 3396 // Tenemos los generadores a los que hay que hallar el gcd 3397 for (j = 2; j <= cont ; j ++) 3398 { 3399 gcdMi = gcd(gcdMi,I[Mi[j]]); 3400 } 3401 } 3402 else 3403 { 3404 if (Mi <> 0) 3405 { 3406 gcdMi = I[Mi[1]]; 3407 } 3551 3408 else 3552 { 3553 if (Mi <> 0) 3554 { 3555 gcdMi = I[Mi[1]]; 3556 } 3557 else 3558 { 3559 // Falta alguna variable 3560 return (0,I); 3561 } 3562 } 3563 l = gcdMi/x(i); 3564 lcmMi = lcmMon(lcmMi,l); 3565 } 3409 { 3410 // Falta alguna variable 3411 return (0,I); 3412 } 3413 } 3414 l = gcdMi/var(i); 3415 lcmMi = lcmMon(lcmMi,l); 3416 } 3566 3417 // Ahora devolvemos la cota inferior, que luego hay que multiplicar 3567 3418 // por el monomio que define el corte. … … 3573 3424 static proc con (ideal I , ideal S , poly q) 3574 3425 { 3575 def R = basering; 3576 int nvar = nvars(R); 3577 I = fetch(R,I); 3578 S = fetch(R,S); 3579 q = fetch(R,q); 3426 int nvar = nvars(basering); 3580 3427 // Variables 3581 3428 int i; 3582 3429 poly piI; 3583 int sizI = size(I);3430 int sizI = ncols(I); 3584 3431 // Simplification process 3585 3432 poly p; 3586 3433 list sol; 3587 3434 while (1) 3588 { 3589 // (I,S,q) normal slice? 3590 // Como cada vez que introducimos una cota inferior sabemos 3591 // que la slice actual es la inner slice (la otra es vacio), 3592 // hay que volver a verificar si es normal 3593 if ( S <> 0 ) 3594 { 3595 // m/rad(m) esta en S, para m generador minimal de I?? 3596 for (i = 1 ; i <= sizI ; i ++) 3597 { 3598 piI = pi(I[i]); 3599 if (membershipMon(piI,S) == 1) 3600 { 3601 if (i == 1) 3602 { 3603 I = I[2..sizI]; 3604 } 3605 else 3606 { 3607 if (i == sizI) 3608 { 3609 I = I[1..sizI - 1]; 3610 } 3611 else 3612 { 3613 I = I[1..i - 1],I[i + 1..sizI]; 3614 } 3615 } 3616 sizI = size(I); 3617 i --; 3618 } 3435 { 3436 // (I,S,q) normal slice? 3437 // Como cada vez que introducimos una cota inferior sabemos 3438 // que la slice actual es la inner slice (la otra es vacio), 3439 // hay que volver a verificar si es normal 3440 if ( S <> 0 ) 3441 { 3442 // m/rad(m) esta en S, para m generador minimal de I?? 3443 for (i = 1 ; i <= sizI ; i ++) 3444 { 3445 piI = pi(I[i]); 3446 if (membershipMon(piI,S) == 1) 3447 { 3448 if (i == 1) 3449 { 3450 I = I[2..sizI]; 3451 } 3452 else 3453 { 3454 if (i == sizI) 3455 { 3456 I = I[1..sizI - 1]; 3619 3457 } 3620 } 3621 // Buscamos cota inferior, y si es distinta de 1, simplificamos 3622 sol = simplification(I); 3623 p = sol[1]; 3624 if (p == 1) 3458 else 3459 { 3460 I = I[1..i - 1],I[i + 1..sizI]; 3461 } 3462 } 3463 sizI = ncols(I); 3464 i --; 3465 } 3466 } 3467 } 3468 // Buscamos cota inferior, y si es distinta de 1, simplificamos 3469 sol = simplification(I); 3470 p = sol[1]; 3471 if (p == 1) 3472 { 3473 break; 3474 } 3475 else 3476 { 3477 if (p == 0) 3478 { 3479 break; 3480 } 3481 else 3482 { 3483 if (membershipMon(p,I) == 1 ) 3625 3484 { 3626 3485 break; 3627 3486 } 3628 else 3629 { 3630 if (p == 0) 3631 { 3632 break; 3633 } 3634 else 3635 { 3636 if (membershipMon(p,I) == 1 ) 3637 { 3638 break; 3639 } 3640 } 3641 } 3642 // Changing slice by simplification 3643 I = sol[2]; 3644 I = minbase(quotient(I,p)); 3645 q = p*q; 3646 S = minbase(quotient(S,p)); 3647 sizI = size(I); 3648 } 3649 sizI = size(I); 3487 } 3488 } 3489 // Changing slice by simplification 3490 I = sol[2]; 3491 I = minbase(quotient(I,p)); 3492 q = p*q; 3493 S = minbase(quotient(S,p)); 3494 sizI = ncols(I); 3495 } 3496 sizI = ncols(I); 3650 3497 // (I,S,q) base case? 3651 3498 poly lcmMinI; 3652 3499 lcmMinI = 1; 3653 3500 for (i = 1 ; i <= sizI ; i ++) 3654 3655 3656 3501 { 3502 lcmMinI = lcmMon(lcmMinI,I[i]); 3503 } 3657 3504 // a:b generates an intvec of length b with constant entries a 3658 3505 intvec one = 1:nvar; 3659 3506 if (divideMon(monomial(one),lcmMinI) == 0) 3660 3661 3662 3507 { 3508 return (0); 3509 } 3663 3510 if (equal(radicalMon(I),I) == 1) 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 q = q * x(i);3674 3675 3676 3677 3511 { 3512 if (equal(I, maxideal(1)) == 0) 3513 { 3514 return (0); 3515 } 3516 else 3517 { 3518 for (i = 1 ; i <= nvar ; i ++) 3519 { 3520 q = q * var(i); 3521 } 3522 return (q); 3523 } 3524 } 3678 3525 // Selecting pivot 3679 3526 p = pivot(I,lcmMinI,S); … … 3689 3536 static proc irredDecMonSlice (ideal I) 3690 3537 { 3691 // New ring 3692 def R = basering; 3693 int nvar = nvars(R); 3694 string s = "ring R1 =",charstr(R),",x(1..nvar),dp;"; 3695 execute(s); 3696 ideal I = fetch(R,I); 3697 int sizI = size(I); 3538 int nvar = nvars(basering); 3539 int sizI = ncols(I); 3698 3540 int i,j; 3699 3541 // Artinian ideal … … 3701 3543 list artinianization = artinian(I); 3702 3544 if (artinianization[1] == 0) 3703 3704 3705 3545 { 3546 artI = artinianization[2]; 3547 } 3706 3548 else 3707 3708 3709 3549 { 3550 artI = I; 3551 } 3710 3552 // Easy case: 2 variables 3711 3553 if (nvar == 2) 3712 { 3713 artI = sort(artI)[1]; 3714 int sizartI = size(artI); 3715 for (i = 1 ; i <= sizartI - 1 ; i ++) 3716 { 3717 components[i] = x(1)^(leadexp[artI[i]][1])*x(2)^(leadexp[artI[i + 1]][2]); 3718 } 3719 setring R; 3720 list components = fetch(R1,components); 3721 kill R1; 3722 return (components); 3723 } 3554 { 3555 artI = sort(artI)[1]; 3556 int sizartI = size(artI); 3557 for (i = 1 ; i <= sizartI - 1 ; i ++) 3558 { 3559 components[i] = var(1)^(leadexp[artI[i]][1])*var(2)^(leadexp[artI[i + 1]][2]); 3560 } 3561 return (components); 3562 } 3724 3563 ideal irredDec = con (artI,0,1); 3725 3564 // Delelting zeros … … 3728 3567 intvec elimina; 3729 3568 if (artinianization[1] == 0) 3730 3731 3732 3569 { 3570 elimina = artinianization[3]; 3571 } 3733 3572 else 3734 3735 3736 3573 { 3574 elimina = 0; 3575 } 3737 3576 // Each generator (monomial) corresponds to an ideal 3738 3577 list components; … … 3742 3581 ideal auxIdeal; 3743 3582 for (i = 1 ; i <= sizIrred ; i ++) 3744 { 3745 comp = irredDec[i]; 3746 exp = leadexp(comp); 3747 for (j = 1 ; j <= nvar ; j ++) 3748 { 3749 if (exp[j] <> 0) 3750 { 3751 if (elimina <> 0) 3752 { 3753 if (exp[j] == elimina[j]) 3754 { 3755 auxIdeal[j] = 0; 3756 } 3757 else 3758 { 3759 auxIdeal[j] = x(j)^exp[j]; 3760 } 3761 } 3762 else 3763 { 3764 auxIdeal[j] = x(j)^exp[j]; 3765 } 3766 } 3767 } 3768 components[i] = simplify(auxIdeal,2); 3769 auxIdeal = 0; 3770 } 3771 setring R; 3772 list components = fetch(R1,components); 3773 kill R1; 3583 { 3584 comp = irredDec[i]; 3585 exp = leadexp(comp); 3586 for (j = 1 ; j <= nvar ; j ++) 3587 { 3588 if (exp[j] <> 0) 3589 { 3590 if (elimina <> 0) 3591 { 3592 if (exp[j] == elimina[j]) 3593 { 3594 auxIdeal[j] = 0; 3595 } 3596 else 3597 { 3598 auxIdeal[j] = var(j)^exp[j]; 3599 } 3600 } 3601 else 3602 { 3603 auxIdeal[j] = var(j)^exp[j]; 3604 } 3605 } 3606 } 3607 components[i] = simplify(auxIdeal,2); 3608 auxIdeal = 0; 3609 } 3774 3610 return (components); 3775 3611 } … … 3820 3656 // que comprobar si el ideal es monomial. 3821 3657 if (control == 0) 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3658 { 3659 list isMon = isMonomialGB (I); 3660 if (isMon[1] == 0) 3661 { 3662 ERROR ("the ideal is not monomial."); 3663 } 3664 else 3665 { 3666 I = isMon[2]; 3667 // Ya lo tenemos con los generadores minimales 3668 } 3669 } 3834 3670 else 3835 { 3836 // Generadores monomiales, hallamos sistema minimal 3837 I = minbase(I); 3838 3839 } 3671 { 3672 // Generadores monomiales, hallamos sistema minimal 3673 I = minbase(I); 3674 } 3840 3675 // Si el ideal es irreducible, devolvemos el mismo 3841 3676 if (isirreducibleMon(I) == 1) 3842 3843 3844 3845 // Si no me han dado opcion, elijo una yo.3846 if (size(#) == 1)3847 3848 3849 3677 { 3678 return (I); 3679 } 3680 // Si no me han dado opcion, elijo una yo. 3681 if (size(#) == 1) 3682 { 3683 return (irredDec3(I)); 3684 } 3850 3685 // Leo la opcion y llamo al procedimiento oportuno 3851 3686 else 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3687 { 3688 if (#[2] == "vas") 3689 { 3690 return (irredDec1(I)); 3691 } 3692 if (#[2] == "add") 3693 { 3694 return (irredDec3(I)); 3695 } 3696 if (#[2] == "ad") 3697 { 3698 return (irredDec4(I)); 3699 } 3700 if (#[2] == "for") 3701 { 3702 return (irredDec5(I)); 3703 } 3704 if (#[2] == "mil") 3705 { 3706 return (ScarfMethod(I)); 3707 } 3708 if (#[2] == "lr") 3709 { 3710 return (labelAlgorithm(I)); 3711 } 3712 if (#[2] == "gz") 3713 { 3714 return (incrementalAlg(I)); 3715 } 3716 if (#[2] == "sr") 3717 { 3718 return (irredDecMonSlice(I)); 3719 } 3720 } 3886 3721 } 3887 3722 example … … 3935 3770 // que comprobar si el ideal es monomial. 3936 3771 if (control == 0) 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3772 { 3773 list isMon = isMonomialGB (I); 3774 if (isMon[1] == 0) 3775 { 3776 ERROR ("the ideal is not monomial."); 3777 } 3778 else 3779 { 3780 I = isMon[2]; 3781 // Ya lo tenemos con los generadores minimales 3782 } 3783 } 3949 3784 else 3950 3951 3952 3953 3785 { 3786 // Generadores monomiales, hallamos sistema minimal 3787 I = minbase(I); 3788 } 3954 3789 // Estudiamos si el ideal es o no primario 3955 3790 if (isprimaryMon(I) == 1) 3956 3957 3958 3791 { 3792 return (I); 3793 } 3959 3794 // Si no me han dado opcion, elijo una yo. 3960 3795 if (size(#) == 1) 3961 3962 3963 3796 { 3797 return(primDec3(I)); 3798 } 3964 3799 // Leo la opcion y llamo al procedimiento oportuno 3965 3800 else 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 3801 { 3802 if (#[2] == "vi") 3803 { 3804 return (primDec1(I)); 3805 } 3806 if (#[2] == "vp") 3807 { 3808 return (primDec2(I)); 3809 } 3810 if (#[2] == "add") 3811 { 3812 return (primDec3(I)); 3813 } 3814 if (#[2] == "ad") 3815 { 3816 return (primDec4(I)); 3817 } 3818 if (#[2] == "for") 3819 { 3820 return (primDec5(I)); 3821 } 3822 if (#[2] == "mil") 3823 { 3824 return (scarfMethodPrim(I)); 3825 } 3826 if (#[2] == "lr") 3827 { 3828 return (labelAlgPrim(I)); 3829 } 3830 if (#[2] == "gz") 3831 { 3832 return (incrementalAlgPrim(I)); 3833 } 3834 if (#[2] == "sr") 3835 { 3836 return (primDecMonSlice(I)); 3837 } 3838 } 4004 3839 } 4005 3840 example
Note: See TracChangeset
for help on using the changeset viewer.