20 const ncomplex s2=sum[(2+n)%3]; \
21 const ncomplex s1=sum[(1+n)%3]; \
22 const ncomplex s10=s21; \
25 || ( fabs(s2.real()*heps)>=fabs(s21.real()) \
26 && fabs(s2.imag()*heps)>=fabs(s21.imag()) ) ) \
29 sump=s1+1./(1./s21-1./s10); \
31 if ( fabs(sump.real()*teps)>=fabs(sump.real()-dv.real()) \
32 && fabs(sump.imag()*teps)>=fabs(sump.imag()-dv.imag()) ) \
36 #define tswap(x,y,t) \
43 #ifndef USE_ZERO_CHORD
45 # define CIDX (DCay-2)
48 # define CIDX (DCay-1)
56 #define EVALUNDEF return std::numeric_limits<double>::signaling_NaN();
57 virtual ncomplex A(
int ep) { EVALUNDEF }
58 virtual ncomplex A(
int ep,
int i) { EVALUNDEF }
59 virtual ncomplex A(
int ep,
int i,
int j) { EVALUNDEF }
60 virtual ncomplex A(
int ep,
int i,
int j,
int k) { EVALUNDEF }
61 virtual ncomplex A(
int ep,
int i,
int j,
int k,
int l) { EVALUNDEF }
62 virtual ncomplex A(
int ep,
int i,
int j,
int k,
int l,
int m) { EVALUNDEF }
63 virtual ncomplex B(
int ep) { EVALUNDEF }
64 virtual ncomplex B(
int ep,
int i) { EVALUNDEF; }
65 virtual ncomplex B(
int ep,
int i,
int j) { EVALUNDEF }
66 virtual ncomplex B(
int ep,
int i,
int j,
int k) { EVALUNDEF }
67 virtual ncomplex C(
int ep) { EVALUNDEF }
68 virtual ncomplex C(
int ep,
int i) { EVALUNDEF }
73 inline static int ns(
int i,
int j) CONST {
74 return (i <= j ? (i - 1) + ((j - 1) * j) / 2 : (j - 1) + ((i - 1) * i) / 2);
77 inline static int nss(
int i,
int j) CONST {
78 return (i - 1) + ((j - 1) * j) / 2;
82 inline static int is(
int i,
int j) CONST {
83 return (i <= j ? i + j * (j + 1) / 2 : j + i * (i + 1) / 2);
86 inline static int is(
int i,
int j,
int k) CONST {
89 return (j <= k ? i + ti2[j] + ti3[k] : is(i, k) + ti3[j]);
91 return (i > k ? is(j, k) + ti3[i] : j + ti2[i] + ti3[k]);
95 inline static int is(
int i,
int j,
int k,
int l) CONST {
99 return (k <= l ? i + ti2[j] + ti3[k] + ti4[l]
100 : is(i, j, l) + ti4[k]);
102 return (j > l ? is(i, k, l) + ti4[j]
103 : is(i, k) + ti3[j] + ti4[l]);
108 return (i > l ? is(j, k, l) + ti4[i]
109 : is(j, k) + ti3[i] + ti4[l]);
111 return (k <= l ? j + ti2[i] + ti3[k] + ti4[l]
112 : is(i, j, l) + ti4[k]);
117 inline static int iss(
int i,
int j) CONST {
119 return i + j * (j + 1) / 2;
122 inline static int iss(
int i,
int j,
int k) CONST {
123 assert(i <= j&& j <= k);
124 return i + ti2[j] + ti3[k];
127 inline static int iss(
int i,
int j,
int k,
int l) CONST {
128 assert(i <= j&& j <= k&& k <= l);
129 return i + ti2[j] + ti3[k] + ti4[l];
132 inline static int iss(
int i,
int j,
int k,
int l,
int m) CONST {
133 assert(i <= j&& j <= k&& k <= l&& l <= m);
134 return i + ti2[j] + ti3[k] + ti4[l] + ti5[m];
137 inline static double getmeps()
143 static int im3(
int i,
int j,
int k) CONST;
144 static int im2(
int i,
int j) CONST;
145 static int signM3ud(
int i,
int j,
int k,
int l,
int m,
int n) CONST;
146 static int signM2ud(
int i,
int j,
int l,
int m) CONST;
149 static void freeidxM3(
int set[],
int free[]);
151 static void Rescale(
double factor);
154 static const unsigned char ti2[8];
155 static const unsigned char ti3[8];
156 static const unsigned char ti4[8];
157 static const unsigned char ti5[8];
160 static const unsigned char idxtbl[64];
162 static const double teps;
163 static const double heps;
165 static const double ceps;
167 static const double deps1;
168 static const double deps2;
169 static const double deps3;
171 static const double seps1;
172 static const double seps2;
174 static const double epsir1;
175 static const double epsir2;
187 inline double Kay(
int i,
int j) PURE {
190 return j == 0 ? 0 : 1;
192 return j == 0 ? 1 : Cay[ns(i, j)];
198 static const int DCay = N + 1;
199 double Cay[(DCay - 1) * (DCay) / 2];
209 ncomplex evalE(
int ep);
210 ncomplex evalE(
int ep,
int i);
211 ncomplex evalE(
int ep,
int i,
int j);
212 ncomplex evalE(
int ep,
int i,
int j,
int k);
213 ncomplex evalE(
int ep,
int i,
int j,
int k,
int l);
214 ncomplex evalE(
int ep,
int i,
int j,
int k,
int l,
int m);
216 #ifdef USE_GOLEM_MODE
217 #ifdef USE_GOLEM_MODE_6
219 #define ix(i) i<psix ? i : i-1
223 virtual ncomplex A(
int ep) {
return evalE(ep); }
224 virtual ncomplex A(
int ep,
int i) {
return evalE(ep, ix(i)); }
225 virtual ncomplex A(
int ep,
int i,
int j) {
return evalE(ep, ix(i), ix(j)); }
226 virtual ncomplex A(
int ep,
int i,
int j,
int k) {
return evalE(ep, ix(i), ix(j), ix(k)); }
227 virtual ncomplex A(
int ep,
int i,
int j,
int k,
int l) {
return evalE(ep, ix(i), ix(j), ix(k), ix(l)); }
228 virtual ncomplex A(
int ep,
int i,
int j,
int k,
int l,
int m) {
return evalE(ep, ix(i), ix(j), ix(k), ix(l), ix(m)); }
229 virtual ncomplex B(
int ep) {
return evalE(ep, 0, 0); }
230 virtual ncomplex B(
int ep,
int i) {
return evalE(ep, 0, 0, ix(i)); }
231 virtual ncomplex B(
int ep,
int i,
int j) {
return evalE(ep, 0, 0, ix(i), ix(j)); }
232 virtual ncomplex B(
int ep,
int i,
int j,
int k) {
return evalE(ep, 0, 0, ix(i), ix(j), ix(k)); }
233 virtual ncomplex C(
int ep) {
return evalE(ep, 0, 0, 0, 0); }
234 virtual ncomplex C(
int ep,
int i) {
return evalE(ep, 0, 0, 0, 0, ix(i)); }
238 ncomplex I4s(
int ep,
int s);
240 ncomplex I3st(
int ep,
int s,
int t);
241 ncomplex I4Ds(
int ep,
int s);
242 ncomplex I4Dsi(
int ep,
int s,
int i);
244 ncomplex I2stu(
int ep,
int s,
int t,
int u);
245 ncomplex I3Dst(
int ep,
int s,
int t);
246 ncomplex I4D2s(
int ep,
int s);
248 ncomplex I4D2si(
int ep,
int s,
int i);
249 ncomplex I3Dsti(
int ep,
int s,
int t,
int i);
250 ncomplex I3D2st(
int ep,
int s,
int t);
251 ncomplex I4D3s(
int ep,
int s);
252 ncomplex I4D2sij(
int ep,
int s,
int i,
int j);
254 ncomplex I2Dstu(
int ep,
int s,
int t,
int u);
255 ncomplex I3D2sti(
int ep,
int s,
int t,
int i);
256 ncomplex I4D3si(
int ep,
int s,
int i);
257 ncomplex I4D3sij(
int ep,
int s,
int i,
int j);
259 ncomplex I2Dstui(
int ep,
int s,
int t,
int u,
int i);
260 ncomplex I3D2stij(
int ep,
int s,
int t,
int i,
int j);
261 ncomplex I4D3sijk(
int ep,
int s,
int i,
int j,
int k);
263 ncomplex I4D4s(
int ep,
int s);
264 ncomplex I4D4si(
int ep,
int s,
int i);
265 ncomplex I3D3sti(
int ep,
int s,
int t,
int i);
266 ncomplex I4D4sij(
int ep,
int s,
int i,
int j);
267 ncomplex I2D2stui(
int ep,
int s,
int t,
int u,
int i);
268 ncomplex I3D3stij(
int ep,
int s,
int t,
int i,
int j);
269 ncomplex I4D4sijk(
int ep,
int s,
int i,
int j,
int k);
270 ncomplex I2D2stuij(
int ep,
int s,
int t,
int u,
int i,
int j);
271 ncomplex I3D3stijk(
int ep,
int s,
int t,
int i,
int j,
int k);
272 ncomplex I4D4sijkl(
int ep,
int s,
int i,
int j,
int k,
int l);
275 ncomplex I2D2stu(
int ep,
int s,
int t,
int u);
276 ncomplex I3D3st(
int ep,
int s,
int t);
277 ncomplex I2D3stu(
int ep,
int s,
int t,
int u);
278 ncomplex I3D4st(
int ep,
int s,
int t);
279 ncomplex I2D4stu(
int ep,
int s,
int t,
int u);
280 ncomplex I3D5st(
int ep,
int s,
int t);
281 ncomplex I2D5stu(
int ep,
int s,
int t,
int u);
282 ncomplex I3D6st(
int ep,
int s,
int t);
283 ncomplex I2D6stu(
int ep,
int s,
int t,
int u);
284 ncomplex I3D7st(
int ep,
int s,
int t);
288 double M1(
int i,
int l) PURE;
289 double M2(
int i,
int j,
int l,
int m) PURE;
290 double M3(
int i,
int j,
int k,
int l,
int m,
int n) PURE;
292 double gram3(
double p1,
double p2,
double p3) PURE;
304 double pmaxS4[DCay - 1];
314 enum EvalM {E_None = 0,
317 E_I4D4sijk = E_I4D4sijkl + 3,
318 E_I3D3stij = E_I4D4sijk + 3,
319 E_I4D4sij = E_I3D3stij + 3,
320 E_I3D3sti = E_I4D4sij + 3,
321 E_I4D4si = E_I3D3sti + 3,
322 E_I4D4s = E_I4D4si + 3,
323 E_I2D6stu = E_I4D4s + 3,
324 E_I3D7st = E_I2D6stu + 3,
325 E_I2D5stu = E_I3D7st + 3,
326 E_I3D6st = E_I2D5stu + 3,
327 E_I2D4stu = E_I3D6st + 3,
328 E_I3D5st = E_I2D4stu + 3,
329 E_I2D3stu = E_I3D5st + 3,
330 E_I3D4st = E_I2D3stu + 3,
331 E_I3D3stijk = E_I3D4st + 3,
332 E_I2D2stui = E_I3D3stijk + 3,
333 E_I2D2stuij = E_I2D2stui + 3,
334 E_I2D2stu = E_I2D2stuij + 3,
335 E_I3D3st = E_I2D2stu + 3,
336 E_I4D3sijk = E_I3D3st + 3,
337 E_I3D2stij = E_I4D3sijk + 3,
338 E_I2Dstui = E_I3D2stij + 3,
339 E_I3D2st = E_I2Dstui + 2,
340 E_I4D3s = E_I3D2st + 3,
341 E_I4D3sij = E_I4D3s + 3,
342 E_I4D3si = E_I4D3sij + 3,
343 E_I3D2sti = E_I4D3si + 3,
344 E_I2Dstu = E_I3D2sti + 3,
345 E_I3Dsti = E_I2Dstu + 3,
346 E_I4D2sij = E_I3Dsti + 3,
347 E_I2stu = E_I4D2sij + 3,
348 E_I4D2s = E_I2stu + 3,
349 E_I4D2si = E_I4D2s + 3,
350 E_I3Dst = E_I4D2si + 3,
351 E_I4Dsi = E_I3Dst + 3,
352 E_I4Ds = E_I4Dsi + 3,
358 std::bitset<E_LEN> fEval;
361 static const int DM3 = 20;
362 double pM3[DM3 * (DM3 + 1) / 2];
363 static const int DM2 = 15;
364 double pM2[DM2 * (DM2 + 1) / 2];
365 static const int DM1 = 6;
366 double pM1[DM1 * (DM1 + 1) / 2];
369 ncomplex pI4s[3][DCay - 1];
371 ncomplex pI3st[3][10];
372 ncomplex pI4Ds[1][DCay - 1];
373 ncomplex pI4Dsi[3][CIDX][DCay - 1];
375 ncomplex pI2stu[2][10];
376 ncomplex pI3Dst[1][10];
377 ncomplex pI4D2s[1][DCay - 1];
379 ncomplex pI4D2si[1][CIDX][DCay - 1];
380 ncomplex pI3Dsti[3][CIDX][10];
381 ncomplex pI4D2sij[3][CIDX * (CIDX + 1) / 2][DCay - 1];
383 ncomplex pI2Dstu[2][10];
384 ncomplex pI3D2st[2][10];
385 ncomplex pI4D3s[2][DCay - 1];
386 ncomplex pI3D2sti[2][CIDX][10];
387 ncomplex pI4D3si[2][CIDX][DCay - 1];
388 ncomplex pI4D3sij[1][CIDX * (CIDX + 1) / 2][DCay - 1];
390 ncomplex pI2Dstui[2][CIDX][DCay - 1];
391 ncomplex pI3D2stij[3][CIDX * (CIDX + 1) / 2][10];
392 ncomplex pI4D3sijk[3][CIDX * (CIDX + 1) * (CIDX + 2) / 6][DCay - 1];
394 ncomplex pI2D2stu[2][10];
395 ncomplex pI3D3st[2][10];
396 ncomplex pI4D4s[2][DCay - 1];
397 ncomplex pI4D4si[2][CIDX][DCay - 1];
398 ncomplex pI3D3sti[2][CIDX][10];
399 ncomplex pI4D4sij[2][CIDX * (CIDX + 1) / 2][DCay - 1];
400 ncomplex pI2D2stui[2][CIDX][DCay - 1];
401 ncomplex pI3D3stij[2][CIDX * (CIDX + 1) / 2][10];
402 ncomplex pI4D4sijk[2][CIDX * (CIDX + 1) * (CIDX + 2) / 6][DCay - 1];
403 ncomplex pI2D2stuij[2][CIDX][DCay - 1][2];
404 ncomplex pI3D3stijk[3][CIDX * (CIDX + 1) * (CIDX + 2) / 6][10];
405 ncomplex pI4D4sijkl[3][CIDX * (CIDX + 1) * (CIDX + 2) * (CIDX + 3) / 24][DCay - 1];
409 ncomplex pI2D3stu[2][10];
410 ncomplex pI3D4st[2][10];
411 ncomplex pI2D4stu[2][10];
412 ncomplex pI3D5st[2][10];
413 ncomplex pI2D5stu[2][10];
414 ncomplex pI3D6st[2][10];
415 ncomplex pI2D6stu[2][10];
416 ncomplex pI3D7st[2][10];
429 void I4sEval(
int ep);
431 void I3stEval(
int ep);
432 void I4DsEval(
int ep);
433 void I4DsiEval(
int ep);
435 void I2stuEval(
int ep);
436 void I3DstEval(
int ep);
437 void I4D2sEval(
int ep);
439 void I4D2siEval(
int ep);
440 void I3DstiEval(
int ep);
441 void I3D2stEval(
int ep);
442 void I4D3sEval(
int ep);
443 void I4D2sijEval(
int ep);
445 void I2DstuEval(
int idx,
int ep,
int s,
int t,
int u,
int m,
int n,
double qsq);
446 void I3D2stiEval(
int ep);
447 void I4D3siEval(
int ep);
448 void I4D3sijEval(
int ep);
450 void I2DstuiEval(
int ep,
int s,
int t,
int u,
int i,
int ip,
double qsq);
451 void I3D2stijEval(
int ep);
452 void I4D3sijkEval(
int ep);
454 void I4D4sEval(
int ep);
455 void I4D4siEval(
int ep);
456 void I3D3stiEval(
int ep);
457 void I4D4sijEval(
int ep);
458 void I2D2stuiEval(
int ep,
int s,
int t,
int u,
int i,
int ip,
double qsq);
459 void I3D3stijEval(
int ep);
460 void I4D4sijkEval(
int ep);
461 void I2D2stuijEval(
int ep,
int s,
int t,
int u,
int i,
int ip,
double qsq);
462 void I3D3stijkEval(
int ep);
463 void I4D4sijklEval(
int ep);
466 void I2D2stuEval(
int idx,
int ep,
int s,
int t,
int u,
int m,
int n,
double qsq);
467 void I3D3stEval(
int ep);
468 void I2D3stuEval(
int idx,
int ep,
int s,
int t,
int u,
int m,
int n,
double qsq);
469 void I3D4stEval(
int ep);
470 void I2D4stuEval(
int idx,
int ep,
int s,
int t,
int u,
int m,
int n,
double qsq);
471 void I3D5stEval(
int ep);
472 void I2D5stuEval(
int idx,
int ep,
int s,
int t,
int u,
int m,
int n,
double qsq);
473 void I3D6stEval(
int ep);
474 void I2D6stuEval(
int idx,
int ep,
int s,
int t,
int u,
int m,
int n,
double qsq);
475 void I3D7stEval(
int ep);
478 ncomplex I2mDstu(
int ep,
int s,
int t,
int u,
int m,
int n);
479 ncomplex I2stui(
int ep,
int s,
int t,
int u,
int i,
int ip);
481 double M4ii(
int u,
int v,
int i) PURE;
482 double M4ui(
int u,
int v,
int i) PURE;
483 double M4vi(
int u,
int v,
int i) PURE;
484 double M4uu(
int u,
int v,
int i) PURE;
485 double M4vu(
int u,
int v,
int i) PURE;
486 double M4vv(
int u,
int v,
int i) PURE;
498 ncomplex evalD(
int ep);
499 ncomplex evalD(
int ep,
int i);
500 ncomplex evalD(
int ep,
int i,
int j);
501 ncomplex evalD(
int ep,
int i,
int j,
int k);
502 ncomplex evalD(
int ep,
int i,
int j,
int k,
int l);
504 #ifdef USE_GOLEM_MODE
505 virtual ncomplex A(
int ep);
506 virtual ncomplex A(
int ep,
int i);
507 virtual ncomplex A(
int ep,
int i,
int j);
508 virtual ncomplex A(
int ep,
int i,
int j,
int k);
509 virtual ncomplex A(
int ep,
int i,
int j,
int k,
int l);
510 virtual ncomplex B(
int ep);
511 virtual ncomplex B(
int ep,
int i);
512 virtual ncomplex B(
int ep,
int i,
int j);
513 virtual ncomplex C(
int ep);
531 return Ptr(
new Minor3(k, mptr5, s, t, is));
534 ncomplex evalC(
int ep);
535 ncomplex evalC(
int ep,
int i);
536 ncomplex evalC(
int ep,
int i,
int j);
537 ncomplex evalC(
int ep,
int i,
int j,
int k);
539 #ifdef USE_GOLEM_MODE
540 virtual ncomplex A(
int ep);
541 virtual ncomplex A(
int ep,
int i);
542 virtual ncomplex A(
int ep,
int i,
int j);
543 virtual ncomplex A(
int ep,
int i,
int j,
int k);
544 virtual ncomplex B(
int ep);
545 virtual ncomplex B(
int ep,
int i);
555 const int ps, pt, offs;
564 return Ptr(
new Minor2(k, mptr5, s, t, u, is));
567 ncomplex evalB(
int ep);
568 ncomplex evalB(
int ep,
int i);
569 ncomplex evalB(
int ep,
int i,
int j);
571 #ifdef USE_GOLEM_MODE
572 virtual ncomplex A(
int ep);
573 virtual ncomplex A(
int ep,
int i);
574 virtual ncomplex A(
int ep,
int i,
int j);
575 virtual ncomplex B(
int ep);
585 const int ps, pt, pu, offs;
598 int MinorBase::im3(
int i,
int j,
int k)
600 return idxtbl[(1 << i) | (1 << j) | (1 << k)];
605 int MinorBase::im2(
int i,
int j)
607 return idxtbl[(1 << i) | (1 << j)];
612 int MinorBase::signM3ud(
int i,
int j,
int k,
int l,
int m,
int n)
614 int t = (j - i) * (k - j) * (k - i) * (m - l) * (n - m) * (n - l);
615 return t == 0 ? 0 : 2 * (t >> (
sizeof(int) * 8 - 1)) + 1;
620 int MinorBase::signM2ud(
int i,
int j,
int l,
int m)
622 int t = (j - i) * (m - l);
623 return t == 0 ? 0 : 2 * (t >> (
sizeof(int) * 8 - 1)) + 1;