Changeset 2c3a5d in git for Singular/LIB
- Timestamp:
- Apr 14, 2009, 1:52:54 PM (15 years ago)
- Branches:
- (u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', 'b4f17ed1d25f93d46dbe29e4b499baecc2fd51bb')
- Children:
- 3360fb21d69c352925dd6bc1692b4f0bd0c595c1
- Parents:
- 9ea76ad6b1c6727080f37dd35068f985af1b1bd3
- Location:
- Singular/LIB
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/dmodapp.lib
r9ea76a r2c3a5d 1 1 ////////////////////////////////////////////////////////////////////////////// 2 version="$Id: dmodapp.lib,v 1.2 7 2009-04-10 08:30:16Singular Exp $";2 version="$Id: dmodapp.lib,v 1.28 2009-04-14 11:52:54 Singular Exp $"; 3 3 category="Noncommutative"; 4 4 info=" … … 7 7 @* Daniel Andres, daniel.andres@math.rwth-aachen.de 8 8 9 GUIDE: Let K be a field of characteristic 0, R = K[x1,..xN] and 9 GUIDE: Let K be a field of characteristic 0, R = K[x1,..xN] and 10 10 @* D be the Weyl algebra in variables x1,..xN,d1,..dN. 11 11 @* In this library there are the following procedures for algebraic D-modules: 12 12 @* - localization of a holonomic module D/I with respect to a mult. closed set 13 @* of all powers of a given polynomial F from R. Our aim is to compute an 14 @* ideal L in D, such that D/L is a presentation of a localized module. Such L 15 @* always exists, since such localizations are known to be holonomic and thus 13 @* of all powers of a given polynomial F from R. Our aim is to compute an 14 @* ideal L in D, such that D/L is a presentation of a localized module. Such L 15 @* always exists, since such localizations are known to be holonomic and thus 16 16 @* cyclic modules. The procedures for the localization are DLoc,SDLoc and DLoc0. 17 17 @* 18 18 @* - annihilator in D of a given polynomial F from R as well as 19 @* of a given rational function G/F from Quot(R). These can be computed via 19 @* of a given rational function G/F from Quot(R). These can be computed via 20 20 @* procedures annPoly resp. annRat. 21 21 @* 22 @* - initial form and initial ideals in Weyl algebras with respect to a given 22 @* - initial form and initial ideals in Weyl algebras with respect to a given 23 23 @* weight vector can be computed with inForm, initialMalgrange, initialIdealW. 24 24 @* 25 @* - appelF1, appelF2 and appelF4 return ideals in parametric Weyl algebras, 25 @* - appelF1, appelF2 and appelF4 return ideals in parametric Weyl algebras, 26 26 @* which annihilate corresponding Appel hypergeometric functions. 27 27 28 REFERENCES: 29 @* (SST) Saito, Sturmfels, Takayama 'Groebner Deformations of Hypergeometric 28 REFERENCES: 29 @* (SST) Saito, Sturmfels, Takayama 'Groebner Deformations of Hypergeometric 30 30 @* Differential Equations', Springer, 2000 31 31 @* (ONW) Oaku, Takayama, Walther 'A Localization Algorithm for D-modules', 2000 … … 67 67 LIB "nctools.lib"; // for isWeyl etc 68 68 LIB "gkdim.lib"; 69 70 // todo: complete and include into above list71 // charVariety(I); compute the characteristic variety of the ideal I72 // charInfo(); ???73 74 75 ///////////////////////////////////////////////////////////////////////////////76 // testing for consistency of the library:77 proc testdmodapp()78 {79 example initialIdealW;80 example initialMalgrange;81 example DLoc;82 example DLoc0;83 example SDLoc;84 example inForm;85 example isFsat;86 example annRat;87 example annPoly;88 example appelF1;89 example appelF2;90 example appelF4;91 example poly2list;92 example fl2poly;93 example insertGenerator;94 example deleteGenerator;95 example bFactor;96 }97 69 98 70 proc inForm (ideal I, intvec w) … … 279 251 "USAGE: appelF1(); 280 252 RETURN: ring (and exports an ideal into it) 281 PURPOSE: define the ideal in a parametric Weyl algebra, 253 PURPOSE: define the ideal in a parametric Weyl algebra, 282 254 @* which annihilates Appel F1 hypergeometric function 283 255 NOTE: the ideal called IAppel1 is exported to the output ring … … 310 282 "USAGE: appelF2(); 311 283 RETURN: ring (and exports an ideal into it) 312 PURPOSE: define the ideal in a parametric Weyl algebra, 284 PURPOSE: define the ideal in a parametric Weyl algebra, 313 285 @* which annihilates Appel F2 hypergeometric function 314 286 NOTE: the ideal called IAppel2 is exported to the output ring … … 340 312 "USAGE: appelF4(); 341 313 RETURN: ring (and exports an ideal into it) 342 PURPOSE: define the ideal in a parametric Weyl algebra, 314 PURPOSE: define the ideal in a parametric Weyl algebra, 343 315 @* which annihilates Appel F4 hypergeometric function 344 316 NOTE: the ideal called IAppel4 is exported to the output ring … … 460 432 ERROR("Basering is not a Weyl algebra"); 461 433 } 462 if (defined(LD0) || defined(BS)) 434 if (defined(LD0) || defined(BS)) 463 435 { 464 436 ERROR("Reserved names LD0 and/or BS are used. Please rename the objects."); … … 500 472 "USAGE: DLoc0(I, F); I an ideal, F a poly 501 473 RETURN: ring 502 PURPOSE: compute the presentation of the localization of D/I w.r.t. f^s, 474 PURPOSE: compute the presentation of the localization of D/I w.r.t. f^s, 503 475 @* where D is a Weyl Algebra, based on the output of procedure SDLoc 504 476 ASSUME: the basering is similar to the output ring of SDLoc procedure … … 734 706 gkdim(I); // 3 735 707 def W = SDLoc(I,F); setring W; // creates ideal LD in W = R[s] 736 def U = DLoc0(LD, x2-y3); setring U; // compute in R 708 def U = DLoc0(LD, x2-y3); setring U; // compute in R 737 709 LD0; // Groebner basis of the presentation of localization 738 710 BS; // description of b-function for localization … … 949 921 setring R; 950 922 poly F = x2-y3; 951 ideal I = Dx*F, Dy*F; 923 ideal I = Dx*F, Dy*F; 952 924 // note, that I is not holonomic, since it's dimension is not 2 953 925 gkdim(I); // 3, while dim R = 4 … … 1405 1377 RETURN: poly 1406 1378 PURPOSE: reconstruct a monic polynomial in one variable from its factorization 1407 ASSUME: s is a string with the name of some variable and 1379 ASSUME: s is a string with the name of some variable and 1408 1380 @* L is supposed to consist of two entries: 1409 1381 @* L[1] of the type ideal with the roots of a polynomial … … 1467 1439 ASSUME: The basering is the n-th Weyl algebra in characteristic 0 and for all 1468 1440 @* 1<=i<=n the identity var(i+n)*var(i)=var(i)*var(i+1)+1 holds, i.e. the 1469 @* sequence of variables is given by x(1),...,x(n),D(1),...,D(n), 1441 @* sequence of variables is given by x(1),...,x(n),D(1),...,D(n), 1470 1442 @* where D(i) is the differential operator belonging to x(i). 1471 1443 PURPOSE: computes the initial ideal with respect to given weights. … … 1523 1495 } 1524 1496 } 1525 1497 1526 1498 // 1. create homogenized Weyl algebra 1527 1499 // 1.1 create ordering … … 1853 1825 { 1854 1826 dbprint(ppl,"// found no roots"); 1855 } 1827 } 1856 1828 L = list(II,mm); 1857 1829 if (ir <> 1) … … 1862 1834 L = L + list(string(ir)); 1863 1835 } 1864 else 1836 else 1865 1837 { 1866 1838 dbprint(ppl,"// no irreducible factors found"); 1867 } 1839 } 1868 1840 setring save; 1869 1841 L = imap(@S,L); … … 1875 1847 ring r = 0,(x,y),dp; 1876 1848 bFactor((x^2-1)^2); 1877 bFactor((x^2+1)^2); 1849 bFactor((x^2+1)^2); 1878 1850 bFactor((y^2+1/2)*(y+9)*(y-7)); 1879 1851 } -
Singular/LIB/sheafcoh.lib
r9ea76a r2c3a5d 1 1 /////////////////////////////////////////////////////////////////////////////// 2 version="$Id: sheafcoh.lib,v 1.1 7 2009-04-10 19:28:58 motsakExp $";2 version="$Id: sheafcoh.lib,v 1.18 2009-04-14 11:52:54 Singular Exp $"; 3 3 category="Commutative Algebra"; 4 4 info=" … … 28 28 LIB "nctools.lib"; 29 29 LIB "homolog.lib"; 30 31 32 ///////////////////////////////////////////////////////////////////////////////33 // testing for consistency of the library:34 proc testSheafCohLibrary()35 {36 printlevel = printlevel + 1;37 example truncate;38 example truncateFast;39 example CM_regularity;40 example sheafCoh;41 example sheafCohBGG;42 example dimH;43 example dimGradedPart;44 example sheafCohBGG2;45 example getStructureSheaf;46 printlevel = printlevel - 1;47 }48 49 30 50 31 … … 233 214 Fast + experimental version. M shoud be a SB! 234 215 DISPLAY: If @code{printlevel}>=1, step-by step timings will be printed. 235 If @code{printlevel}>=2 we add progress debug messages 216 If @code{printlevel}>=2 we add progress debug messages 236 217 if @code{printlevel}>=3, even all intermediate results... 237 218 EXAMPLE: example truncateFast; shows an example … … 244 225 dbprint(PL-1, "// truncateFast(M: "+ string(nrows(M)) + " x " + string(ncols(M)) +", " + string(d) + "):"); 245 226 dbprint(PL-2, M); 246 227 247 228 intvec save = option(get); 248 229 if( PL >= 2 ) 249 230 { 250 option(prot); 251 option(mem); 231 option(prot); 232 option(mem); 252 233 } 253 234 … … 329 310 330 311 int tTruncateEnd=timer; 331 312 332 313 dbprint(PL-1, "// corrected weighting(L): ["+ string(attrib(L, "isHomog")) + "]"); 333 314 … … 345 326 :: After .Time: ", tTruncateEnd - tMinBaseEnd; 346 327 } 347 328 348 329 option(set, save); 349 330 … … 480 461 } 481 462 } 482 463 483 464 if( attrib(CM_regularity,"Algorithm") != "mres" ) 484 465 { … … 488 469 def L = mres(M,0); 489 470 } 490 471 491 472 intmat BeL = betti(L); 492 473 int r = nrows(module(matrix(BeL))); // last non-zero row … … 647 628 }; 648 629 649 Betti = R; 650 } 630 Betti = R; 631 } 651 632 652 633 int n=nvars(basering)-1; … … 723 704 refers to a not computed dimension. @* 724 705 If @code{printlevel}>=1, step-by step timings will be printed. 725 If @code{printlevel}>=2 we add progress debug messages 706 If @code{printlevel}>=2 we add progress debug messages 726 707 if @code{printlevel}>=3, even all intermediate results... 727 708 NOTE: This procedure is based on the Bernstein-Gel'fand-Gel'fand … … 744 725 745 726 intvec save = option(get); 746 727 747 728 if( PL >= 2 ) 748 729 { 749 option(prot); 750 option(mem); 730 option(prot); 731 option(mem); 751 732 } 752 733 753 734 def isCoker = attrib(M, "isCoker"); 754 if( typeof(isCoker) == "int" ) 735 if( typeof(isCoker) == "int" ) 755 736 { 756 737 if( isCoker > 0 ) … … 760 741 } 761 742 762 763 743 int i,j,k,row,col; 764 765 if( typeof(attrib(M,"isHomog"))!="intvec" ) { 744 745 if( typeof(attrib(M,"isHomog"))!="intvec" ) 746 { 766 747 if (size(M)==0) { attrib(M,"isHomog",0); } 767 748 else { ERROR("No admissible degree vector assigned"); } … … 769 750 770 751 dbprint(PL-1, "// weighting(M): ["+ string(attrib(M, "isHomog")) + "]"); 771 752 772 753 option(redSB); option(redTail); 773 754 … … 777 758 int ell = l + n; 778 759 779 760 780 761 ///////////////////////////////////////////////////////////////////////////// 781 // computations 762 // computations 782 763 783 764 int tBegin=timer; … … 798 779 dbprint(PL-1, "// M = std(M: "+string(nrows(M)) + " x " + string(ncols(M)) + ")"); 799 780 dbprint(PL-2, M); 800 dbprint(PL-1, "// weighting(M): ["+ string(attrib(M, "isHomog")) + "]"); 781 dbprint(PL-1, "// weighting(M): ["+ string(attrib(M, "isHomog")) + "]"); 801 782 802 783 … … 809 790 dbprint(PL-1, "// MT = truncateFast(M: "+string(nrows(MT)) + " x " + string(ncols(MT)) +", " + string(bound) + ")"); 810 791 dbprint(PL-2, MT); 811 dbprint(PL-1, "// weighting(MT): ["+ string(attrib(MT, "isHomog")) + "]"); 812 792 dbprint(PL-1, "// weighting(MT): ["+ string(attrib(MT, "isHomog")) + "]"); 793 813 794 int m=nrows(MT); 814 795 … … 818 799 int tTransposeJacobEnd=timer; 819 800 820 821 801 dbprint(PL-1, "// MT = jacob(MT: "+string(nrows(MT)) + " x " + string(ncols(MT)) + ")"); 822 802 dbprint(PL-2, MT); 823 dbprint(PL-1, "// weighting(MT): ["+ string(attrib(MT, "isHomog")) + "]"); 824 803 dbprint(PL-1, "// weighting(MT): ["+ string(attrib(MT, "isHomog")) + "]"); 825 804 826 805 int tSyzBegin=timer; 827 806 MT = syz(MT); 828 int tSyzEnd=timer; 829 807 int tSyzEnd=timer; 830 808 831 809 dbprint(PL-1, "// MT = syz(MT: "+string(nrows(MT)) + " x " + string(ncols(MT)) + ")"); 832 810 dbprint(PL-2, MT); 833 dbprint(PL-1, "// weighting(MT): ["+ string(attrib(MT, "isHomog")) + "]"); 834 835 811 dbprint(PL-1, "// weighting(MT): ["+ string(attrib(MT, "isHomog")) + "]"); 812 836 813 int tMatrixOppBegin=timer; 837 814 module SS = TensorModuleMult(m, MT); 838 int tMatrixOppEnd=timer; 815 int tMatrixOppEnd=timer; 839 816 840 817 dbprint(PL-1, "// SS = TensorModuleMult("+ string(m)+ ", MT: "+string(nrows(MT)) + " x " + string(ncols(MT)) + ")"); 841 818 dbprint(PL-2, SS); 842 dbprint(PL-1, "// weighting(SS): ["+ string(attrib(SS, "isHomog")) + "]"); 843 844 819 dbprint(PL-1, "// weighting(SS): ["+ string(attrib(SS, "isHomog")) + "]"); 820 845 821 //--- to the exterior algebra 846 822 def AR = Exterior(); setring AR; … … 852 828 853 829 dbprint(PL-1, "// maxbound: "+ string(maxbound)); 854 830 855 831 //--- here we are with our matrix 856 832 module EM=imap(R,SS); … … 863 839 attrib(EM,"isHomog",w); 864 840 865 866 867 841 /////////////////////////////////////////////////////////////// 868 842 869 843 dbprint(PL-1, "// EM: "+string(nrows(EM)) + " x " + string(ncols(EM)) + ")"); 870 844 dbprint(PL-2, EM); 871 dbprint(PL-1, "// weighting(EM): ["+ string(attrib(EM, "isHomog")) + "]"); 872 845 dbprint(PL-1, "// weighting(EM): ["+ string(attrib(EM, "isHomog")) + "]"); 873 846 874 847 int tResulutionBegin=timer; 875 resolution RE = nres(EM, maxbound); 848 resolution RE = nres(EM, maxbound); 876 849 int tMinResBegin=timer; 877 RE = minres(RE); 850 RE = minres(RE); 878 851 int tBettiBegin=timer; 879 852 intmat Betti = betti(RE); // betti(RE, 1);? 880 853 int tResulutionEnd=timer; 881 854 882 855 int tEnd = tResulutionEnd; 883 856 … … 885 858 { 886 859 " 887 ---- RESULTS ---- 888 Tate Resolution (Length: ", size(RE), "): 860 ---- RESULTS ---- 861 Tate Resolution (Length: ", size(RE), "): 889 862 "; 890 863 RE; … … 893 866 }; 894 867 895 896 868 printlevel = printlevel + 1; 897 869 Betti = showResult(Betti, l, h ); // Show usual form of cohomology table 898 870 printlevel = printlevel - 1; 899 871 900 901 872 if(PL > 0) 902 873 { … … 909 880 Syz Time: ", tSyzEnd - tSyzBegin, " 910 881 Mat Time: ", tMatrixOppEnd - tMatrixOppBegin, " 911 ------------------------------ 882 ------------------------------ 912 883 Res Time: ", tResulutionEnd - tResulutionBegin, " 913 884 :: NRes Time: ", tMinResBegin - tResulutionBegin, " … … 919 890 "; 920 891 }; 921 892 922 893 setring R; 923 894 … … 938 909 def A=sheafCohBGG(0,-9,4); 939 910 timer - t; 940 911 941 912 printlevel = voice; A=sheafCohBGG2(0,-9,4); printlevel = pl; 942 913 943 914 // cohomology of cotangential bundle on P^3: 944 915 //------------------------------------------- … … 946 917 947 918 module M = getCotangentialBundle(); 948 919 949 920 int t = timer; 950 921 def B=sheafCohBGG(M,-8,4); 951 922 timer - t; 952 923 953 924 printlevel = voice; B=sheafCohBGG2(M,-8,4); printlevel = pl; 954 925 } … … 971 942 " 972 943 { 973 if( typeof(attrib(M,"isHomog"))=="string" ) { 974 if (size(M)==0) { 944 if( typeof(attrib(M,"isHomog"))=="string" ) 945 { 946 if (size(M)==0) 947 { 975 948 // assign weights 0 to generators of R^n (n=nrows(M)) 976 949 intvec v; … … 978 951 attrib(M,"isHomog",v); 979 952 } 980 else { 953 else 954 { 981 955 ERROR("No admissible degree vector assigned"); 982 956 } … … 989 963 return(dimGradedPart(N,-n-1-d)); 990 964 } 991 else { 992 if (i==0) { 965 else 966 { 967 if (i==0) 968 { 993 969 list L=Ext_R(intvec(n+1,n+2),M,1)[2]; 994 970 def N0=L[2]; … … 1051 1027 { 1052 1028 int use_sres; 1053 if( typeof(attrib(M,"isHomog"))!="intvec" ) { 1029 if( typeof(attrib(M,"isHomog"))!="intvec" ) 1030 { 1054 1031 if (size(M)==0) { attrib(M,"isHomog",0); } 1055 1032 else { ERROR("No admissible degree vector assigned"); } 1056 1033 } 1057 if (size(#)>0) { 1034 if (size(#)>0) 1035 { 1058 1036 if (#[1]=="sres") { use_sres=1; } 1059 1037 } … … 1066 1044 if (use_sres) { list L=Ext_R(v,M,1,"sres")[2]; } 1067 1045 else { list L=Ext_R(v,M,1)[2]; } 1068 for (i=l; i<=h; i++) { 1046 for (i=l; i<=h; i++) 1047 { 1069 1048 N0=L[n+2]; 1070 1049 N1=L[n+1]; … … 1072 1051 - dimGradedPart(N0,-n-1-i); 1073 1052 } 1074 for (j=1; j<=n; j++) { 1053 for (j=1; j<=n; j++) 1054 { 1075 1055 N=L[j]; 1076 1056 attrib(N,"isSB",1); 1077 1057 if (dim(N)>=0) { 1078 for (i=l; i<=h; i++) { 1058 for (i=l; i<=h; i++) 1059 { 1079 1060 newBetti[j,i-l+1]=dimGradedPart(N,-n-1-i); 1080 1061 } … … 1132 1113 string s; 1133 1114 maxL=4; 1134 for (i=1;i<=nrows(data);i++) { 1135 for (j=1;j<=ncols(data);j++) { 1136 if (size(string(data[i,j]))>=maxL-1) { 1115 for (i=1;i<=nrows(data);i++) 1116 { 1117 for (j=1;j<=ncols(data);j++) 1118 { 1119 if (size(string(data[i,j]))>=maxL-1) 1120 { 1137 1121 maxL=size(string(data[i,j]))+2; 1138 1122 } … … 1142 1126 string Row1="----"; 1143 1127 for (i=l; i<=h; i++) { 1144 for (j=1; j<=maxL-size(string(i)); j++) { 1128 for (j=1; j<=maxL-size(string(i)); j++) 1129 { 1145 1130 Row=Row+" "; 1146 1131 } … … 1150 1135 print(Row); 1151 1136 print(Row1); 1152 for (j=1; j<=n+1; j++) { 1137 for (j=1; j<=n+1; j++) 1138 { 1153 1139 s = string(n+1-j); 1154 1140 Row = ""; 1155 1141 for(k=1; k<4-size(s); k++) { Row = Row+" "; } 1156 1142 Row = Row + s+":"; 1157 for (i=0; i<=h-l; i++) { 1143 for (i=0; i<=h-l; i++) 1144 { 1158 1145 dat = data[j,i+1]; 1159 1146 if (dat>0) { s = string(dat); } 1160 else { 1147 else 1148 { 1161 1149 if (dat==0) { s="-"; } 1162 1150 else { s="*"; notSumCol[i+1]=1; } … … 1169 1157 print(Row1); 1170 1158 Row="chi:"; 1171 for (i=0; i<=h-l; i++) { 1159 for (i=0; i<=h-l; i++) 1160 { 1172 1161 dat = 0; 1173 if (notSumCol[i+1]==0) { 1162 if (notSumCol[i+1]==0) 1163 { 1174 1164 for (j=0; j<=n; j++) { dat = dat + (-1)^j * data[n+1-j,i+1]; } 1175 1165 s = string(dat); … … 1188 1178 if( size(#) == 0 ) 1189 1179 { 1190 1191 1180 module M = 0; 1192 1181 intvec v = 0; … … 1196 1185 attrib(M, "isCoker", 1); 1197 1186 1198 attrib(M); 1187 attrib(M); 1199 1188 return(M); 1200 1189 }; 1201 1190 1202 1203 1204 1205 1206 1191 if( typeof(#[1]) == "ideal") 1207 1192 { 1208 1209 1210 1193 ideal I = #[1]; 1211 1194 … … 1219 1202 1220 1203 module M = getStructureSheaf(); 1221 1204 1222 1205 export M; 1223 1206 … … 1232 1215 module M = I * gen(1); 1233 1216 homog(M); 1234 1235 M = modulo(gen(1), module(I * gen(1))); // basering^1 / I 1217 1218 M = modulo(gen(1), module(I * gen(1))); // basering^1 / I 1236 1219 1237 1220 homog(M); 1238 1221 1239 1222 attrib(M, "isCoker", 1); 1240 1223 1241 1224 attrib(M); 1242 1225 return(M); 1243 */ 1244 } 1245 1226 */ 1227 } 1228 1246 1229 ERROR("Wrong argument"); 1247 1248 } 1230 1231 } 1249 1232 example 1250 1233 {"EXAMPLE:"; … … 1260 1243 "Module: ", string(M), ", grading is given by weights: ", attrib(M, "isHomog"); 1261 1244 1262 def A=sheafCohBGG2(M,-9,9); 1245 def A=sheafCohBGG2(M,-9,9); 1263 1246 print(A); 1264 1247 1265 1248 //////////////////////////////////////////////////////////////////////////////// 1266 1249 setring r; 1267 1250 module M = getStructureSheaf(ideal(var(1)), 0); 1268 1251 1269 1252 "Basering: "; 1270 1253 basering; 1271 1254 "Module: ", string(M), ", grading is given by weights: ", attrib(M, "isHomog"); 1272 1255 1273 def A=sheafCohBGG2(M,-9,9); 1256 def A=sheafCohBGG2(M,-9,9); 1274 1257 print(A); 1275 1258 … … 1278 1261 def Q = getStructureSheaf(ideal(var(1)), 1); // returns a new ring! 1279 1262 setring Q; // M was exported in the new ring! 1280 1263 1281 1264 "Basering: "; 1282 1265 basering; 1283 1266 "Module: ", string(M), ", grading is given by weights: ", attrib(M, "isHomog"); 1284 1267 1285 def A=sheafCohBGG2(M,-9,9); 1268 def A=sheafCohBGG2(M,-9,9); 1286 1269 print(A); 1287 1270
Note: See TracChangeset
for help on using the changeset viewer.