void PolynomialFinderBase::solve (int n) { assert (n <= m_maxN); double c0,c1; int i,j,k; k = (n-1)/2; // // form vector of 'a' constants // if (n & 1) { // odd for (i=0;i<=k;i++) { m_a[i] = (2.0*i+1.0)/(m_sqrt2()*(k+1.0)); } } // even else { for (i=0;i<k+1;i++) { m_a[i] = 0.0; } if (k & 1) { for (i=1;i<=k;i+=2) { m_a[i] = (2*i+1)/sqrt(double((k+1)*(k+2))); } } else { for (i=0;i<=k;i+=2) { m_a[i] = (2*i+1)/sqrt(double((k+1)*(k+2))); } } } for (i=0;i<=n;i++){ m_s[i] = 0.0; m_w[i] = 0.0; } // // form s[] = sum of a[i]*P[i] // m_s[0] = m_a[0]; m_s[1] = m_a[1]; for (i=2;i<=k;i++) { legendre(m_p,i); for (j=0;j<=i;j++) { m_s[j] += m_a[i]*m_p[j]; } } // // form v[] = square of s[] // for (i=0;i<=2*k+2;i++) { m_v[i] = 0.0; } for (i=0;i<=k;i++) { for (j=0;j<=k;j++) { m_v[i+j] += m_s[i]*m_s[j]; } } // // modify integrand for even 'n' // m_v[2*k+1] = 0.0; if ((n & 1) == 0) { for (i=n;i>=0;i--) { m_v[i+1] += m_v[i]; } } // // form integral of v[] // for (i=n+1;i>=0;i--) { m_v[i+1] = m_v[i]/(double)(i+1.0); } m_v[0] = 0.0; // // clear s[] for use in computing definite integral // for (i=0;i<(n+2);i++){ m_s[i] = 0.0; } m_s[0] = -1.0; m_s[1] = 2.0; // // calculate definite integral // for (i=1;i<=n;i++) { if (i > 1) { c0 = -m_s[0]; for (j=1;j<i+1;j++) { c1 = -m_s[j] + 2.0*m_s[j-1]; m_s[j-1] = c0; c0 = c1; } c1 = 2.0*m_s[i]; m_s[i] = c0; m_s[i+1] = c1; } for (j=i;j>0;j--) { m_w[j] += (m_v[i]*m_s[j]); } } if ((n & 1) == 0) m_w[1] = 0.0; }
static void tst3() { enable_trace("nlsat_interval"); unsynch_mpq_manager qm; anum_manager am(qm); small_object_allocator allocator; nlsat::interval_set_manager ism(am, allocator); scoped_anum sqrt2(am), m_sqrt2(am), two(am), m_two(am), three(am), one(am), zero(am); am.set(two, 2); am.set(m_two, -2); am.set(one, 1); am.root(two, 2, sqrt2); am.set(m_sqrt2, sqrt2); am.neg(m_sqrt2); am.set(three, 3); nlsat::literal p1(1, false); nlsat::literal p2(2, false); nlsat::literal p3(3, false); nlsat::literal p4(4, false); nlsat::literal np2(2, true); nlsat::interval_set_ref s1(ism), s2(ism), s3(ism), s4(ism); s1 = ism.mk_empty(); std::cout << "s1: " << s1 << "\n"; s2 = ism.mk(true, true, zero, false, false, sqrt2, np2); std::cout << "s2: " << s2 << "\n"; s3 = ism.mk(false, false, zero, false, false, two, p1); std::cout << "s3: " << s3 << "\n"; s4 = ism.mk_union(s2, s3); std::cout << "s4: " << s4 << "\n"; // Case // s1: [ ... ] // s2: [ ... ] s1 = ism.mk(false, false, zero, false, false, two, p1); s2 = ism.mk(false, false, zero, false, false, two, p2); tst_interval(s1, s2, 1); // Case // s1: [ ... ] // s2: [ ... ] s1 = ism.mk(false, false, zero, false, false, two, p1); s2 = ism.mk(false, false, m_sqrt2, false, false, one, p2); s3 = ism.mk_union(s1, s2); tst_interval(s1, s2, 2); // Case // s1: [ ... ] // s2: [ ... ] s1 = ism.mk(false, false, m_sqrt2, false, false, one, p1); s2 = ism.mk(false, false, zero, false, false, two, p2); tst_interval(s1, s2, 2); // Case // s1: [ ... ] // s2: [ ... ] s1 = ism.mk(false, false, m_sqrt2, false, false, one, p1); s2 = ism.mk(false, false, two, false, false, three, p2); tst_interval(s1, s2, 2); // Case // s1: [ ... ] // s2: [ ... ] s1 = ism.mk(false, false, m_sqrt2, false, false, three, p1); s2 = ism.mk(false, false, zero, false, false, two, p2); tst_interval(s1, s2, 1); // Case // s1: [ ... ] // s2: [ ... ] [ ... ] s1 = ism.mk(false, false, m_two, false, false, two, p1); s2 = ism.mk(false, false, m_sqrt2, false, false, zero, p2); s3 = ism.mk(false, false, one, false, false, three, p2); s2 = ism.mk_union(s2, s3); tst_interval(s1, s2, 2); // Case // s1: [ ... ] // s2: [ ... ] s1 = ism.mk(false, false, m_two, false, false, two, p1); s2 = ism.mk(false, false, two, false, false, three, p2); tst_interval(s1, s2, 2); s2 = ism.mk(true, false, two, false, false, three, p2); tst_interval(s1, s2, 2); s2 = ism.mk(true, false, two, false, false, three, p1); tst_interval(s1, s2, 1); s1 = ism.mk(false, false, m_two, true, false, two, p1); tst_interval(s1, s2, 2); s1 = ism.mk(false, false, two, false, false, two, p1); s2 = ism.mk(false, false, two, false, false, three, p2); tst_interval(s1, s2, 1); // Case // s1: [ ... ] [ ... ] // s2: [ .. ] [ ... ] [ ... ] s1 = ism.mk(false, false, m_two, false, false, zero, p1); s3 = ism.mk(false, false, one, false, false, three, p1); s1 = ism.mk_union(s1, s3); s2 = ism.mk(true, true, zero, false, false, m_sqrt2, p2); tst_interval(s1, s2, 3); s3 = ism.mk(false, false, one, false, false, sqrt2, p2); s2 = ism.mk_union(s2, s3); s3 = ism.mk(false, false, two, true, true, zero, p2); s2 = ism.mk_union(s2, s3); tst_interval(s1, s2, 4); // Case s1 = ism.mk(true, true, zero, false, false, one, p1); s2 = ism.mk(true, false, one, true, true, zero, p2); tst_interval(s1, s2, 2); s2 = ism.mk(true, false, one, false, false, two, p2); s3 = ism.mk(false, false, two, true, true, zero, p1); s2 = ism.mk_union(s2, s3); tst_interval(s1, s2, 3); }