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