1 /* ======================================================== */
2 /* === === */
3 /* === S i n g u l a r I n p u t . c === */
4 /* === === */
5 /* === Authors: Maximilian Kreuzer, Nils-Ole Walliser === */
6 /* === Emanuel Scheidegger === */
7 /* === Last update: 05/04/12 === */
8 /* === === */
9 /* ======================================================== */
10
11
12 /* ======================================================== */
13 /* ========= H E A D E R s ========= */
14
15 #include "Global.h"
16 #include "Mori.h"
17
18 /* ======================================================== */
19 /* ========= D E F I N I T I O N s ========= */
20
21 /*** local for Singularinput.c ***/
22 #define DijkEQ "->" /* Useful for Mathematica rules: "->" */
23 #define T_DIV "d" /* Toric divisors */
24 #define DIVclassBase "J" /* Basis of the divisor classes */
25
26 /* diagnostic stuff */
27 #define TEST_PRINT_SINGULAR_IO (0) /* IO of SINGULAR */
28
29 #define NORM_SIMP_NUM (0)
30
31 /*=========================================================*/
32
33
Read_HyperSurf(int * he,int divclassnr,int maxline,char filename[20],MORI_Flags * _Flag)34 int Read_HyperSurf(int *he, int divclassnr, int maxline, char filename[20], MORI_Flags *_Flag){
35
36 FILE *stream;
37
38 int i;
39 char string[maxline];
40 char delims[] = " ";
41 char *result = NULL;
42
43 if(_Flag->Read_HyperSurfCounter==0){
44 if( (stream = fopen(filename, "w")) == NULL) {
45 printf("Error: cannot open file!\n");
46 exit(1);
47 }
48
49 fgets(string, sizeof string, stdin);
50 fprintf(stream, "%s\n", string);
51 }
52
53 if(_Flag->Read_HyperSurfCounter != 0){
54 if( (stream = fopen(filename,"r")) == NULL) {
55 printf("Error: cannot read file!\n");
56 exit(1);
57 }
58 fgets(string, maxline ,stream);
59 }
60
61 i=0;
62 result = strtok( string, delims );
63 while( result != NULL ) {
64 he[i] = atoi(result);
65 i++;
66 if(i == divclassnr)
67 break;
68 result = strtok( NULL, delims );
69 }
70 fclose(stream);
71
72 return i;
73 }
74
HyperSurfSingular(PolyPointList * P,triang * T,triang * SR,MORI_Flags * _Flag,FibW * F,int * cp)75 void HyperSurfSingular(PolyPointList *P,triang *T, triang *SR ,MORI_Flags *_Flag , FibW *F,int *cp){
76 int p=SR->v,d=SR->d,i,j,r, N=0;/* N=not(0th)=offset(IP) */
77 int divclassnr = *cp;
78 int TORDIM=P->n;
79 int CODIM=1;
80 int DIM=TORDIM-CODIM;
81
82 FILE *SF;
83 char SFname[L_tmpnam], SingularCall[50+L_tmpnam], *D=T_DIV,*B=DIVclassBase;
84
85 assert(NULL!=tmpnam(SFname));
86 assert(NULL!=(SF=fopen(SFname,"w")));
87
88 fprintf(SF,"LIB \"general.lib\";\n");
89 fprintf(SF,"option(noredefine);\n");
90 fprintf(SF,"ring r=0,(t,%s%d",D,N+1); // ring r=0,(t,D1,...,Dp,B1,...,Bp-d),ds;
91 for(i=N+2;i<=p;i++)
92 fprintf(SF,",%s%d",D,i);
93 for(i=1;i<=p-d;i++)
94 fprintf(SF,",%s%d",B,i);
95 fprintf(SF,"),(ds,dp(%d));\n",2*p-d);
96
97 /*LINEAR EQUIVALENCES*/
98 fprintf(SF,"ideal lin=");
99 for(r=0;r<d;r++){
100 if(r)fprintf(SF,",");
101 fprintf(SF,"0");
102 for(j=0;j<p;j++){
103 int X=P->x[j][r];
104 if((X>0))
105 fprintf(SF,"+");
106 if(X)
107 fprintf(SF,"%d*%s%d",X,D,j+1);
108 }
109 }
110 fprintf(SF,";");
111 DivClassBasis(SF,P,p,D,B);
112
113 /* STANLEY REISNER */
114 fprintf(SF,"ideal sr=");
115 for(r=0;r<SR->n;r++){
116 int f=1;
117 if(r)
118 fprintf(SF,",");
119 for(j=0;j<p;j++)
120 if(getN(j,SR->I[r])){
121 if(f)
122 f=0;
123 else
124 fprintf(SF,"*");
125 fprintf(SF,"%s%d",D,j+1);
126 }
127 }
128
129 /* CHOW RING */
130 fprintf(SF,";\nideal chow=std(lin+sr+DCbase);\n");
131
132 /*reads input for the hyper surface
133 * creates HEInput.txt
134 * reads HEInput.txt
135 * and defines poly cy as H*/
136 if(_Flag->H==1){
137
138 if(!(_Flag->FilterFlag) && _Flag->Read_HyperSurfCounter == 0)
139 printf("Type the %d (integer) entries for the hypersurface class:\n", divclassnr);
140
141
142 int *he, i;
143 he=malloc(divclassnr*sizeof(int));
144
145 for(i=0;i<divclassnr;i++)
146 he[i]=0;
147
148 int control = Read_HyperSurf(he, divclassnr, 5*divclassnr ,"HEInput.txt", _Flag);
149
150 if(_Flag->Read_HyperSurfCounter==0){
151 if(control != divclassnr)
152 printf("Warning: %d entries for the hypersurface class were expected\n"
153 " (i.e. as many entries as toric divisor classes) \n",divclassnr );
154
155 fprintf(SF,"\"Hypersurface class: ");
156 for(i=0; i<divclassnr; i++)
157 if(he[i]!=0)
158 fprintf(SF,"%d*d%d ",he[i],i+1);
159 fprintf(SF,"\";\n");
160 }
161 fprintf(SF,"poly HySurf=(0");
162 for(i=0;i<divclassnr;i++) // Hypersurface equation
163 if(he[i]!=0)
164 fprintf(SF,"+%d*d%d",he[i],i+1);
165 fprintf(SF,"); \n");
166
167 int dim = F->nw;
168 int DegreeVec[dim];
169 for(i=0;i<F->nw;i++){
170 DegreeVec[i]=0;
171 }
172
173 for(i=0;i<F->nw;i++){
174 for(j=0;j<divclassnr;j++){
175 DegreeVec[i] += he[j]*(F->W[i][j]);
176 }
177 }
178 if(_Flag->Read_HyperSurfCounter==0){
179 fprintf(outFILE,"Hypersurface degrees: (");
180 for(i=0;i<F->nw;i++){
181 fprintf(outFILE," %d ",DegreeVec[i]);
182 }
183 fprintf(outFILE,")\n");
184 }
185
186
187 // _Flag->Read_HyperSurfCounter++;
188
189 free(he); fflush(0);
190
191 }
192
193 else {
194 fprintf(SF,"poly HySurf=(%s%d",D,N+1);
195 for(i=N+1;i<p;i++) // CALABI-YAU
196 fprintf(SF,"+%s%d",D,i+1);
197 fprintf(SF,");\n");
198 }
199
200 fprintf(SF,"number vol=");{
201 int NN=NORM_SIMP_NUM; // NORMALIZATION
202 Long *X[POLY_Dmax], Vijkl;
203 int x[POLY_Dmax], n=0; i=j=0;
204 if((NN<0)||(NN > T->n)) NN=0;
205 // for(j=1;j<T->n;j++)if(T->I[j]<T->I[NN])NN=j; //avoid D_I.DHySurf=0 for P3xP3/Z3
206 while(i<p){
207 if(getN(i++,T->I[ NN ])){
208 x[n]=i-1;
209 X[n++]=P->x[i-1];
210 }
211 }
212 assert(n==P->n);
213 Vijkl=SimplexVolume(X,P->n);
214 fprintf(SF,"%ld;\n",Vijkl);
215 fprintf(SF,"poly norm=vol*reduce(%s%d",D,x[0]+1);
216 for(j=1;j<TORDIM;j++) fprintf(SF,"*%s%d",D,x[j]+1);
217 fprintf(SF,",chow);\n");
218 }
219
220 if(_Flag->i || _Flag->c){
221 fprintf(SF,"\"SINGULAR -> divisor classes (integral basis %s1",B);
222 if(p-d>1)
223 fprintf(SF," ... %s%d",B,p-d);
224 fprintf(SF,"):\";\n");
225 fprintf(SF,"string LR=string(%s1)+\"=\"+string(reduce(%s1,chow));\n",D,D);
226 for(j=2;j<=p;j++){
227 fprintf(SF,"LR=LR+\", \"+string(%s%d)+\"=\"+",D,j);
228 fprintf(SF,"string(reduce(%s%d,chow));\n ",D,j);
229 }
230 fprintf(SF,"LR;\n");
231 }
232
233 fprintf(SF, "list dli=d1");
234 for(j=2;j<=p;j++)
235 fprintf(SF,",d%d",j);
236 fprintf(SF,";\n");
237 fprintf(SF, "list Jli=J1");
238 for(j=2;j<=p-d;j++)
239 fprintf(SF,",J%d",j);
240 fprintf(SF,";\n");
241
242 fprintf(SF,"int i,j,k;\n");
243
244 /*linear basis ideal*/
245 fprintf(SF,"ideal lb=std(lin+DCbase);\n");
246
247 /* Test for nonintersecting divisors */
248 fprintf(SF,"ideal hypideal = quotient(chow,HySurf);\n");
249 if(_Flag->t || _Flag->d){
250 fprintf(SF,"list nonintersectingd = list();\n");
251 fprintf(SF,"for(i=1;i<=%d;i++){\n",p);
252 fprintf(SF," if(reduce(dli[i],std(hypideal))==0){\n");
253 fprintf(SF," nonintersectingd=nonintersectingd+list(dli[i]);\n");
254 fprintf(SF," }\n");
255 fprintf(SF,"}\n");
256 fprintf(SF,"if(size(nonintersectingd)>0){\n");
257 fprintf(SF," \"SINGULAR -> nonintersecting divisor classes : \";\n");
258 fprintf(SF," string nd=string(nonintersectingd[1]);\n");
259 fprintf(SF," for(i=2;i<=size(nonintersectingd);i++){\n");
260 fprintf(SF," nd=nd+\", \"+string(nonintersectingd[i]);\n");
261 fprintf(SF," }\n");
262 fprintf(SF,"nd;}\n");
263 }
264 if(_Flag->i || _Flag->c){
265 fprintf(SF,"list nonintersectingJ = list();\n");
266 fprintf(SF,"for(i=1;i<=%d;i++){\n",p-d);
267 fprintf(SF,"if(reduce(Jli[i],std(hypideal))==0){nonintersectingJ=nonintersectingJ+list(Jli[i]);}\n");
268 fprintf(SF,"}\n");
269 fprintf(SF,"if(size(nonintersectingJ)>0){\n");
270 fprintf(SF," \"SINGULAR -> nonintersecting divisor classes (integral basis): \";\n");
271 fprintf(SF," string nJ=string(nonintersectingJ[1]);\n");
272 fprintf(SF," for(i=2;i<=size(nonintersectingJ);i++){\n");
273 fprintf(SF," nJ=nJ+\", \"+string(nonintersectingJ[i]);\n");
274 fprintf(SF," }\n");
275 fprintf(SF,"nJ;}\n");
276 }
277
278
279 /* Singular procedure to compute the Todd class of a vector bundle given by its Chern character */
280 fprintf(SF,"proc Todd(poly ch, int Dim) {\n");
281 fprintf(SF," poly ToddD = 1;\n");
282 fprintf(SF," for(i=2;i<=Dim+1;i++){ToddD=ToddD+(-dli[1]*t)^(i-1)/factorial(i);}\n");
283 fprintf(SF," ToddD = jet(1,ToddD,2*Dim);\n");
284 fprintf(SF," matrix c=coeffs(ToddD,t);\n");
285 fprintf(SF," matrix p[Dim][1] = c[2..Dim+1,1];\n");
286 fprintf(SF," for(i=1;i<=Dim;i++){\n");
287 fprintf(SF," p[i,1]=-i*p[i,1];\n");
288 fprintf(SF," for(j=1;j<=i-1;j++){\n");
289 fprintf(SF," p[i,1]=p[i,1]-p[j,1]*c[i-j+1,1];\n");
290 fprintf(SF," };\n");
291 fprintf(SF," };\n");
292 fprintf(SF," poly tmp=0;\n");
293 fprintf(SF," for(i=1;i<=Dim;i++){\n");
294 fprintf(SF," tmp = tmp+p[i,1]/factorial(i)*(-t)^i;\n");
295 fprintf(SF," };\n");
296 fprintf(SF," matrix ctmp=coeffs(tmp,dli[1]);\n");
297 fprintf(SF," matrix cch=coeffs(ch,t);\n");
298 fprintf(SF," int m=nrows(ctmp);\n");
299 fprintf(SF," if(nrows(cch) < m){m=nrows(cch)};\n");
300 fprintf(SF," tmp=0;\n");
301 fprintf(SF," for(i=0;i<=m-1;i++){\n");
302 fprintf(SF," tmp=tmp+ctmp[i+1,1]*cch[i+1,1]*factorial(i);\n");
303 fprintf(SF," }\n");
304 fprintf(SF," p=coeffs(tmp,t);\n");
305 fprintf(SF," for(i=1;i<=nrows(p)-1;i++){\n");
306 fprintf(SF," p[i+1,1]=p[i+1,1]*(-1)^(i)*factorial(i);\n");
307 fprintf(SF," }\n");
308 fprintf(SF," c[1,1]=1;\n");
309 fprintf(SF," for(i=1;i<=Dim;i++){\n");
310 fprintf(SF," c[i+1,1]=0;\n");
311 fprintf(SF," m=i;\n");
312 fprintf(SF," if(nrows(p) < i+1){m=nrows(p)-1};\n");
313 fprintf(SF," for(j=1;j<=m;j++){\n");
314 fprintf(SF," c[i+1,1]=c[i+1,1]-p[j+1,1]*c[i+1-j,1];\n");
315 fprintf(SF," };\n");
316 fprintf(SF," c[i+1,1]=c[i+1,1]/(i);\n");
317 fprintf(SF," };\n");
318 fprintf(SF," tmp=0;\n");
319 fprintf(SF," for(i=0;i<=Dim;i++){\n");
320 fprintf(SF," tmp=tmp+c[i+1,1]*t^i;\n");
321 fprintf(SF," }\n");
322 fprintf(SF," return(tmp);\n");
323 fprintf(SF,"};\n");
324
325
326 /*####### Chern classes of CY/H ################*/
327 fprintf(SF,"poly ChernUp=1;\n");
328 fprintf(SF,"for(i=1;i<=%d;i++){ChernUp=ChernUp*(1+dli[i]);}\n",p);
329 fprintf(SF,"poly ChernBottomHypersurface=1;\n");
330 fprintf(SF,"for(i=1;i<=%d;i++){ChernBottomHypersurface=ChernBottomHypersurface+(-1)^i*HySurf^i;}\n",DIM);
331 fprintf(SF,"poly ChernHySurf=ChernUp*ChernBottomHypersurface;\n");
332 for (j=0;j<DIM; j++) fprintf(SF,"poly c%dHySurf=jet(ChernHySurf,%d)-jet(ChernHySurf,%d);\n",j+1,j+1,j);
333
334
335 // PRINT HODGE and EULER
336 if(_Flag->b){
337 if(_Flag->H !=1){fprintf(SF,"\"SINGULAR -> Arithmetic genera and Euler number of the CY:\";\n");}
338 else if (_Flag->H ==1){fprintf(SF,"\"SINGULAR -> Arithmetic genera and Euler number of H:\";\n");}
339 /* Chern character and the Todd class of the tangent bundle */
340 fprintf(SF,"matrix ch[%d][1] = 1",DIM+1);
341 for(i=2;i<=DIM+1;i++){
342 fprintf(SF,",c%dHySurf",i-1);
343 };
344 fprintf(SF,";\n");
345 fprintf(SF,"matrix pp[%d][1] = -ch[2,1]",DIM);
346 for(i=2;i<=DIM;i++){
347 fprintf(SF,",-%d*ch[%d,1]",i,i+1);
348 };
349 fprintf(SF,";\n");
350 fprintf(SF,"for(i=1;i<=%d;i++){\n",DIM);
351 fprintf(SF," for(j=1;j<=i-1;j++){\n");
352 fprintf(SF," pp[i,1]=pp[i,1]-pp[j,1]*ch[i-j+1,1];\n");
353 fprintf(SF," };\n");
354 fprintf(SF,"};\n");
355 fprintf(SF,"poly tmp=%d;\n",DIM);
356 fprintf(SF,"for(i=1;i<=%d;i++){\n",DIM);
357 fprintf(SF," tmp = tmp+pp[i,1]/factorial(i)*(-t)^i;\n");
358 fprintf(SF,"};\n");
359 fprintf(SF,"poly ToddHySurf=subst(Todd(tmp,%d),t,1);\n",DIM);
360 fprintf(SF,"tmp=%d;\n",DIM);
361 fprintf(SF,"for(i=1;i<=%d;i++){\n",DIM);
362 fprintf(SF," tmp = tmp+pp[i,1]/factorial(i)*(t)^i;\n");
363 fprintf(SF,"};\n");
364 fprintf(SF,"tmp=subst(tmp,t,1);\n");
365
366
367 fprintf(SF,"\"chi_0: \",");
368 fprintf(SF,"reduce(ToddHySurf*HySurf,chow)/norm,");
369 fprintf(SF,"\",\", ""\"chi_1:\",");
370 fprintf(SF,"reduce(tmp*ToddHySurf*HySurf,chow)/norm,");
371 fprintf(SF,"\" [\",");
372 fprintf(SF,"reduce(c%dHySurf*HySurf,chow)/norm,",DIM);
373 fprintf(SF,"\"]\";\n");
374 }
375
376 /*#############################################*/
377
378 /*####### Intersection Polynomial #############*/
379 if(_Flag->i){
380 fprintf(SF,"\"SINGULAR -> intersection polynomial:\";\n");
381 fprintf(SF,"poly f=1-t*(reduce(%s%d,std(hypideal))",B,1);
382 for (j=2; j<=p-d; j++) {
383 fprintf(SF,"+reduce(%s%d,std(hypideal))",B,j);
384 }
385 fprintf(SF,");\n");
386 fprintf(SF,"poly m=jet(1,f,%d)-jet(1,f,%d);\n",2*DIM,2*DIM-2);
387 fprintf(SF,"matrix M=coef(m,%s%d",B,1);
388 for (j=2; j<=p-d; j++) {
389 fprintf(SF,"*%s%d",B,j);
390 }
391 fprintf(SF,");\n");
392 fprintf(SF,"for(i=1;i<=ncols(M);i++){\n");
393 fprintf(SF," M[2,i]=reduce(M[1,i]*HySurf,chow)/norm;\n");
394 fprintf(SF,"}\n");
395 fprintf(SF,"poly p=M[2,1]*M[1,1];\n");
396 fprintf(SF,"for(i=2;i<=ncols(M);i++){\n");
397 fprintf(SF," p=p+M[2,i]*M[1,i];\n");
398 fprintf(SF,"}\n");
399 fprintf(SF,"p;\n");
400 }
401
402
403 //PRINT Chern classes of CY/H
404 if(_Flag->H !=1 && _Flag->c){
405 fprintf(SF,"\"SINGULAR -> Chern classes of the CY-hypersurface:\";\n");
406 for(i=1;i<=DIM-1;i++){
407 fprintf(SF,"\"c%d(CY)= \",reduce(c%dHySurf,chow);\n",i,i);
408 }
409 fprintf(SF,"\"c%d(CY)= \",reduce(c%dHySurf*HySurf,chow)/norm,\"*[pt]\";\n",DIM,DIM);
410 }
411 if(_Flag->H==1 && _Flag->c){
412 fprintf(SF,"\"SINGULAR -> Chern classes of the hypersurface H:\";\n");
413 for(i=1;i<=DIM-1;i++){
414 fprintf(SF,"\"c%d(H)= \",reduce(c%dHySurf,chow);\n",i,i);
415 }
416 fprintf(SF,"\"c%d(H)= \",reduce(c%dHySurf*HySurf,chow)/norm,\"*[pt]\";\n",DIM,DIM);
417 }
418
419
420 /*####### triple intersection numbers #########*/
421 if(_Flag->t){
422 fprintf(SF,"\"SINGULAR -> triple intersection numbers:\";\n");
423 fprintf(SF,"poly f=1;\n");
424 fprintf(SF,"for(i=1;i<=%d;i++){\n",p);
425 fprintf(SF," k=1;\n");
426 fprintf(SF," for(j=1;j<=size(nonintersectingd);j++){\n");
427 fprintf(SF," if(dli[i]==nonintersectingd[j]){k=0;}\n");
428 fprintf(SF," }\n");
429 fprintf(SF," f=f-t*k*dli[i];\n");
430 fprintf(SF,"}\n");
431 fprintf(SF,"poly m=jet(1,f,%d)-jet(1,f,%d);\n",2*DIM,2*DIM-2);
432 fprintf(SF,"matrix M=coef(m,dli[%d]",1);
433 for (j=2; j<=p; j++) {
434 fprintf(SF,"*dli[%d]",j);
435 }
436 fprintf(SF,");\n");
437 fprintf(SF,"for(i=1;i<=ncols(M);i++){\n");
438 fprintf(SF," M[2,i]=reduce(M[1,i]*HySurf,chow)/norm;\n");
439 fprintf(SF,"}\n");
440 fprintf(SF,"string colon=\",\";\n");
441 fprintf(SF,"string arrow=\"->\";\n");
442 fprintf(SF,"for(i=1;i<=ncols(M);i++){\n");
443 fprintf(SF," string(M[1,i],arrow,M[2,i],colon);}\n");
444 }
445
446
447
448
449 /*####### Top. quant'ies of the divisors '#######*/
450 if(_Flag->d && DIM>1){
451 fprintf(SF,"\"SINGULAR -> topological quantities of the toric divisors:\";\n");
452 for(i=1; i<=p; i++){
453 fprintf(SF,"k=1;\n");
454 fprintf(SF,"for(j=1;j<=size(nonintersectingd);j++){\n");
455 fprintf(SF," if(dli[%d]==nonintersectingd[j]){k=0;}\n",i);
456 fprintf(SF,"}\n");
457 fprintf(SF,"if(k==1){\n");
458 fprintf(SF,"poly ChernBottomD%d=1;\n",i);
459 fprintf(SF,"for(i=1;i<=%d;i++){ChernBottomD%d=ChernBottomD%d+(-1)^i*(dli[%d])^i;}\n",DIM-1,i,i,i);
460 fprintf(SF,"poly ChernD%d=ChernUp*ChernBottomD%d*ChernBottomHypersurface;\n",i,i);
461 /*Chern classes of divisors*/
462 for (j=0;j<DIM-1; j++) fprintf(SF,"poly c%dD%d=jet(ChernD%d,%d)-jet(ChernD%d,%d);\n",j+1,i,i,j+1,i,j);
463 fprintf(SF,"matrix ch[%d][1] = 1",DIM);
464 for(j=2;j<=DIM;j++){
465 fprintf(SF,",c%dD%d",j-1,i);
466 };
467 fprintf(SF,";\n");
468 fprintf(SF,"matrix pp[%d][1] = -ch[2,1]",DIM-1);
469 for(j=2;j<=DIM-1;j++){
470 fprintf(SF,",-%d*ch[%d,1]",j,j+1);
471 };
472 fprintf(SF,";\n");
473 fprintf(SF,"for(i=1;i<=%d;i++){\n",DIM-1);
474 fprintf(SF," for(j=1;j<=i-1;j++){\n");
475 fprintf(SF," pp[i,1]=pp[i,1]-pp[j,1]*ch[i-j+1,1];\n");
476 fprintf(SF," };\n");
477 fprintf(SF,"};\n");
478 fprintf(SF,"poly tmp=%d;\n",DIM-1);
479 fprintf(SF,"for(i=1;i<=%d;i++){\n",DIM-1);
480 fprintf(SF," tmp = tmp+pp[i,1]/factorial(i)*(-t)^i;\n");
481 fprintf(SF,"};\n");
482 fprintf(SF,"poly ToddD%d=subst(Todd(tmp,%d),t,1);\n",i,DIM-1);
483
484 /*Euler chrachteristics and arithmetic genera*/
485 fprintf(SF,"poly EulerD%d=reduce(dli[%d]*c%dD%d*HySurf,chow)/norm;\n",i,i,DIM-1,i);
486 fprintf(SF,"poly EulerHD%d=reduce(ToddD%d*dli[%d]*HySurf,chow)/norm;\n",i,i,i);
487 fprintf(SF,"};\n");
488 }
489 fprintf(SF,"string EulerD;");
490 fprintf(SF,"string EulerHD;");
491 fprintf(SF,"list c1D; list eulerHD; list eulerD;");
492 for(i=1;i<=p;i++){
493 fprintf(SF,"if(defined(EulerD%d)){\n",i);
494 fprintf(SF," EulerD=EulerD+string(EulerD%d)+\" \";",i);
495 fprintf(SF," EulerHD=EulerHD+string(EulerHD%d)+\" \";",i);
496 fprintf(SF," c1D[%d]=c1D%d;",i,i);
497 fprintf(SF," eulerHD[%d]=EulerHD%d;",i,i);
498 fprintf(SF," eulerD[%d]=EulerD%d;",i,i);
499 fprintf(SF,"};\n");
500 }
501 fprintf(SF,"\"Euler characteristics:\", EulerD;\n ");
502 fprintf(SF,"\"Arithmetic genera:\", EulerHD;\n");
503 /*#############################################*/
504
505 /*####### dP conditions #######################*/
506 if(DIM == 3){
507 fprintf(SF,"kill k;\n");
508 fprintf(SF,"if(defined(f)){kill f;}\n");
509 fprintf(SF,"if(defined(p)){kill p;}\n");
510 fprintf(SF,"list dP; list N; int l=0; int p=0; int t=0; int s=0; int k=0; int u=0; int v=0;");
511 fprintf(SF,""
512 "for(i=1;i<=size(dli);i++){"
513 "if(reduce(dli[i],std(hypideal))!=0){"
514 "if(eulerHD[i]==1 && eulerD[i]>=3 && eulerD[i]<=11 && reduce(c1D[i]^2*dli[i]*HySurf,chow)/norm >=1 && reduce(c1D[i]^2*dli[i]*HySurf,chow)/norm <= 9){"
515 "for(j=1;j<=size(dli);j++){"
516 "if(dli[j] != dli[i]){"
517 "for(k=1;k<=size(dli);k++){"
518 "v++;"
519 "if(reduce(dli[i]*dli[j]*dli[k]*HySurf,chow)/norm == 0){u++;}"
520 "}"
521 "if(u < v){"
522 "if(reduce(dli[j]*dli[i]*c1D[i]*HySurf,chow)/norm <= 0){"
523 "p++;"
524 "}"
525 "} u=0; v=0;"
526 "}"
527 "}"
528 "if(p==0){"
529 "s++;"
530 "dP[s]=dli[i];"
531 "N[s]=eulerD[i]-3;"
532 "}"
533 "}"
534 "}"
535 "p=0;"
536 "t=0;" /* index for no repetitions of div. classes */
537 "} ");
538
539 fprintf(SF,"string DelPezzo;for(i=1;i<=size(dP);i++){DelPezzo=DelPezzo+string(dP[i])+\"(\"+string(N[i])+\")\"+\" \";};");
540 fprintf(SF,"list nonintDP; int g=0; int f=0; if(size(dP)>0){if(size(dP)>1){for(i=1;i<=size(dP);i++){for(j=1;j<=size(dP);j++){if(dP[j]!=dP[i]){for(k=1;k<=size(dli);k++){if(reduce(dP[i]*dP[j]*dli[k]*HySurf,chow)/norm!=0){g++;} ;};};}; if(g==0){f++; nonintDP[f]=dP[i];}; g=0;};} else {nonintDP[1]=dP[1];};};");
541 fprintf(SF,"string niDP;for(i=1;i<=size(nonintDP);i++){niDP=niDP+string(nonintDP[i])+\" \";};");
542 fprintf(SF, "\"dPs:\",size(dP),\";\",DelPezzo,\"nonint:\",size(nonintDP),\";\",niDP;");
543 }
544 /*#############################################*/
545 }
546
547 fprintf(SF,"quit;\n"); fflush(0); fclose(SF);
548
549 #if (TEST_PRINT_SINGULAR_IO)
550 CatFile(SFname);
551 #endif
552
553 strcpy(SingularCall,"Singular -q < "); strcat(SingularCall,SFname);
554 assert(strlen(SingularCall)<50+L_tmpnam);
555 if( system(SingularCall) ) {puts("Check Singular installation");exit(1);}
556 remove(SFname);
557 }
558
559
560
561