mirror of
https://github.com/Z3Prover/z3
synced 2025-04-08 10:25:18 +00:00
resource-limit related fixes in src/test
This commit is contained in:
parent
e91b1e1da4
commit
c2ab9b72dc
|
@ -19,35 +19,37 @@ Notes:
|
|||
#include"algebraic_numbers.h"
|
||||
#include"polynomial_var2value.h"
|
||||
#include"mpbq.h"
|
||||
#include"rlimit.h"
|
||||
|
||||
static void display_anums(std::ostream & out, scoped_anum_vector const & rs) {
|
||||
out << "numbers in decimal:\n";
|
||||
algebraic_numbers::manager & m = rs.m();
|
||||
for (unsigned i = 0; i < rs.size(); i++) {
|
||||
m.display_decimal(out, rs[i], 10);
|
||||
m.display_decimal(out, rs[i], 10);
|
||||
out << "\n";
|
||||
}
|
||||
out << "numbers as root objects\n";
|
||||
for (unsigned i = 0; i < rs.size(); i++) {
|
||||
m.display_root(out, rs[i]);
|
||||
m.display_root(out, rs[i]);
|
||||
out << "\n";
|
||||
}
|
||||
}
|
||||
out << "numbers as intervals\n";
|
||||
for (unsigned i = 0; i < rs.size(); i++) {
|
||||
m.display_interval(out, rs[i]);
|
||||
m.display_interval(out, rs[i]);
|
||||
out << "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void tst1() {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
polynomial_ref p(m);
|
||||
p = 3*x - 2;
|
||||
|
||||
algebraic_numbers::manager am(nm);
|
||||
algebraic_numbers::manager am(rl, nm);
|
||||
scoped_anum_vector rs1(am);
|
||||
std::cout << "p: " << p << "\n";
|
||||
am.isolate_roots(p, rs1);
|
||||
|
@ -69,16 +71,16 @@ static void tst1() {
|
|||
nm.set(q, 1, 3);
|
||||
scoped_anum aq(am);
|
||||
am.set(aq, q); // create algebraic number representing 1/3
|
||||
|
||||
|
||||
am.add(sqrt2, aq, aq);
|
||||
std::cout << "sqrt(2) + 1/3: ";
|
||||
am.display_decimal(std::cout, aq, 10); std::cout << " "; am.display_interval(std::cout, aq);
|
||||
std::cout << "sqrt(2) + 1/3: ";
|
||||
am.display_decimal(std::cout, aq, 10); std::cout << " "; am.display_interval(std::cout, aq);
|
||||
std::cout << " "; am.display_root(std::cout, aq); std::cout << "\n";
|
||||
|
||||
am.set(aq, q);
|
||||
am.set(aq, q);
|
||||
am.add(rs1[0], aq, aq);
|
||||
std::cout << "-sqrt(2) + 1/3: ";
|
||||
am.display_decimal(std::cout, aq, 10); std::cout << " "; am.display_interval(std::cout, aq);
|
||||
std::cout << "-sqrt(2) + 1/3: ";
|
||||
am.display_decimal(std::cout, aq, 10); std::cout << " "; am.display_interval(std::cout, aq);
|
||||
std::cout << " "; am.display_root(std::cout, aq); std::cout << "\n";
|
||||
|
||||
p = ((x^5) - x - 1)*(x-1)*(x-2);
|
||||
|
@ -92,7 +94,7 @@ static void tst1() {
|
|||
am.set(gauss, rs1[1]);
|
||||
|
||||
std::cout << "compare(" << sqrt2 << ", " << gauss << "): " << am.compare(sqrt2, gauss) << "\n";
|
||||
|
||||
|
||||
statistics st;
|
||||
am.collect_statistics(st);
|
||||
st.display_smt2(std::cout);
|
||||
|
@ -103,7 +105,7 @@ static void tst1() {
|
|||
am.isolate_roots(p, rs1);
|
||||
display_anums(std::cout, rs1);
|
||||
SASSERT(rs1.size() == 4);
|
||||
|
||||
|
||||
scoped_anum hidden_sqrt2(am);
|
||||
am.set(hidden_sqrt2, rs1[2]);
|
||||
|
||||
|
@ -116,7 +118,7 @@ static void tst1() {
|
|||
|
||||
SASSERT(is_int(power(sqrt2, 4)));
|
||||
SASSERT(power(sqrt2, 4) == 4);
|
||||
|
||||
|
||||
scoped_anum sqrt2_gauss(am);
|
||||
am.add(sqrt2, gauss, sqrt2_gauss);
|
||||
std::cout << "sqrt2 + gauss: " << sqrt2_gauss << " "; am.display_root(std::cout, sqrt2_gauss); std::cout << "\n";
|
||||
|
@ -151,22 +153,22 @@ static void tst1() {
|
|||
am.mul(tmp, sqrt2, tmp);
|
||||
std::cout << "sqrt(2)*4*(1/sqrt2): " << tmp << " " << root_obj_pp(tmp) << "\n";
|
||||
std::cout << "is_int(sqrt(2)*4*(1/sqrt2)): " << am.is_int(tmp) << ", after is-int: " << tmp << "\n";
|
||||
|
||||
|
||||
p = (998*x - 1414)*((x^2) - 15);
|
||||
std::cout << "p: " << p << "\n";
|
||||
rs1.reset();
|
||||
am.isolate_roots(p, rs1);
|
||||
|
||||
|
||||
std::cout << "is-rational(sqrt2): " << am.is_rational(sqrt2) << "\n";
|
||||
|
||||
|
||||
scoped_anum qr(am);
|
||||
am.set(qr, rs1[1]);
|
||||
|
||||
|
||||
std::cout << "qr: " << root_obj_pp(qr);
|
||||
std::cout << ", is-rational: " << am.is_rational(qr) << ", val: " << root_obj_pp(qr) << "\n";
|
||||
|
||||
return;
|
||||
|
||||
|
||||
std::cout << "compare(" << sqrt2 << ", " << gauss << "): " << am.compare(sqrt2, gauss) << "\n";
|
||||
|
||||
p = (x^16) - 136*(x^14) + 6476*(x^12) - 141912*(x^10) + 1513334*(x^8) - 7453176*(x^6) + 13950764*(x^4) - 5596840*(x^2) + 46225;
|
||||
|
@ -216,25 +218,26 @@ void tst_mpbq_root() {
|
|||
mpbq_manager bqm(qm);
|
||||
// scoped_mpbq q(bqm);
|
||||
// q.set(q1, 1.4142135 , 7);
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void tst_wilkinson() {
|
||||
// Test Wilkinson Polynomial
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
polynomial_ref p(m);
|
||||
for (int i = 1; i <= 20; i++) {
|
||||
if (i > 1)
|
||||
if (i > 1)
|
||||
p = p*(x - i);
|
||||
else
|
||||
else
|
||||
p = (x - i);
|
||||
}
|
||||
std::cout << "Wilkinson's polynomial: " << p << "\n";
|
||||
|
||||
algebraic_numbers::manager am(nm);
|
||||
algebraic_numbers::manager am(rl, nm);
|
||||
scoped_anum_vector rs1(am);
|
||||
std::cout << "p: " << p << "\n";
|
||||
am.isolate_roots(p, rs1);
|
||||
|
@ -246,9 +249,10 @@ static void tst_wilkinson() {
|
|||
}
|
||||
|
||||
static void tst_dejan() {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager qm;
|
||||
algebraic_numbers::manager am(qm);
|
||||
|
||||
algebraic_numbers::manager am(rl, qm);
|
||||
|
||||
scoped_anum two101(am);
|
||||
am.set(two101, 2);
|
||||
am.root(two101, 11, two101);
|
||||
|
@ -256,7 +260,7 @@ static void tst_dejan() {
|
|||
scoped_anum two103(am);
|
||||
am.set(two103, 2);
|
||||
am.root(two103, 7, two103);
|
||||
|
||||
|
||||
std::cout << "two101: " << two101 << " " << root_obj_pp(two101) << std::endl;
|
||||
std::cout << "two103: " << two103 << " " << root_obj_pp(two103) << std::endl;
|
||||
|
||||
|
@ -332,9 +336,10 @@ static void tst_eval_sign(polynomial_ref const & p, anum_manager & am,
|
|||
|
||||
static void tst_eval_sign() {
|
||||
enable_trace("anum_eval_sign");
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager qm;
|
||||
polynomial::manager pm(qm);
|
||||
algebraic_numbers::manager am(qm);
|
||||
polynomial::manager pm(rl, qm);
|
||||
algebraic_numbers::manager am(rl, qm);
|
||||
polynomial_ref x0(pm);
|
||||
polynomial_ref x1(pm);
|
||||
polynomial_ref x2(pm);
|
||||
|
@ -351,7 +356,7 @@ static void tst_eval_sign() {
|
|||
am.set(v1, 1);
|
||||
am.set(v0, -3);
|
||||
tst_eval_sign(p, am, 0, v0, 1, v1, 2, v2, -1);
|
||||
|
||||
|
||||
am.set(v0, 2);
|
||||
am.root(v0, 2, v0);
|
||||
am.set(v1, 0);
|
||||
|
@ -412,9 +417,10 @@ static void tst_isolate_roots(polynomial_ref const & p, anum_manager & am,
|
|||
|
||||
static void tst_isolate_roots() {
|
||||
enable_trace("isolate_roots");
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager qm;
|
||||
polynomial::manager pm(qm);
|
||||
algebraic_numbers::manager am(qm);
|
||||
polynomial::manager pm(rl, qm);
|
||||
algebraic_numbers::manager am(rl, qm);
|
||||
polynomial_ref x0(pm);
|
||||
polynomial_ref x1(pm);
|
||||
polynomial_ref x2(pm);
|
||||
|
@ -423,7 +429,7 @@ static void tst_isolate_roots() {
|
|||
x1 = pm.mk_polynomial(pm.mk_var());
|
||||
x2 = pm.mk_polynomial(pm.mk_var());
|
||||
x3 = pm.mk_polynomial(pm.mk_var());
|
||||
|
||||
|
||||
polynomial_ref p(pm);
|
||||
p = x3*x1 + 1;
|
||||
|
||||
|
@ -432,44 +438,44 @@ static void tst_isolate_roots() {
|
|||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
am.set(v1, 1);
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
am.set(v1, 2);
|
||||
am.root(v1, 2, v1);
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
p = (x1 + x2)*x3 + 1;
|
||||
am.set(v2, v1);
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
p = (x1 + x2)*x3 + x1*x2 + 2;
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
p = (x1 + x2)*(x3^3) + x1*x2 + 2;
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
p = (x1 + x2)*(x3^2) - x1*x2 - 2;
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
p = x0*(x1 + x2)*(x3^2) - x0*x1*x2 - 2;
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
p = (x1 - x2)*x3 + x1*x2 - 2;
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
p = (x1 - x2)*(x3^3) + x1*x2 - 2;
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
p = (x3 - x0)*(x3 - x0 - x1);
|
||||
am.set(v0, 2);
|
||||
am.root(v0, 2, v0); // x2 -> sqrt(2)
|
||||
am.set(v1, 3);
|
||||
am.root(v1, 2, v1); // x1 -> sqrt(3)
|
||||
am.reset(v2);
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
p = (x3 - x0)*((x3 - x0 - x1)^2);
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
||||
p = (x3 - x0)*(x3 - 2)*((x3 - 1)^2)*(x3 - x1);
|
||||
tst_isolate_roots(p, am, 0, v0, 1, v1, 2, v2);
|
||||
|
@ -485,7 +491,8 @@ static void pp(polynomial_ref const & p, polynomial::var x) {
|
|||
|
||||
static void ex1() {
|
||||
unsynch_mpq_manager qm;
|
||||
polynomial::manager pm(qm);
|
||||
reslimit rl;
|
||||
polynomial::manager pm(rl, qm);
|
||||
polynomial_ref x(pm);
|
||||
polynomial_ref a(pm);
|
||||
polynomial_ref b(pm);
|
||||
|
@ -508,7 +515,7 @@ static void ex1() {
|
|||
std::cout << "d: " << d << "\n";
|
||||
std::cout << "h3: "; pp(h3, 0); std::cout << "\n";
|
||||
|
||||
algebraic_numbers::manager am(qm);
|
||||
algebraic_numbers::manager am(rl, qm);
|
||||
scoped_anum v1(am), v2(am);
|
||||
am.set(v1, 2);
|
||||
am.root(v1, 3, v1);
|
||||
|
@ -542,8 +549,9 @@ static void ex1() {
|
|||
}
|
||||
|
||||
static void tst_root() {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager qm;
|
||||
algebraic_numbers::manager am(qm);
|
||||
algebraic_numbers::manager am(rl, qm);
|
||||
scoped_anum v1(am), v2(am);
|
||||
am.set(v1, 4);
|
||||
am.root(v1, 2, v2);
|
||||
|
@ -551,7 +559,7 @@ static void tst_root() {
|
|||
am.set(v1, 4);
|
||||
am.root(v1, 4, v2);
|
||||
std::cout << "root: " << root_obj_pp(v2) << "\n";
|
||||
|
||||
|
||||
}
|
||||
|
||||
void tst_algebraic() {
|
||||
|
|
|
@ -12,6 +12,7 @@ Copyright (c) 2015 Microsoft Corporation
|
|||
#include "tactic.h"
|
||||
#include "tactic2solver.h"
|
||||
#include "solver.h"
|
||||
#include "rlimit.h"
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sstream>
|
||||
|
@ -38,7 +39,7 @@ class hilbert_basis_validate {
|
|||
}
|
||||
|
||||
public:
|
||||
|
||||
|
||||
hilbert_basis_validate(ast_manager& m);
|
||||
|
||||
expr_ref mk_validate(hilbert_basis& hb);
|
||||
|
@ -46,7 +47,7 @@ public:
|
|||
};
|
||||
|
||||
|
||||
hilbert_basis_validate::hilbert_basis_validate(ast_manager& m):
|
||||
hilbert_basis_validate::hilbert_basis_validate(ast_manager& m):
|
||||
m(m) {
|
||||
}
|
||||
|
||||
|
@ -86,7 +87,7 @@ void hilbert_basis_validate::validate_solution(hilbert_basis& hb, vector<rationa
|
|||
}
|
||||
std::cout << "\n";
|
||||
std::cout << "sum: " << sum << "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
expr_ref hilbert_basis_validate::mk_validate(hilbert_basis& hb) {
|
||||
|
@ -94,7 +95,7 @@ expr_ref hilbert_basis_validate::mk_validate(hilbert_basis& hb) {
|
|||
unsigned sz = hb.get_basis_size();
|
||||
vector<rational> v;
|
||||
|
||||
// check that claimed solution really satisfies inequalities:
|
||||
// check that claimed solution really satisfies inequalities:
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
bool is_initial;
|
||||
hb.get_basis_solution(i, v, is_initial);
|
||||
|
@ -111,7 +112,7 @@ expr_ref hilbert_basis_validate::mk_validate(hilbert_basis& hb) {
|
|||
sort_ref_vector sorts(m);
|
||||
|
||||
#define mk_mul(_r,_x) (_r.is_one()?((expr*)_x):((expr*)a.mk_mul(a.mk_numeral(_r,true),_x)))
|
||||
|
||||
|
||||
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
bool is_initial;
|
||||
|
@ -169,7 +170,7 @@ expr_ref hilbert_basis_validate::mk_validate(hilbert_basis& hb) {
|
|||
}
|
||||
fml1 = m.mk_or(fmls.size(), fmls.c_ptr());
|
||||
fmls.reset();
|
||||
|
||||
|
||||
sz = hb.get_num_ineqs();
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
bool is_eq;
|
||||
|
@ -194,7 +195,7 @@ expr_ref hilbert_basis_validate::mk_validate(hilbert_basis& hb) {
|
|||
}
|
||||
fml2 = m.mk_and(fmls.size(), fmls.c_ptr());
|
||||
fml = m.mk_eq(fml1, fml2);
|
||||
|
||||
|
||||
bounds.reset();
|
||||
for (unsigned i = 0; i < xs.size(); ++i) {
|
||||
if (!hb.get_is_int(i)) {
|
||||
|
@ -221,7 +222,7 @@ static void display_statistics(hilbert_basis& hb) {
|
|||
}
|
||||
|
||||
static void on_ctrl_c(int) {
|
||||
signal (SIGINT, SIG_DFL);
|
||||
signal (SIGINT, SIG_DFL);
|
||||
display_statistics(*g_hb);
|
||||
raise(SIGINT);
|
||||
}
|
||||
|
@ -258,17 +259,17 @@ static void saturate_basis(hilbert_basis& hb) {
|
|||
lbool is_sat = hb.saturate();
|
||||
|
||||
switch(is_sat) {
|
||||
case l_true:
|
||||
std::cout << "sat\n";
|
||||
case l_true:
|
||||
std::cout << "sat\n";
|
||||
hb.display(std::cout);
|
||||
//validate_sat(hb);
|
||||
break;
|
||||
case l_false:
|
||||
std::cout << "unsat\n";
|
||||
case l_false:
|
||||
std::cout << "unsat\n";
|
||||
break;
|
||||
case l_undef:
|
||||
std::cout << "undef\n";
|
||||
break;
|
||||
case l_undef:
|
||||
std::cout << "undef\n";
|
||||
break;
|
||||
}
|
||||
display_statistics(hb);
|
||||
}
|
||||
|
@ -283,7 +284,8 @@ static void saturate_basis(hilbert_basis& hb) {
|
|||
static void gorrila_test(unsigned seed, unsigned n, unsigned k, unsigned bound, unsigned num_ineqs) {
|
||||
std::cout << "Gorrila test\n";
|
||||
random_gen rand(seed);
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
SASSERT(0 < bound);
|
||||
SASSERT(k <= n);
|
||||
int ibound = static_cast<int>(bound);
|
||||
|
@ -303,7 +305,7 @@ static void gorrila_test(unsigned seed, unsigned n, unsigned k, unsigned bound,
|
|||
}
|
||||
a0 = rational(ibound - static_cast<int>(rand(2*bound+1)));
|
||||
hb.add_ge(nv, a0);
|
||||
}
|
||||
}
|
||||
hb.display(std::cout << "Saturate\n");
|
||||
saturate_basis(hb);
|
||||
}
|
||||
|
@ -368,7 +370,8 @@ static vector<rational> vec(int i, int j, int k, int l, int x, int y, int z) {
|
|||
// -y + z <= 0
|
||||
|
||||
static void tst1() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_eq(vec(1,1,-2));
|
||||
hb.add_eq(vec(1,0,-1));
|
||||
hb.add_le(vec(0,1,-1));
|
||||
|
@ -380,7 +383,8 @@ static void tst1() {
|
|||
// 23x - 12y - 9z <= 0
|
||||
// x - 8y - 8z <= 0
|
||||
void tst2() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
|
||||
hb.add_eq(vec(-23,12,9));
|
||||
hb.add_eq(vec(-1,8,8));
|
||||
|
@ -391,7 +395,8 @@ void tst2() {
|
|||
// example 6, Ajili, Contenjean
|
||||
// 3x + 2y - z - 2u <= 0
|
||||
static void tst3() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_le(vec(3,2,-1,-2));
|
||||
saturate_basis(hb);
|
||||
}
|
||||
|
@ -400,7 +405,8 @@ static void tst3() {
|
|||
|
||||
// Sigma_1, table 1, Ajili, Contejean
|
||||
static void tst4() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_le(vec( 0,-2, 1, 3, 2,-2, 3), R(3));
|
||||
hb.add_le(vec(-1, 7, 0, 1, 3, 5,-4), R(2));
|
||||
hb.add_le(vec( 0,-1, 1,-1,-1, 0, 0), R(2));
|
||||
|
@ -416,7 +422,8 @@ static void tst4() {
|
|||
|
||||
// Sigma_2 table 1, Ajili, Contejean
|
||||
static void tst5() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_le(vec( 1, 2,-1, 1), R(3));
|
||||
hb.add_le(vec( 2, 4, 1, 2), R(12));
|
||||
hb.add_le(vec( 1, 4, 2, 1), R(9));
|
||||
|
@ -429,7 +436,8 @@ static void tst5() {
|
|||
|
||||
// Sigma_3 table 1, Ajili, Contejean
|
||||
static void tst6() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_le(vec( 4, 3, 0), R(6));
|
||||
hb.add_le(vec(-3,-4, 0), R(-1));
|
||||
hb.add_le(vec( 4, 0,-3), R(3));
|
||||
|
@ -441,7 +449,8 @@ static void tst6() {
|
|||
|
||||
// Sigma_4 table 1, Ajili, Contejean
|
||||
static void tst7() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_eq(vec( 1, 1, 1, 0), R(5));
|
||||
hb.add_le(vec( 2, 1, 0, 1), R(6));
|
||||
hb.add_le(vec( 1, 2, 1, 1), R(7));
|
||||
|
@ -454,7 +463,8 @@ static void tst7() {
|
|||
|
||||
// Sigma_5 table 1, Ajili, Contejean
|
||||
static void tst8() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_le(vec( 2, 1, 1), R(2));
|
||||
hb.add_le(vec( 1, 2, 3), R(5));
|
||||
hb.add_le(vec( 2, 2, 3), R(6));
|
||||
|
@ -464,7 +474,8 @@ static void tst8() {
|
|||
|
||||
// Sigma_6 table 1, Ajili, Contejean
|
||||
static void tst9() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_le(vec( 1, 2, 3), R(11));
|
||||
hb.add_le(vec( 2, 2, 5), R(13));
|
||||
hb.add_le(vec( 1,-1,-11), R(3));
|
||||
|
@ -473,7 +484,8 @@ static void tst9() {
|
|||
|
||||
// Sigma_7 table 1, Ajili, Contejean
|
||||
static void tst10() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_le(vec( 1,-1,-1,-3), R(2));
|
||||
hb.add_le(vec(-2, 3, 3,-5), R(3));
|
||||
saturate_basis(hb);
|
||||
|
@ -481,14 +493,16 @@ static void tst10() {
|
|||
|
||||
// Sigma_8 table 1, Ajili, Contejean
|
||||
static void tst11() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_le(vec( 7,-2,11, 3, -5), R(5));
|
||||
saturate_basis(hb);
|
||||
}
|
||||
|
||||
// Sigma_9 table 1, Ajili, Contejean
|
||||
static void tst12() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_eq(vec( 1,-2,-3,4), R(0));
|
||||
hb.add_le(vec(100,45,-78,-67), R(0));
|
||||
saturate_basis(hb);
|
||||
|
@ -496,34 +510,39 @@ static void tst12() {
|
|||
|
||||
// Sigma_10 table 1, Ajili, Contejean
|
||||
static void tst13() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_le(vec( 23, -56, -34, 12, 11), R(0));
|
||||
saturate_basis(hb);
|
||||
}
|
||||
|
||||
// Sigma_11 table 1, Ajili, Contejean
|
||||
static void tst14() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_eq(vec(1, 0, -4, 8), R(2));
|
||||
hb.add_le(vec(12,19,-11,-7), R(-7));
|
||||
saturate_basis(hb);
|
||||
}
|
||||
|
||||
static void tst15() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_le(vec(1, 0), R(1));
|
||||
hb.add_le(vec(0, 1), R(1));
|
||||
saturate_basis(hb);
|
||||
}
|
||||
|
||||
static void tst16() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_le(vec(1, 0), R(100));
|
||||
saturate_basis(hb);
|
||||
}
|
||||
|
||||
static void tst17() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_eq(vec(1, 0), R(0));
|
||||
hb.add_eq(vec(-1, 0), R(0));
|
||||
hb.add_eq(vec(0, 2), R(0));
|
||||
|
@ -533,26 +552,29 @@ static void tst17() {
|
|||
}
|
||||
|
||||
static void tst18() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_eq(vec(0, 1), R(0));
|
||||
hb.add_eq(vec(1, -1), R(2));
|
||||
saturate_basis(hb);
|
||||
saturate_basis(hb);
|
||||
}
|
||||
|
||||
static void tst19() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
hb.add_eq(vec(0, 1, 0), R(0));
|
||||
hb.add_eq(vec(1, -1, 0), R(2));
|
||||
saturate_basis(hb);
|
||||
saturate_basis(hb);
|
||||
}
|
||||
|
||||
static void test_A_5_5_3() {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
for (unsigned i = 0; i < 15; ++i) {
|
||||
vector<rational> v;
|
||||
for (unsigned j = 0; j < 5; ++j) {
|
||||
for (unsigned k = 0; k < 15; ++k) {
|
||||
v.push_back(rational(k == i));
|
||||
v.push_back(rational(k == i));
|
||||
}
|
||||
}
|
||||
hb.add_ge(v, R(0));
|
||||
|
|
|
@ -22,6 +22,7 @@ Revision History:
|
|||
#include"mpq.h"
|
||||
#include"ast.h"
|
||||
#include"debug.h"
|
||||
#include"rlimit.h"
|
||||
|
||||
template class interval_manager<im_default_config>;
|
||||
typedef im_default_config::interval interval;
|
||||
|
@ -61,7 +62,7 @@ static void display_smt2_numeral(std::ostream & out, unsynch_mpq_manager & m, mp
|
|||
}
|
||||
}
|
||||
|
||||
static void display_constraint(std::ostream & out, unsynch_mpq_manager & m, char const * a, interval const & i,
|
||||
static void display_constraint(std::ostream & out, unsynch_mpq_manager & m, char const * a, interval const & i,
|
||||
bool include_lower = true, bool include_upper = true) {
|
||||
out << "(and true";
|
||||
if (!i.m_lower_inf && include_lower) {
|
||||
|
@ -77,7 +78,7 @@ static void display_constraint(std::ostream & out, unsynch_mpq_manager & m, char
|
|||
out << ")";
|
||||
}
|
||||
|
||||
static void assert_hyp(std::ostream & out, unsynch_mpq_manager & m, char const * a, interval const & i,
|
||||
static void assert_hyp(std::ostream & out, unsynch_mpq_manager & m, char const * a, interval const & i,
|
||||
bool include_lower = true, bool include_upper = true) {
|
||||
out << "(assert ";
|
||||
display_constraint(out, m, a, i, include_lower, include_upper);
|
||||
|
@ -99,7 +100,7 @@ static bool mk_interval(im_default_config & cfg, interval & a, bool l_inf, bool
|
|||
if (l_val == u_val && (l_open || u_open))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (l_inf) {
|
||||
a.m_lower_open = true;
|
||||
a.m_lower_inf = true;
|
||||
|
@ -119,7 +120,7 @@ static bool mk_interval(im_default_config & cfg, interval & a, bool l_inf, bool
|
|||
a.m_upper_inf = false;
|
||||
cfg.m().set(a.m_upper, u_val);
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
@ -131,7 +132,7 @@ static void mk_random_interval(im_default_config & cfg, interval & a, unsigned m
|
|||
if (rand()%4 == 0) {
|
||||
a.m_lower_open = true;
|
||||
a.m_lower_inf = true;
|
||||
|
||||
|
||||
a.m_upper_open = (rand()%2 == 0);
|
||||
a.m_upper_inf = false;
|
||||
cfg.m().set(a.m_upper, -static_cast<int>((rand()%magnitude)));
|
||||
|
@ -141,7 +142,7 @@ static void mk_random_interval(im_default_config & cfg, interval & a, unsigned m
|
|||
a.m_upper_inf = false;
|
||||
int upper = -static_cast<int>((rand()%magnitude));
|
||||
cfg.m().set(a.m_upper, upper);
|
||||
|
||||
|
||||
a.m_lower_open = (rand()%2 == 0);
|
||||
a.m_lower_inf = false;
|
||||
cfg.m().set(a.m_lower, upper - static_cast<int>(rand()%magnitude) - (a.m_lower_open || a.m_upper_open ? 1 : 0));
|
||||
|
@ -149,7 +150,7 @@ static void mk_random_interval(im_default_config & cfg, interval & a, unsigned m
|
|||
break;
|
||||
case 1:
|
||||
// Neg, Pos
|
||||
|
||||
|
||||
if (rand()%4 == 0) {
|
||||
a.m_lower_open = true;
|
||||
a.m_lower_inf = true;
|
||||
|
@ -159,7 +160,7 @@ static void mk_random_interval(im_default_config & cfg, interval & a, unsigned m
|
|||
a.m_lower_inf = false;
|
||||
cfg.m().set(a.m_lower, -static_cast<int>((rand()%magnitude)) - 1);
|
||||
}
|
||||
|
||||
|
||||
if (rand()%4 == 0) {
|
||||
a.m_upper_open = true;
|
||||
a.m_upper_inf = true;
|
||||
|
@ -175,7 +176,7 @@ static void mk_random_interval(im_default_config & cfg, interval & a, unsigned m
|
|||
if (rand()%4 == 0) {
|
||||
a.m_upper_open = true;
|
||||
a.m_upper_inf = true;
|
||||
|
||||
|
||||
a.m_lower_open = (rand()%2 == 0);
|
||||
a.m_lower_inf = false;
|
||||
cfg.m().set(a.m_lower, (rand()%magnitude));
|
||||
|
@ -185,7 +186,7 @@ static void mk_random_interval(im_default_config & cfg, interval & a, unsigned m
|
|||
a.m_lower_inf = false;
|
||||
int lower = (rand()%magnitude);
|
||||
cfg.m().set(a.m_lower, lower);
|
||||
|
||||
|
||||
a.m_upper_open = (rand()%2 == 0);
|
||||
a.m_upper_inf = false;
|
||||
cfg.m().set(a.m_upper, lower + rand()%magnitude + (a.m_lower_open || a.m_upper_open ? 1 : 0));
|
||||
|
@ -235,9 +236,10 @@ static void display_lemmas(unsynch_mpq_manager & nm, char const * result_term,
|
|||
|
||||
#define MK_BINARY(NAME, RES_TERM) \
|
||||
static void tst_ ## NAME(unsigned N, unsigned magnitude) { \
|
||||
reslimit rl; \
|
||||
unsynch_mpq_manager nm; \
|
||||
im_default_config imc(nm); \
|
||||
interval_manager<im_default_config> im(imc); \
|
||||
interval_manager<im_default_config> im(rl, imc); \
|
||||
interval a, b, r; \
|
||||
\
|
||||
for (unsigned i = 0; i < N; i++) { \
|
||||
|
@ -255,130 +257,137 @@ MK_BINARY(mul, "(* a b)");
|
|||
MK_BINARY(add, "(+ a b)");
|
||||
MK_BINARY(sub, "(- a b)");
|
||||
|
||||
static void tst_neg(unsigned N, unsigned magnitude) {
|
||||
unsynch_mpq_manager nm;
|
||||
static void tst_neg(unsigned N, unsigned magnitude) {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(imc);
|
||||
interval a, b, r;
|
||||
|
||||
for (unsigned i = 0; i < N; i++) {
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
interval_deps deps;
|
||||
im.neg(a, r, deps);
|
||||
display_lemmas(nm, "(- a)", a, b, r, deps);
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
}
|
||||
interval_manager<im_default_config> im(rl, imc);
|
||||
interval a, b, r;
|
||||
|
||||
static void tst_pw_2(unsigned N, unsigned magnitude) {
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(imc);
|
||||
interval a, b, r;
|
||||
|
||||
for (unsigned i = 0; i < N; i++) {
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
interval_deps deps;
|
||||
im.power(a, 2, r, deps);
|
||||
display_lemmas(nm, "(* a a)", a, b, r, deps);
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
}
|
||||
|
||||
static void tst_pw_3(unsigned N, unsigned magnitude) {
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(imc);
|
||||
interval a, b, r;
|
||||
|
||||
for (unsigned i = 0; i < N; i++) {
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
interval_deps deps;
|
||||
im.power(a, 3, r, deps);
|
||||
display_lemmas(nm, "(* a a a)", a, b, r, deps);
|
||||
for (unsigned i = 0; i < N; i++) {
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
interval_deps deps;
|
||||
im.neg(a, r, deps);
|
||||
display_lemmas(nm, "(- a)", a, b, r, deps);
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
}
|
||||
|
||||
static void tst_root_2(unsigned N, unsigned magnitude, unsigned precision) {
|
||||
unsynch_mpq_manager nm;
|
||||
static void tst_pw_2(unsigned N, unsigned magnitude) {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(imc);
|
||||
interval a, b, r;
|
||||
interval_manager<im_default_config> im(rl, imc);
|
||||
interval a, b, r;
|
||||
|
||||
for (unsigned i = 0; i < N; i++) {
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
interval_deps deps;
|
||||
im.power(a, 2, r, deps);
|
||||
display_lemmas(nm, "(* a a)", a, b, r, deps);
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
}
|
||||
|
||||
static void tst_pw_3(unsigned N, unsigned magnitude) {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(rl, imc);
|
||||
interval a, b, r;
|
||||
|
||||
for (unsigned i = 0; i < N; i++) {
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
interval_deps deps;
|
||||
im.power(a, 3, r, deps);
|
||||
display_lemmas(nm, "(* a a a)", a, b, r, deps);
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
}
|
||||
|
||||
static void tst_root_2(unsigned N, unsigned magnitude, unsigned precision) {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(rl, imc);
|
||||
interval a, b, r;
|
||||
scoped_mpq p(nm);
|
||||
p = precision;
|
||||
nm.inv(p);
|
||||
|
||||
unsigned i = 0;
|
||||
while (i < N) {
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
if (!im.lower_is_neg(a)) {
|
||||
i++;
|
||||
interval_deps deps;
|
||||
im.nth_root(a, 2, p, r, deps);
|
||||
display_lemmas(nm, "(^ a (/ 1.0 2.0))", a, b, r, deps);
|
||||
}
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
interval_deps deps;
|
||||
im.nth_root(a, 2, p, r, deps);
|
||||
display_lemmas(nm, "(^ a (/ 1.0 2.0))", a, b, r, deps);
|
||||
}
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
}
|
||||
|
||||
static void tst_root_3(unsigned N, unsigned magnitude, unsigned precision) {
|
||||
unsynch_mpq_manager nm;
|
||||
static void tst_root_3(unsigned N, unsigned magnitude, unsigned precision) {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(imc);
|
||||
interval a, b, r;
|
||||
interval_manager<im_default_config> im(rl, imc);
|
||||
interval a, b, r;
|
||||
scoped_mpq p(nm);
|
||||
p = precision;
|
||||
nm.inv(p);
|
||||
|
||||
unsigned i = 0;
|
||||
while (i < N) {
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
i++;
|
||||
interval_deps deps;
|
||||
im.nth_root(a, 3, p, r, deps);
|
||||
display_lemmas(nm, "(^ a (/ 1.0 3.0))", a, b, r, deps);
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
interval_deps deps;
|
||||
im.nth_root(a, 3, p, r, deps);
|
||||
display_lemmas(nm, "(^ a (/ 1.0 3.0))", a, b, r, deps);
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
}
|
||||
|
||||
static void tst_inv(unsigned N, unsigned magnitude) {
|
||||
unsynch_mpq_manager nm;
|
||||
static void tst_inv(unsigned N, unsigned magnitude) {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(imc);
|
||||
interval a, b, r;
|
||||
|
||||
for (unsigned i = 0; i < N; i++) {
|
||||
interval_manager<im_default_config> im(rl, imc);
|
||||
interval a, b, r;
|
||||
|
||||
for (unsigned i = 0; i < N; i++) {
|
||||
while (true) {
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
if (!im.contains_zero(a))
|
||||
break;
|
||||
}
|
||||
interval_deps deps;
|
||||
im.inv(a, r, deps);
|
||||
display_lemmas(nm, "(/ 1 a)", a, b, r, deps);
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
interval_deps deps;
|
||||
im.inv(a, r, deps);
|
||||
display_lemmas(nm, "(/ 1 a)", a, b, r, deps);
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
}
|
||||
|
||||
static void tst_div(unsigned N, unsigned magnitude) {
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(imc);
|
||||
interval a, b, r;
|
||||
static void tst_div(unsigned N, unsigned magnitude) {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(rl, imc);
|
||||
interval a, b, r;
|
||||
|
||||
for (unsigned i = 0; i < N; i++) {
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
for (unsigned i = 0; i < N; i++) {
|
||||
mk_random_interval(imc, a, magnitude);
|
||||
while (true) {
|
||||
mk_random_interval(imc, b, magnitude);
|
||||
mk_random_interval(imc, b, magnitude);
|
||||
if (!im.contains_zero(b))
|
||||
break;
|
||||
}
|
||||
interval_deps deps;
|
||||
im.div(a, b, r, deps);
|
||||
display_lemmas(nm, "(/ a b)", a, b, r, deps);
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
interval_deps deps;
|
||||
im.div(a, b, r, deps);
|
||||
display_lemmas(nm, "(/ a b)", a, b, r, deps);
|
||||
}
|
||||
del_interval(imc, a); del_interval(imc, b); del_interval(imc, r);
|
||||
}
|
||||
|
||||
#include"im_float_config.h"
|
||||
|
@ -395,7 +404,7 @@ static void tst_float() {
|
|||
qm.set(one_third, 1, 3);
|
||||
qm.set(two_third, 2, 3);
|
||||
qm.set(minus_two_third, -2, 3);
|
||||
|
||||
|
||||
ifc.round_to_minus_inf();
|
||||
ifc.m().set(a.m_lower, minus_one_third);
|
||||
ifc.round_to_plus_inf();
|
||||
|
@ -405,7 +414,7 @@ static void tst_float() {
|
|||
ifc.m().set(b.m_lower, minus_two_third);
|
||||
ifc.round_to_plus_inf();
|
||||
ifc.m().set(b.m_upper, one_third);
|
||||
|
||||
|
||||
im.display(std::cout, a);
|
||||
std::cout << "\n";
|
||||
im.display(std::cout, b);
|
||||
|
@ -420,13 +429,14 @@ static void tst_float() {
|
|||
#endif
|
||||
|
||||
void tst_pi() {
|
||||
unsynch_mpq_manager nm;
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(imc);
|
||||
interval_manager<im_default_config> im(rl, imc);
|
||||
interval r;
|
||||
for (unsigned i = 0; i < 8; i++) {
|
||||
im.pi(i, r);
|
||||
nm.display_decimal(std::cout, im.lower(r), 32); std::cout << " ";
|
||||
nm.display_decimal(std::cout, im.lower(r), 32); std::cout << " ";
|
||||
nm.display_decimal(std::cout, im.upper(r), 32); std::cout << "\n";
|
||||
SASSERT(nm.lt(im.lower(r), im.upper(r)));
|
||||
}
|
||||
|
@ -436,10 +446,11 @@ void tst_pi() {
|
|||
#if 0
|
||||
static void tst_pi_float() {
|
||||
std::cout << "pi float...\n";
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager qm;
|
||||
mpf_manager fm;
|
||||
im_float_config<mpf_manager> ifc(fm, 22, 106);
|
||||
interval_manager<im_float_config<mpf_manager> > im(ifc);
|
||||
interval_manager<im_float_config<mpf_manager> > im(rl, ifc);
|
||||
scoped_mpq q(qm);
|
||||
im_float_config<mpf_manager>::interval r;
|
||||
for (unsigned i = 0; i < 8; i++) {
|
||||
|
@ -451,7 +462,7 @@ static void tst_pi_float() {
|
|||
}
|
||||
del_f_interval(ifc, r);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define NUM_TESTS 1000
|
||||
#define SMALL_MAG 3
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
Copyright (c) 2015 Microsoft Corporation
|
||||
|
||||
--*/
|
||||
|
||||
#include"rlimit.h"
|
||||
#include "hilbert_basis.h"
|
||||
|
||||
/*
|
||||
|
@ -15,12 +15,12 @@ namespace karr {
|
|||
struct matrix {
|
||||
vector<vector<rational> > A;
|
||||
vector<rational> b;
|
||||
|
||||
|
||||
unsigned size() const { return A.size(); }
|
||||
|
||||
void reset() {
|
||||
A.reset();
|
||||
b.reset();
|
||||
void reset() {
|
||||
A.reset();
|
||||
b.reset();
|
||||
}
|
||||
|
||||
matrix& operator=(matrix const& other) {
|
||||
|
@ -46,7 +46,8 @@ namespace karr {
|
|||
|
||||
// treat src as a homogeneous matrix.
|
||||
void dualizeH(matrix& dst, matrix const& src) {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
for (unsigned i = 0; i < src.size(); ++i) {
|
||||
vector<rational> v(src.A[i]);
|
||||
v.push_back(src.b[i]);
|
||||
|
@ -74,7 +75,8 @@ namespace karr {
|
|||
|
||||
// treat src as an inhomegeneous matrix.
|
||||
void dualizeI(matrix& dst, matrix const& src) {
|
||||
hilbert_basis hb;
|
||||
reslimit rl;
|
||||
hilbert_basis hb(rl);
|
||||
for (unsigned i = 0; i < src.size(); ++i) {
|
||||
hb.add_eq(src.A[i], -src.b[i]);
|
||||
}
|
||||
|
@ -136,7 +138,7 @@ namespace karr {
|
|||
}
|
||||
for (unsigned i = 0; i < src.size(); ++i) {
|
||||
T.A.push_back(src.A[i]);
|
||||
T.A.back().append(zeros);
|
||||
T.A.back().append(zeros);
|
||||
}
|
||||
T.b.append(src.b);
|
||||
T.append(Ab);
|
||||
|
@ -146,7 +148,7 @@ namespace karr {
|
|||
dualizeI(TD, T);
|
||||
TD.display(std::cout << "TD:\n");
|
||||
for (unsigned i = 0; i < TD.size(); ++i) {
|
||||
vector<rational> v;
|
||||
vector<rational> v;
|
||||
v.append(src.size(), TD.A[i].c_ptr() + src.size());
|
||||
dst.A.push_back(v);
|
||||
dst.b.push_back(TD.b[i]);
|
||||
|
@ -200,8 +202,8 @@ namespace karr {
|
|||
static void tst1() {
|
||||
matrix Theta;
|
||||
matrix Ab;
|
||||
|
||||
//
|
||||
|
||||
//
|
||||
Theta.A.push_back(V(1, 0));
|
||||
Theta.b.push_back(R(0));
|
||||
Theta.A.push_back(V(0, 1));
|
||||
|
@ -232,7 +234,7 @@ namespace karr {
|
|||
joinD(e2, t2D, ThetaD);
|
||||
|
||||
t2D.display(std::cout << "t2D\n");
|
||||
e2.display(std::cout << "e2\n");
|
||||
e2.display(std::cout << "e2\n");
|
||||
}
|
||||
|
||||
void tst2() {
|
||||
|
@ -264,7 +266,7 @@ namespace karr {
|
|||
|
||||
N.display(std::cout << "N\n");
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
void tst3() {
|
||||
|
@ -288,7 +290,7 @@ namespace karr {
|
|||
|
||||
N.display(std::cout << "N\n");
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -21,6 +21,7 @@ Notes:
|
|||
#include"nlsat_evaluator.h"
|
||||
#include"nlsat_solver.h"
|
||||
#include"util.h"
|
||||
#include"rlimit.h"
|
||||
|
||||
nlsat::interval_set_ref tst_interval(nlsat::interval_set_ref const & s1,
|
||||
nlsat::interval_set_ref const & s2,
|
||||
|
@ -57,8 +58,9 @@ nlsat::interval_set_ref tst_interval(nlsat::interval_set_ref const & s1,
|
|||
|
||||
static void tst3() {
|
||||
enable_trace("nlsat_interval");
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager qm;
|
||||
anum_manager am(qm);
|
||||
anum_manager am(rl, qm);
|
||||
small_object_allocator allocator;
|
||||
nlsat::interval_set_manager ism(am, allocator);
|
||||
|
||||
|
@ -70,13 +72,13 @@ static void tst3() {
|
|||
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";
|
||||
|
@ -94,7 +96,7 @@ static void tst3() {
|
|||
s2 = ism.mk(false, false, zero, false, false, two, p2);
|
||||
tst_interval(s1, s2, 1);
|
||||
|
||||
// Case
|
||||
// Case
|
||||
// s1: [ ... ]
|
||||
// s2: [ ... ]
|
||||
s1 = ism.mk(false, false, zero, false, false, two, p1);
|
||||
|
@ -102,28 +104,28 @@ static void tst3() {
|
|||
s3 = ism.mk_union(s1, s2);
|
||||
tst_interval(s1, s2, 2);
|
||||
|
||||
// Case
|
||||
// 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
|
||||
// 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
|
||||
// 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
|
||||
// Case
|
||||
// s1: [ ... ]
|
||||
// s2: [ ... ] [ ... ]
|
||||
s1 = ism.mk(false, false, m_two, false, false, two, p1);
|
||||
|
@ -214,7 +216,7 @@ static nlsat::interval_set_ref mk_random(nlsat::interval_set_manager & ism, anum
|
|||
return r;
|
||||
}
|
||||
|
||||
static void check_subset_result(nlsat::interval_set_ref const & s1,
|
||||
static void check_subset_result(nlsat::interval_set_ref const & s1,
|
||||
nlsat::interval_set_ref const & s2,
|
||||
nlsat::interval_set_ref const & r,
|
||||
nlsat::literal l1,
|
||||
|
@ -241,15 +243,16 @@ static void check_subset_result(nlsat::interval_set_ref const & s1,
|
|||
|
||||
static void tst4() {
|
||||
enable_trace("nlsat_interval");
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager qm;
|
||||
anum_manager am(qm);
|
||||
anum_manager am(rl, qm);
|
||||
small_object_allocator allocator;
|
||||
nlsat::interval_set_manager ism(am, allocator);
|
||||
nlsat::interval_set_ref s1(ism), s2(ism), r(ism);
|
||||
|
||||
nlsat::literal l1(1, false);
|
||||
nlsat::literal l2(2, false);
|
||||
|
||||
|
||||
for (unsigned i = 0; i < 100; i++) {
|
||||
s1 = mk_random(ism, am, 20, 3, 10, true, true, l1);
|
||||
s2 = mk_random(ism, am, 20, 3, 10, true, true, l2);
|
||||
|
|
|
@ -22,11 +22,13 @@ Notes:
|
|||
#include"polynomial_var2value.h"
|
||||
#include"polynomial_cache.h"
|
||||
#include"linear_eq_solver.h"
|
||||
#include"rlimit.h"
|
||||
|
||||
static void tst1() {
|
||||
std::cout << "\n----- Basic testing -------\n";
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -56,6 +58,7 @@ static void tst1() {
|
|||
}
|
||||
|
||||
static void tst_pseudo_div(polynomial_ref const & A, polynomial_ref const & B, polynomial::var x) {
|
||||
reslimit rl;
|
||||
polynomial::manager & m = A.m();
|
||||
std::cout << "---- Pseudo-division test ----\n";
|
||||
std::cout << "A: " << A << "\n";
|
||||
|
@ -81,8 +84,9 @@ static void tst_pseudo_div(polynomial_ref const & A, polynomial_ref const & B, p
|
|||
}
|
||||
|
||||
static void tst2() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -98,8 +102,9 @@ static void tst2() {
|
|||
|
||||
|
||||
static void tst3() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
x0 = m.mk_polynomial(m.mk_var());
|
||||
|
@ -113,8 +118,9 @@ static void tst3() {
|
|||
|
||||
static void tst4() {
|
||||
std::cout << "---- Testing renaming/reordering ----\n";
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -141,8 +147,9 @@ static void tst_quasi_resultant(polynomial_ref const & p, polynomial_ref const &
|
|||
}
|
||||
|
||||
static void tst5() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -158,8 +165,9 @@ static void tst5() {
|
|||
}
|
||||
|
||||
static void tst6() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -176,8 +184,9 @@ static void tst6() {
|
|||
}
|
||||
|
||||
static void tst7() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -198,8 +207,9 @@ static void tst7() {
|
|||
}
|
||||
|
||||
static void tst8() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -220,8 +230,9 @@ static void tst8() {
|
|||
|
||||
|
||||
static void tst9() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -261,8 +272,9 @@ static void tst9() {
|
|||
}
|
||||
|
||||
static void tst10() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -300,8 +312,9 @@ static void tst10() {
|
|||
}
|
||||
|
||||
static void tst11() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -342,8 +355,9 @@ static void tst_discriminant(polynomial_ref const & p, polynomial_ref const & ex
|
|||
}
|
||||
|
||||
static void tst_discriminant() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref a(m);
|
||||
polynomial_ref b(m);
|
||||
polynomial_ref c(m);
|
||||
|
@ -354,13 +368,13 @@ static void tst_discriminant() {
|
|||
c = m.mk_polynomial(m.mk_var());
|
||||
d = m.mk_polynomial(m.mk_var());
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
tst_discriminant(a*(x^2) + b*x + c,
|
||||
tst_discriminant(a*(x^2) + b*x + c,
|
||||
(b^2) - 4*a*c);
|
||||
tst_discriminant(a*(x^3) + b*(x^2) + c*x + d,
|
||||
tst_discriminant(a*(x^3) + b*(x^2) + c*x + d,
|
||||
(b^2)*(c^2) - 4*a*(c^3) - 4*(b^3)*d + 18*a*b*c*d - 27*(a^2)*(d^2));
|
||||
tst_discriminant(a*(x^3) + b*(x^2) + c*(x^2) + d,
|
||||
tst_discriminant(a*(x^3) + b*(x^2) + c*(x^2) + d,
|
||||
-4*(b^3)*d - 12*(b^2)*c*d - 12*b*(c^2)*d - 4*(c^3)*d - 27*(a^2)*(d^2));
|
||||
tst_discriminant(a*(x^3) + b*(x^2) + c*(x^2) + d,
|
||||
tst_discriminant(a*(x^3) + b*(x^2) + c*(x^2) + d,
|
||||
-4*(b^3)*d - 12*(b^2)*c*d - 12*b*(c^2)*d - 4*(c^3)*d - 27*(a^2)*(d^2));
|
||||
tst_discriminant(a*(x^3) + (b^2)*d*(x^2) + c*(x^2) + d,
|
||||
-4*(b^6)*(d^4) - 12*(b^4)*c*(d^3) - 12*(b^2)*(c^2)*(d^2) - 4*(c^3)*d - 27*(a^2)*(d^2));
|
||||
|
@ -402,7 +416,7 @@ static void tst_discriminant() {
|
|||
tst_discriminant((x^4) + (a + b)*(x^2) + (a + c)*x,
|
||||
-4*(a^5) - 12*(a^4)*b - 12*(a^3)*(b^2) - 4*(a^2)*(b^3) - 8*(a^4)*c - 24*(a^3)*b*c -
|
||||
24*(a^2)*(b^2)*c - 8*a*(b^3)*c - 4*(a^3)*(c^2) - 12*(a^2)*b*(c^2) - 12*a*(b^2)*(c^2) -
|
||||
4*(b^3)*(c^2) - 27*(a^4) - 108*(a^3)*c - 162*(a^2)*(c^2) - 108*a*(c^3) - 27*(c^4));
|
||||
4*(b^3)*(c^2) - 27*(a^4) - 108*(a^3)*c - 162*(a^2)*(c^2) - 108*a*(c^3) - 27*(c^4));
|
||||
tst_discriminant((x^4) + (a + c)*x + (c^2),
|
||||
256*(c^6) - 27*(a^4) - 108*(a^3)*c - 162*(a^2)*(c^2) - 108*a*(c^3) - 27*(c^4)
|
||||
);
|
||||
|
@ -425,7 +439,7 @@ static void tst_discriminant() {
|
|||
max_var(b),
|
||||
2048*(a^12) - 12288*(a^11) + 26112*(a^10) - 22528*(a^9) + 5664*(a^8) + 960*(a^7) +
|
||||
32*(a^6));
|
||||
tst_discriminant((x^4) + a*(x^2) + b*x + c,
|
||||
tst_discriminant((x^4) + a*(x^2) + b*x + c,
|
||||
-4*(a^3)*(b^2) + 16*(a^4)*c - 27*(b^4) + 144*a*(b^2)*c - 128*(a^2)*(c^2) + 256*(c^3));
|
||||
tst_discriminant((((a-1)^2) + a*b + ((b-1)^2) - 1)*(x^3) + (a*b)*(x^2) + ((a^2) - (b^2))*x + c*a,
|
||||
-4*(a^8) - 4*(a^7)*b + 9*(a^6)*(b^2) + 12*(a^5)*(b^3) - 2*(a^4)*(b^4) - 12*(a^3)*(b^5) -
|
||||
|
@ -460,8 +474,9 @@ static void tst_resultant(polynomial_ref const & p, polynomial_ref const & q, po
|
|||
}
|
||||
|
||||
static void tst_resultant() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref a(m);
|
||||
polynomial_ref b(m);
|
||||
polynomial_ref c(m);
|
||||
|
@ -485,13 +500,13 @@ static void tst_resultant() {
|
|||
3*(a^2)*(b^4) - (b^6));
|
||||
|
||||
|
||||
tst_resultant(a*(x^5) + b,
|
||||
c*x + d,
|
||||
tst_resultant(a*(x^5) + b,
|
||||
c*x + d,
|
||||
a*(d^5) - b*(c^5));
|
||||
tst_resultant(a*(x^5) + 3*(c + d)*(x^2) + 2*b,
|
||||
c*x + d,
|
||||
c*x + d,
|
||||
-2*b*(c^5) - 3*(c^4)*(d^2) - 3*(c^3)*(d^3) + a*(d^5));
|
||||
tst_resultant(c*x + d,
|
||||
tst_resultant(c*x + d,
|
||||
a*(x^5) + 3*(c + d)*(x^2) + 2*b,
|
||||
2*b*(c^5) + 3*(c^4)*(d^2) + 3*(c^3)*(d^3) - a*(d^5));
|
||||
tst_resultant((x^2) - (a^3)*(x^2) + b + 1,
|
||||
|
@ -545,23 +560,25 @@ static void tst_resultant() {
|
|||
}
|
||||
|
||||
static void tst_compose() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
x0 = m.mk_polynomial(m.mk_var());
|
||||
x1 = m.mk_polynomial(m.mk_var());
|
||||
polynomial_ref p(m);
|
||||
p = (x0^3) - x0 + 3;
|
||||
std::cout << "p: " << p << "\np(x - y): " << compose_x_minus_y(p, 1)
|
||||
std::cout << "p: " << p << "\np(x - y): " << compose_x_minus_y(p, 1)
|
||||
<< "\np(x + y): " << compose_x_plus_y(p, 1) << "\np(x - x): " << compose_x_minus_y(p, 0) << "\np(x + x): " << compose_x_plus_y(p, 0) << "\n";
|
||||
SASSERT(eq(compose_x_minus_y(p, 1), (x0^3) - 3*(x0^2)*x1 + 3*x0*(x1^2) - (x1^3) - x0 + x1 + 3));
|
||||
SASSERT(eq(compose_x_plus_y(p, 1), (x0^3) + 3*(x0^2)*x1 + 3*x0*(x1^2) + (x1^3) - x0 - x1 + 3));
|
||||
}
|
||||
|
||||
void tst_prem() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
polynomial_ref y(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
|
@ -572,13 +589,14 @@ void tst_prem() {
|
|||
q = y*(x^3);
|
||||
std::cout << "p: " << p << "\n";
|
||||
std::cout << "q: " << q << "\n";
|
||||
// unsigned d;
|
||||
// unsigned d;
|
||||
std::cout << "srem: " << exact_pseudo_remainder(q, p, 0) << "\n";
|
||||
}
|
||||
|
||||
void tst_sqrt() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
polynomial_ref y(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
|
@ -622,8 +640,9 @@ static void tst_gcd(polynomial_ref const & p, polynomial_ref const & q, polynomi
|
|||
}
|
||||
|
||||
static void tst_gcd() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -648,7 +667,7 @@ static void tst_gcd() {
|
|||
tst_gcd(((x0^2) + x0*x1 + 1)*(x2*x2 + x3 + 2)*(x3*x1 + 2)*(x3*x1*x1 + x1*x2 + 1),
|
||||
(-1)*((x0^2) + x0*x1 + 1)*(x3*x1*x1 + x1*x2 + 1)*(x3*x1 + x1*x2 + 17),
|
||||
((x0^2) + x0*x1 + 1)*(x3*x1*x1 + x1*x2 + 1));
|
||||
|
||||
|
||||
tst_gcd((-1)*((x0^2) + x0*x1 + 1)*(x2*x2 + x3 + 2)*(x3*x1 + 2)*(x3*x1*x1 + x1*x2 + 1),
|
||||
(-1)*((x0^2) + x0*x1 + 1)*(x3*x1*x1 + x1*x2 + 1)*(x3*x1 + x1*x2 + 17),
|
||||
((x0^2) + x0*x1 + 1)*(x3*x1*x1 + x1*x2 + 1));
|
||||
|
@ -661,17 +680,17 @@ static void tst_gcd() {
|
|||
tst_primitive((x0 + 1)*(2*x1) + (x0^2)*(x0 + 1), 1, 2*x1 + (x0^2));
|
||||
tst_primitive((x0 + 1)*(x2 + 1)*(x2^2)*(x0 + 1)*(x1^2) + (x0 + 1)*(x2^2)*x1 + (x0+1)*(x0+1), 1,
|
||||
(x2 + 1)*(x2^2)*(x0 + 1)*(x1^2) + (x2^2)*x1 + (x0+1));
|
||||
tst_primitive((x0 + (x3^2))*(x2 + x3 + 1)*(x2^2)*(x1^2) +
|
||||
tst_primitive((x0 + (x3^2))*(x2 + x3 + 1)*(x2^2)*(x1^2) +
|
||||
(x0 + (x3^2))*(x2 + x3 + 1)*x1 +
|
||||
(x0 + (x3^2))*(x2 + x3 + 1)*(x3^2),
|
||||
1,
|
||||
(x2^2)*(x1^2) + x1 + (x3^2));
|
||||
tst_content((x0 + (x3^2))*(x2 + x3 + 1)*(x2^2)*(x1^2) +
|
||||
tst_content((x0 + (x3^2))*(x2 + x3 + 1)*(x2^2)*(x1^2) +
|
||||
(x0 + (x3^2))*(x2 + x3 + 1)*x1 +
|
||||
(x0 + (x3^2))*(x2 + x3 + 1)*(x3^2),
|
||||
1,
|
||||
(x0 + (x3^2))*(x2 + x3 + 1));
|
||||
tst_primitive(4*(x0 + (x3^2))*(x2 + x3 + 1)*(x2^2)*(x1^2) +
|
||||
tst_primitive(4*(x0 + (x3^2))*(x2 + x3 + 1)*(x2^2)*(x1^2) +
|
||||
2*(x0 + (x3^2))*(x2 + x3 + 1)*x1 +
|
||||
4*(x0 + (x3^2))*(x2 + x3 + 1)*(x3^2),
|
||||
1,
|
||||
|
@ -721,8 +740,9 @@ static void tst_psc_perf(polynomial_ref const & p, polynomial_ref const & q, pol
|
|||
#endif
|
||||
|
||||
static void tst_psc() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -740,7 +760,7 @@ static void tst_psc() {
|
|||
x8 = m.mk_polynomial(m.mk_var());
|
||||
x9 = m.mk_polynomial(m.mk_var());
|
||||
x10 = m.mk_polynomial(m.mk_var());
|
||||
tst_psc(x0*(x1^2) + (x0 + 1)*x1 + 2, x0*x1 + 3, 1,
|
||||
tst_psc(x0*(x1^2) + (x0 + 1)*x1 + 2, x0*x1 + 3, 1,
|
||||
6*x0 - (x0^2), x0);
|
||||
tst_psc(x0*(x1^4) + (x0 + 1)*(x1^3) + 2, x0*(x1^3) + 3, 1,
|
||||
72*(x0^3) - (x0^4) - 27*(x0^2) - 27*(x0), 9*(x0^3));
|
||||
|
@ -754,34 +774,34 @@ static void tst_psc() {
|
|||
tst_psc((x^4) + a*(x^2) + b*x + c, 4*(x^3) + 2*a*x + b, 9,
|
||||
16*(a^4)*c - 4*(a^3)*(b^2) - 128*(a^2)*(c^2) + 144*a*(b^2)*c - 27*(b^4) + 256*(c^3), 8*(a^3) - 32*a*c + 36*(b^2));
|
||||
polynomial_ref & y = x10;
|
||||
|
||||
|
||||
tst_psc(((y^2) + 6)*(x - 1) - y*((x^2) + 1), ((x^2) + 6)*(y - 1) - x*((y^2) + 1), 10,
|
||||
2*(x^6) - 22*(x^5) + 102*(x^4) - 274*(x^3) + 488*(x^2) - 552*x + 288,
|
||||
2*(x^6) - 22*(x^5) + 102*(x^4) - 274*(x^3) + 488*(x^2) - 552*x + 288,
|
||||
5*x - (x^2) - 6
|
||||
);
|
||||
|
||||
|
||||
tst_psc(((y^3) + 6)*(x - 1) - y*((x^3) + 1), ((x^3) + 6)*(y - 1) - x*((y^3) + 1), 10,
|
||||
3*(x^11) - 3*(x^10) - 37*(x^9) + 99*(x^8) + 51*(x^7) - 621*(x^6) + 1089*(x^5) - 39*(x^4) - 3106*(x^3) + 5868*(x^2) - 4968*x + 1728,
|
||||
(x^6) - 10*(x^4) + 12*(x^3) + 25*(x^2) - 60*x + 36);
|
||||
|
||||
polynomial_ref p = (x^6) + a * (x^3) + b;
|
||||
polynomial_ref q = (x^6) + c * (x^3) + d;
|
||||
|
||||
tst_psc(p, q, 9,
|
||||
(b^6) - 3*a*(b^5)*c + 3*(a^2)*(b^4)*(c^2) + 3*(b^5)*(c^2) - (a^3)*(b^3)*(c^3) -
|
||||
6*a*(b^4)*(c^3) + 3*(a^2)*(b^3)*(c^4) + 3*(b^4)*(c^4) - 3*a*(b^3)*(c^5) + (b^3)*(c^6) +
|
||||
3*(a^2)*(b^4)*d - 6*(b^5)*d - 6*(a^3)*(b^3)*c*d + 9*a*(b^4)*c*d +
|
||||
3*(a^4)*(b^2)*(c^2)*d + 6*(a^2)*(b^3)*(c^2)*d - 12*(b^4)*(c^2)*d - 9*(a^3)*(b^2)*(c^3)*d +
|
||||
6*a*(b^3)*(c^3)*d + 9*(a^2)*(b^2)*(c^4)*d - 6*(b^3)*(c^4)*d - 3*a*(b^2)*(c^5)*d +
|
||||
3*(a^4)*(b^2)*(d^2) - 12*(a^2)*(b^3)*(d^2) + 15*(b^4)*(d^2) - 3*(a^5)*b*c*(d^2) +
|
||||
6*(a^3)*(b^2)*c*(d^2) - 6*a*(b^3)*c*(d^2) + 9*(a^4)*b*(c^2)*(d^2) -
|
||||
18*(a^2)*(b^2)*(c^2)*(d^2) + 18*(b^3)*(c^2)*(d^2) - 9*(a^3)*b*(c^3)*(d^2) +
|
||||
6*a*(b^2)*(c^3)*(d^2) + 3*(a^2)*b*(c^4)*(d^2) + 3*(b^2)*(c^4)*(d^2) + (a^6)*(d^3) -
|
||||
6*(a^4)*b*(d^3) + 18*(a^2)*(b^2)*(d^3) - 20*(b^3)*(d^3) - 3*(a^5)*c*(d^3) +
|
||||
6*(a^3)*b*c*(d^3) - 6*a*(b^2)*c*(d^3) + 3*(a^4)*(c^2)*(d^3) + 6*(a^2)*b*(c^2)*(d^3) -
|
||||
12*(b^2)*(c^2)*(d^3) - (a^3)*(c^3)*(d^3) - 6*a*b*(c^3)*(d^3) + 3*(a^4)*(d^4) -
|
||||
12*(a^2)*b*(d^4) + 15*(b^2)*(d^4) - 6*(a^3)*c*(d^4) + 9*a*b*c*(d^4) +
|
||||
3*(a^2)*(c^2)*(d^4) + 3*b*(c^2)*(d^4) + 3*(a^2)*(d^5) - 6*b*(d^5) -
|
||||
|
||||
tst_psc(p, q, 9,
|
||||
(b^6) - 3*a*(b^5)*c + 3*(a^2)*(b^4)*(c^2) + 3*(b^5)*(c^2) - (a^3)*(b^3)*(c^3) -
|
||||
6*a*(b^4)*(c^3) + 3*(a^2)*(b^3)*(c^4) + 3*(b^4)*(c^4) - 3*a*(b^3)*(c^5) + (b^3)*(c^6) +
|
||||
3*(a^2)*(b^4)*d - 6*(b^5)*d - 6*(a^3)*(b^3)*c*d + 9*a*(b^4)*c*d +
|
||||
3*(a^4)*(b^2)*(c^2)*d + 6*(a^2)*(b^3)*(c^2)*d - 12*(b^4)*(c^2)*d - 9*(a^3)*(b^2)*(c^3)*d +
|
||||
6*a*(b^3)*(c^3)*d + 9*(a^2)*(b^2)*(c^4)*d - 6*(b^3)*(c^4)*d - 3*a*(b^2)*(c^5)*d +
|
||||
3*(a^4)*(b^2)*(d^2) - 12*(a^2)*(b^3)*(d^2) + 15*(b^4)*(d^2) - 3*(a^5)*b*c*(d^2) +
|
||||
6*(a^3)*(b^2)*c*(d^2) - 6*a*(b^3)*c*(d^2) + 9*(a^4)*b*(c^2)*(d^2) -
|
||||
18*(a^2)*(b^2)*(c^2)*(d^2) + 18*(b^3)*(c^2)*(d^2) - 9*(a^3)*b*(c^3)*(d^2) +
|
||||
6*a*(b^2)*(c^3)*(d^2) + 3*(a^2)*b*(c^4)*(d^2) + 3*(b^2)*(c^4)*(d^2) + (a^6)*(d^3) -
|
||||
6*(a^4)*b*(d^3) + 18*(a^2)*(b^2)*(d^3) - 20*(b^3)*(d^3) - 3*(a^5)*c*(d^3) +
|
||||
6*(a^3)*b*c*(d^3) - 6*a*(b^2)*c*(d^3) + 3*(a^4)*(c^2)*(d^3) + 6*(a^2)*b*(c^2)*(d^3) -
|
||||
12*(b^2)*(c^2)*(d^3) - (a^3)*(c^3)*(d^3) - 6*a*b*(c^3)*(d^3) + 3*(a^4)*(d^4) -
|
||||
12*(a^2)*b*(d^4) + 15*(b^2)*(d^4) - 6*(a^3)*c*(d^4) + 9*a*b*c*(d^4) +
|
||||
3*(a^2)*(c^2)*(d^4) + 3*b*(c^2)*(d^4) + 3*(a^2)*(d^5) - 6*b*(d^5) -
|
||||
3*a*c*(d^5) + (d^6),
|
||||
3*(a^2)*c - (a^3) - 3*a*(c^2) + (c^3)
|
||||
);
|
||||
|
@ -796,9 +816,9 @@ static void tst_psc() {
|
|||
zero = m.mk_zero();
|
||||
|
||||
tst_psc( a*d*x + a*c*f + a*e - b*a,
|
||||
d*x + c*f + e - b,
|
||||
d*x + c*f + e - b,
|
||||
9, zero, zero);
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
tst_psc_perf((x^7) + a*(x^3) + b*(x^2) + c*x + d,
|
||||
|
@ -834,7 +854,7 @@ static void tst_vars(polynomial_ref const & p, unsigned sz, polynomial::var * xs
|
|||
|
||||
static void tst_vars() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -850,7 +870,7 @@ static void tst_vars() {
|
|||
polynomial::var s012[3] = {0, 1, 2};
|
||||
polynomial::var s3[1] = {3};
|
||||
polynomial::var s01234[5] = {0, 1, 2, 3, 4};
|
||||
|
||||
|
||||
tst_vars((x0 + 1)*((x0^2) + (x3^2))*(x2*x3), 3, s023);
|
||||
tst_vars((x0 + x2)*((x0^2) + (x3^2))*(x2*x3), 3, s023);
|
||||
tst_vars(((x1 + x4 + 1)^5), 2, s14);
|
||||
|
@ -874,7 +894,7 @@ static void tst_sqf(polynomial_ref const & p, polynomial_ref const & expected) {
|
|||
|
||||
static void tst_sqf() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -897,7 +917,7 @@ static void tst_sqf() {
|
|||
tst_sqf(((x0 + x1 + x2 + x3)^5) + 1, ((x0 + x1 + x2 + x3)^5) + 1);
|
||||
}
|
||||
|
||||
static void tst_substitute(polynomial_ref const & p,
|
||||
static void tst_substitute(polynomial_ref const & p,
|
||||
polynomial::var x1, mpz const & v1,
|
||||
polynomial::var x2, mpz const & v2,
|
||||
polynomial_ref const & expected) {
|
||||
|
@ -919,7 +939,7 @@ static void tst_substitute(polynomial_ref const & p,
|
|||
|
||||
static void tst_substitute() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -960,7 +980,7 @@ static void tst_qsubstitute(polynomial_ref const & p,
|
|||
|
||||
static void tst_qsubstitute() {
|
||||
unsynch_mpq_manager qm;
|
||||
polynomial::manager m(qm);
|
||||
reslimit rl; polynomial::manager m(rl, qm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -1013,7 +1033,7 @@ void tst_mfact(polynomial_ref const & p, unsigned num_distinct_factors) {
|
|||
|
||||
static void tst_mfact() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -1083,7 +1103,7 @@ static void tst_mfact() {
|
|||
tst_mfact((x0^70) - 6*(x0^65) - (x0^60) + 60*(x0^55) - 54*(x0^50) - 230*(x0^45) + 274*(x0^40) + 542*(x0^35) - 615*(x0^30) - 1120*(x0^25) + 1500*(x0^20) - 160*(x0^15) - 395*(x0^10) + 76*(x0^5) + 34, 3);
|
||||
tst_mfact(((x0^4) - 8*(x0^2)), 2);
|
||||
tst_mfact((x0^5) - 2*(x0^3) + x0 - 1, 1);
|
||||
tst_mfact( (x0^25) - 4*(x0^21) - 5*(x0^20) + 6*(x0^17) + 11*(x0^16) + 10*(x0^15) - 4*(x0^13) - 7*(x0^12) - 9*(x0^11) - 10*(x0^10) +
|
||||
tst_mfact( (x0^25) - 4*(x0^21) - 5*(x0^20) + 6*(x0^17) + 11*(x0^16) + 10*(x0^15) - 4*(x0^13) - 7*(x0^12) - 9*(x0^11) - 10*(x0^10) +
|
||||
(x0^9) + (x0^8) + (x0^7) + (x0^6) + 3*(x0^5) + x0 - 1, 2);
|
||||
tst_mfact( (x0^25) - 10*(x0^21) - 10*(x0^20) - 95*(x0^17) - 470*(x0^16) - 585*(x0^15) - 40*(x0^13) - 1280*(x0^12) - 4190*(x0^11) - 3830*(x0^10) + 400*(x0^9)+ 1760*(x0^8) + 760*(x0^7) - 2280*(x0^6) + 449*(x0^5) + 640*(x0^3) - 640*(x0^2) + 240*x0 - 32, 2);
|
||||
tst_mfact( x0^10, 1);
|
||||
|
@ -1099,7 +1119,7 @@ static void tst_mfact() {
|
|||
tst_mfact( (x0^50) - 10*(x0^40) + 38*(x0^30) - 2*(x0^25) - 100*(x0^20) - 40*(x0^15) + 121*(x0^10) - 38*(x0^5) - 17, 1);
|
||||
polynomial_ref & y = x0;
|
||||
tst_mfact( (((y^5) + 5*(y^4) + 10*(y^3) + 10*(y^2) + 5*y)^10)
|
||||
+ 10*(((y^5) + 5*(y^4) + 10*(y^3) + 10*(y^2) + 5*y)^9)
|
||||
+ 10*(((y^5) + 5*(y^4) + 10*(y^3) + 10*(y^2) + 5*y)^9)
|
||||
+ 35*(((y^5) + 5*(y^4) + 10*(y^3) + 10*(y^2) + 5*y)^8)
|
||||
+ 40*(((y^5) + 5*(y^4) + 10*(y^3) + 10*(y^2) + 5*y)^7)
|
||||
- 32*(((y^5) + 5*(y^4) + 10*(y^3) + 10*(y^2) + 5*y)^6)
|
||||
|
@ -1113,32 +1133,32 @@ static void tst_mfact() {
|
|||
tst_mfact( ((y^5) - 15552)*
|
||||
((y^20)- 15708*(y^15) + rational("138771724")*(y^10)- rational("432104148432")*(y^5) + rational("614198284585616")),
|
||||
2);
|
||||
tst_mfact( (y^25) -
|
||||
rational("3125")*(y^21) -
|
||||
rational("15630")*(y^20) +
|
||||
rational("3888750")*(y^17) +
|
||||
rational("38684375")*(y^16) +
|
||||
rational("95765635")*(y^15) -
|
||||
rational("2489846500")*(y^13) -
|
||||
rational("37650481875")*(y^12) -
|
||||
rational("190548065625")*(y^11) -
|
||||
rational("323785250010")*(y^10) +
|
||||
rational("750249453025")*(y^9) +
|
||||
rational("14962295699875")*(y^8) +
|
||||
rational("111775113235000")*(y^7) +
|
||||
rational("370399286731250")*(y^6) +
|
||||
rational("362903064503129")*(y^5) -
|
||||
rational("2387239013984400")*(y^4) -
|
||||
rational("23872390139844000")*(y^3) -
|
||||
rational("119361950699220000")*(y^2) -
|
||||
rational("298404876748050000")*y -
|
||||
tst_mfact( (y^25) -
|
||||
rational("3125")*(y^21) -
|
||||
rational("15630")*(y^20) +
|
||||
rational("3888750")*(y^17) +
|
||||
rational("38684375")*(y^16) +
|
||||
rational("95765635")*(y^15) -
|
||||
rational("2489846500")*(y^13) -
|
||||
rational("37650481875")*(y^12) -
|
||||
rational("190548065625")*(y^11) -
|
||||
rational("323785250010")*(y^10) +
|
||||
rational("750249453025")*(y^9) +
|
||||
rational("14962295699875")*(y^8) +
|
||||
rational("111775113235000")*(y^7) +
|
||||
rational("370399286731250")*(y^6) +
|
||||
rational("362903064503129")*(y^5) -
|
||||
rational("2387239013984400")*(y^4) -
|
||||
rational("23872390139844000")*(y^3) -
|
||||
rational("119361950699220000")*(y^2) -
|
||||
rational("298404876748050000")*y -
|
||||
rational("298500366308609376"), 2);
|
||||
|
||||
tst_mfact( rational("54")*(y^24) - (y^27) - 324*(y^21) + rational("17496")*(y^18) - 34992*(y^15)+ rational("1889568")*(y^12)- 1259712*(y^9) + rational("68024448")*(y^6), 3);
|
||||
|
||||
tst_mfact( ((y^3)- 432)*(((y^3)+54)^2)*((y^6)+108)*((y^6)+6912)*((y^6)- 324*(y^3)+37044),
|
||||
5);
|
||||
|
||||
|
||||
tst_mfact( ((y^6)- 6*(y^4) - 864*(y^3) + 12*(y^2) - 5184*y + 186616)*
|
||||
(((y^6) - 6*(y^4) + 108*(y^3) + 12*(y^2) + 648*y + 2908)^2)*
|
||||
((y^12) - 12*(y^10) + 60*(y^8) + 56*(y^6) + 6720*(y^4) + 12768*(y^2) + 13456)*
|
||||
|
@ -1175,13 +1195,13 @@ static void tst_mfact() {
|
|||
|
||||
static void tst_zp() {
|
||||
unsynch_mpz_manager z;
|
||||
polynomial::manager pm(z);
|
||||
|
||||
reslimit rl; polynomial::manager pm(rl, z);
|
||||
|
||||
polynomial_ref x(pm);
|
||||
polynomial_ref y(pm);
|
||||
x = pm.mk_polynomial(pm.mk_var());
|
||||
y = pm.mk_polynomial(pm.mk_var());
|
||||
|
||||
|
||||
polynomial_ref p(pm);
|
||||
polynomial_ref q(pm);
|
||||
p = (x^4) + 2*(x^3) + 2*(x^2) + x;
|
||||
|
@ -1200,11 +1220,11 @@ static void tst_zp() {
|
|||
std::cout << "q[Z_3]: " << q3 << "\n";
|
||||
std::cout << "gcd[Z_3]: " << gcd(p3, q3) << "\n";
|
||||
}
|
||||
|
||||
|
||||
std::cout << "back into Z[x,y]\ngcd: " << gcd(p, q) << "\n";
|
||||
|
||||
|
||||
p = 5*(x^2)*(y^2) + 3*(x^3) + 7*(y^3) + 3;
|
||||
{
|
||||
{
|
||||
polynomial::scoped_set_zp setZ11(pm, 11);
|
||||
polynomial_ref p11(pm);
|
||||
|
||||
|
@ -1219,7 +1239,7 @@ static void tst_zp() {
|
|||
std::cout << "gcd: " << gcd(p, q) << "\n";
|
||||
}
|
||||
|
||||
static void tst_translate(polynomial_ref const & p, polynomial::var x0, int v0, polynomial::var x1, int v1, polynomial::var x2, int v2,
|
||||
static void tst_translate(polynomial_ref const & p, polynomial::var x0, int v0, polynomial::var x1, int v1, polynomial::var x2, int v2,
|
||||
polynomial_ref const & expected) {
|
||||
std::cout << "---------------\n";
|
||||
std::cout << "p: " << p << std::endl;
|
||||
|
@ -1233,7 +1253,7 @@ static void tst_translate(polynomial_ref const & p, polynomial::var x0, int v0,
|
|||
|
||||
static void tst_translate() {
|
||||
unsynch_mpq_manager qm;
|
||||
polynomial::manager m(qm);
|
||||
reslimit rl; polynomial::manager m(rl, qm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -1254,7 +1274,7 @@ static void tst_translate() {
|
|||
tst_translate(x3 + 1, 0, 1, 1, 2, 3, 10,
|
||||
x3 + 11
|
||||
);
|
||||
tst_translate((x0^3)*(x1^2) + (x0^2)*(x1^3) + 10, 0, -3, 1, -2, 3, 0,
|
||||
tst_translate((x0^3)*(x1^2) + (x0^2)*(x1^3) + 10, 0, -3, 1, -2, 3, 0,
|
||||
(x0^3)*(x1^2) + (x0^2)*(x1^3) - 4*(x0^3)*x1 - 15*(x0^2)*(x1^2) - 6*x0*(x1^3) + 4*(x0^3) +
|
||||
48*(x0^2)*x1 + 63*x0*(x1^2) + 9*(x1^3) - 44*(x0^2) - 180*x0*x1 - 81*(x1^2) +
|
||||
156*x0 + 216*x1 - 170
|
||||
|
@ -1264,7 +1284,7 @@ static void tst_translate() {
|
|||
#if 0
|
||||
static void tst_p25() {
|
||||
unsynch_mpq_manager qm;
|
||||
polynomial::manager m(qm);
|
||||
reslimit rl; polynomial::manager m(rl, qm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -1288,10 +1308,11 @@ static void tst_p25() {
|
|||
static void tst_mm() {
|
||||
unsynch_mpq_manager qm;
|
||||
// pm1 and pm2 share the same monomial manager
|
||||
polynomial::manager * pm1_ptr = alloc(polynomial::manager, qm);
|
||||
reslimit rl;
|
||||
polynomial::manager * pm1_ptr = alloc(polynomial::manager, rl, qm);
|
||||
polynomial::manager & pm1 = *pm1_ptr;
|
||||
polynomial::manager pm2(qm, &pm1.mm());
|
||||
polynomial::manager pm3(qm); // pm3 has its own manager
|
||||
polynomial::manager pm2(rl, qm, &pm1.mm());
|
||||
polynomial::manager pm3(rl, qm); // pm3 has its own manager
|
||||
polynomial_ref p2(pm2);
|
||||
{
|
||||
polynomial_ref x0(pm1);
|
||||
|
@ -1302,7 +1323,7 @@ static void tst_mm() {
|
|||
x2 = pm1.mk_polynomial(pm1.mk_var());
|
||||
polynomial_ref p1(pm1);
|
||||
p1 = (x0 + x1 + x2)^2;
|
||||
|
||||
|
||||
std::cout << "p1: " << p1 << "\n";
|
||||
p2 = convert(pm1, p1, pm2);
|
||||
std::cout << "p2: " << p2 << "\n";
|
||||
|
@ -1317,7 +1338,7 @@ static void tst_mm() {
|
|||
std::cout << "p2: " << p2 << "\n";
|
||||
}
|
||||
|
||||
static void tst_eval(polynomial_ref const & p, polynomial::var x0, rational v0, polynomial::var x1, rational v1, polynomial::var x2, rational v2,
|
||||
static void tst_eval(polynomial_ref const & p, polynomial::var x0, rational v0, polynomial::var x1, rational v1, polynomial::var x2, rational v2,
|
||||
rational expected) {
|
||||
TRACE("eval_bug", tout << "tst_eval, " << p << "\n";);
|
||||
std::cout << "p: " << p << "\nx" << x0 << " -> " << v0 << "\nx" << x1 << " -> " << v1 << "\nx" << x2 << " -> " << v2 << "\n";
|
||||
|
@ -1336,7 +1357,7 @@ static void tst_eval(polynomial_ref const & p, polynomial::var x0, rational v0,
|
|||
|
||||
static void tst_eval() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -1369,7 +1390,7 @@ static void tst_eval() {
|
|||
|
||||
static void tst_mk_unique() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -1380,7 +1401,7 @@ static void tst_mk_unique() {
|
|||
polynomial_ref p(m);
|
||||
polynomial_ref q(m);
|
||||
polynomial_ref r(m);
|
||||
|
||||
|
||||
p = (x0^3) + (x2^5) + x0*x1 + x0*x1*x1 + 3*x0*x0 + 5;
|
||||
q = x0*x1*x1 + (x0^3) + 3*x0*x0 + (x2^5) + 5 + x0*x1;
|
||||
r = x0*x1*x1 + (x0^3) + 3*x0*x0 + (x2^5) + 6 + x0*x1;
|
||||
|
@ -1414,7 +1435,7 @@ static void tst_del_eh() {
|
|||
dummy_del_eh eh2;
|
||||
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
x0 = m.mk_polynomial(m.mk_var());
|
||||
|
@ -1423,7 +1444,7 @@ static void tst_del_eh() {
|
|||
m.add_del_eh(&eh1);
|
||||
x1 = 0;
|
||||
SASSERT(eh1.m_counter == 1);
|
||||
|
||||
|
||||
m.add_del_eh(&eh2);
|
||||
x1 = m.mk_polynomial(m.mk_var());
|
||||
x1 = 0;
|
||||
|
@ -1444,7 +1465,7 @@ static void tst_del_eh() {
|
|||
|
||||
static void tst_const_coeff() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
x0 = m.mk_polynomial(m.mk_var());
|
||||
|
@ -1453,7 +1474,7 @@ static void tst_const_coeff() {
|
|||
scoped_mpz c(nm);
|
||||
|
||||
polynomial_ref p(m);
|
||||
|
||||
|
||||
p = (x0^2)*x1 + 3*x0 + x1;
|
||||
SASSERT(!m.const_coeff(p, 0, 2, c));
|
||||
SASSERT(m.const_coeff(p, 0, 1, c) && c == 3);
|
||||
|
@ -1490,7 +1511,7 @@ static void tst_const_coeff() {
|
|||
static void tst_gcd2() {
|
||||
// enable_trace("mgcd");
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
polynomial_ref x1(m);
|
||||
polynomial_ref x2(m);
|
||||
|
@ -1525,11 +1546,11 @@ static void tst_gcd2() {
|
|||
(7*3*(x1^2) + 7*6*(x2^2) + 7*21*(x3^3))*(5*(x1^3) + 7*(x0^2) + 13),
|
||||
(3*(x1^2) + 6*(x2^2) + 21*(x3^3)));
|
||||
|
||||
tst_gcd((x2^6)*(x3^6) - 4*(x2^3)*(x3^6) + 2*(x2^6)*(x3^3) - 8*(x2^3)*(x3^3) + 4*(x1^3)*(x2^3)*(x3^3) - 8*(x1^3)*(x3^3) +
|
||||
tst_gcd((x2^6)*(x3^6) - 4*(x2^3)*(x3^6) + 2*(x2^6)*(x3^3) - 8*(x2^3)*(x3^3) + 4*(x1^3)*(x2^3)*(x3^3) - 8*(x1^3)*(x3^3) +
|
||||
4*(x3^6) + 8*(x3^3) + (x2^6) - 4*(x2^3) + 4*(x1^3)*(x2^3) - 8*(x1^3) + 4 + (x1^6),
|
||||
(-2)*(x2^3)*(x3^6) - 4*(x2^3)*(x3^3) + 4*(x3^6) + 8*(x3^3) - 2*(x1^3)*(x3^3) - 2*(x2^3) + 4 - 2*(x1^3),
|
||||
one);
|
||||
|
||||
|
||||
tst_gcd((x1^2) - 2*x0 + 1 + (x0^2) + x0*x1 - 2*x1,
|
||||
x0*x1,
|
||||
one);
|
||||
|
@ -1541,7 +1562,7 @@ static void tst_gcd2() {
|
|||
p = 169*(x1^12)*(x2^16) - 468*x0*(x1^11)*(x2^16) + 428*(x0^2)*(x1^10)*(x2^16) - 92*(x0^3)*(x1^9)*(x2^16) - 82*(x0^4)*(x1^8)*(x2^16) + 52*(x0^5)*(x1^7)*(x2^16) - 4*(x0^6)*(x1^6)*(x2^16) - 4*(x0^7)*(x1^5)*(x2^16) + (x0^8)*(x1^4)*(x2^16) - 581*(x1^14)*(x2^14) + 1828*x0*(x1^13)*(x2^14) - 2452*(x0^2)*(x1^12)*(x2^14) + 548*(x0^3)*(x1^11)*(x2^14) + 1002*(x0^4)*(x1^10)*(x2^14) - 756*(x0^5)*(x1^9)*(x2^14) + 124*(x0^6)*(x1^8)*(x2^14) + 44*(x0^7)*(x1^7)*(x2^14) - 13*(x0^8)*(x1^6)*(x2^14) + 895*(x1^16)*(x2^12) - 1556*x0*(x1^15)*(x2^12) + 2864*(x0^2)*(x1^14)*(x2^12);
|
||||
tst_gcd(p, derivative(p, 2), (x1^4)*(x2^11));
|
||||
|
||||
tst_gcd((11*5*3)*((x0^2) + 1)*(x1 + 3),
|
||||
tst_gcd((11*5*3)*((x0^2) + 1)*(x1 + 3),
|
||||
(11*5*7)*((x0^2) + 1)*(x1 + 5),
|
||||
(11*5)*((x0^2) + 1));
|
||||
|
||||
|
@ -1565,7 +1586,7 @@ static void tst_gcd2() {
|
|||
neg((-1)*(x0^2)*(x2^3)*(x3^6) + 2*x0*(x1^3)*(x2^3)*(x3^3) + (x0^3)*(x3^7) - (x1^6)*(x2^3) - 2*(x0^2)*(x1^3)*(x3^4) - (x0^3)*(x3^6) + x0*(x1^6)*x3 + 2*(x0^2)*(x1^3)*(x3^3) - 2*(x0^2)*(x2^3)*(x3^3) + 2*(x0^2)*(x3^6) - x0*(x1^6) + 2*x0*(x1^3)*(x2^3) - 4*x0*(x1^3)*(x3^3) + 2*(x0^3)*(x3^4) + 2*(x1^6) - 2*(x0^2)*(x1^3)*x3 - 2*(x0^3)*(x3^3) + 2*(x0^2)*(x1^3) - (x0^2)*(x2^3) + 4*(x0^2)*(x3^3) - 4*x0*(x1^3) + (x0^3)*x3 - (x0^3) + 2*(x0^2))
|
||||
);
|
||||
|
||||
tst_gcd(((11*5*3)*(x0^2) + 1)*(x1 + 3),
|
||||
tst_gcd(((11*5*3)*(x0^2) + 1)*(x1 + 3),
|
||||
((11*5*3)*(x0^2) + 1)*(x1 + 5),
|
||||
((11*5*3)*(x0^2) + 1));
|
||||
|
||||
|
@ -1582,7 +1603,7 @@ static void tst_gcd3() {
|
|||
enable_trace("polynomial_gcd_detail");
|
||||
enable_trace("mpzzp");
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
polynomial_ref p(m);
|
||||
|
@ -1607,7 +1628,7 @@ static void tst_gcd4() {
|
|||
enable_trace("mgcd");
|
||||
// enable_trace("CRA");
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
polynomial_ref p(m);
|
||||
|
@ -1626,12 +1647,12 @@ static void tst_gcd4() {
|
|||
(1000000*x + 1)*(333333333*x + 1)*(77777777*x + 1)*(11111111*x + 1)*(x + 128384747)*(x + 82837437)*(x + 22848481);
|
||||
tst_gcd(p, derivative(p, 0), (x + 3)^9);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static void tst_newton_interpolation() {
|
||||
// enable_trace("newton");
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
polynomial_ref y(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
|
@ -1654,7 +1675,7 @@ static void tst_newton_interpolation() {
|
|||
|
||||
static void tst_slow_mod_gcd() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m), x1(m), x2(m), x3(m), x4(m), x5(m);
|
||||
x0 = m.mk_polynomial(m.mk_var());
|
||||
x1 = m.mk_polynomial(m.mk_var());
|
||||
|
@ -1675,17 +1696,17 @@ static void tst_slow_mod_gcd() {
|
|||
tst_gcd(p, q, b);
|
||||
|
||||
return;
|
||||
p = (x0^8) *
|
||||
(((x0^3)*x1*x2*x3*x4*x5 + x0*(x1^3)*x2*x3*x4*x5 + x0*x1*(x2^3)*x3*x4*x5 + x0*x1*x2*(x3^3)*x4*x5 +
|
||||
p = (x0^8) *
|
||||
(((x0^3)*x1*x2*x3*x4*x5 + x0*(x1^3)*x2*x3*x4*x5 + x0*x1*(x2^3)*x3*x4*x5 + x0*x1*x2*(x3^3)*x4*x5 +
|
||||
x0*x1*x2*x3*(x4^3)*x5 + x0*x1*x2*x3*x4*(x5^3) - x0*x1*x2*x3*x4*x5 - 2)^2) *
|
||||
(((x0^3)*x1*x2*x3*x4*x5 + x0*(x1^3)*x2*x3*x4*x5 + x0*x1*(x2^3)*x3*x4*x5 + x0*x1*x2*(x3^3)*x4*x5 +
|
||||
(((x0^3)*x1*x2*x3*x4*x5 + x0*(x1^3)*x2*x3*x4*x5 + x0*x1*(x2^3)*x3*x4*x5 + x0*x1*x2*(x3^3)*x4*x5 +
|
||||
x0*x1*x2*x3*(x4^3)*x5 + x0*x1*x2*x3*x4*(x5^3) - x0*x1*x2*x3*x4*x5 + 2)^2);
|
||||
p_prime = derivative(p, 0);
|
||||
tst_gcd(p, p_prime,
|
||||
(x0^7) *
|
||||
((x0^3)*x1*x2*x3*x4*x5 + x0*(x1^3)*x2*x3*x4*x5 + x0*x1*(x2^3)*x3*x4*x5 + x0*x1*x2*(x3^3)*x4*x5 +
|
||||
x0*x1*x2*x3*(x4^3)*x5 + x0*x1*x2*x3*x4*(x5^3) - x0*x1*x2*x3*x4*x5 - 2) *
|
||||
((x0^3)*x1*x2*x3*x4*x5 + x0*(x1^3)*x2*x3*x4*x5 + x0*x1*(x2^3)*x3*x4*x5 + x0*x1*x2*(x3^3)*x4*x5 +
|
||||
(x0^7) *
|
||||
((x0^3)*x1*x2*x3*x4*x5 + x0*(x1^3)*x2*x3*x4*x5 + x0*x1*(x2^3)*x3*x4*x5 + x0*x1*x2*(x3^3)*x4*x5 +
|
||||
x0*x1*x2*x3*(x4^3)*x5 + x0*x1*x2*x3*x4*(x5^3) - x0*x1*x2*x3*x4*x5 - 2) *
|
||||
((x0^3)*x1*x2*x3*x4*x5 + x0*(x1^3)*x2*x3*x4*x5 + x0*x1*(x2^3)*x3*x4*x5 + x0*x1*x2*(x3^3)*x4*x5 +
|
||||
x0*x1*x2*x3*(x4^3)*x5 + x0*x1*x2*x3*x4*(x5^3) - x0*x1*x2*x3*x4*x5 + 2));
|
||||
}
|
||||
|
||||
|
@ -1698,7 +1719,7 @@ void tst_linear_solver() {
|
|||
|
||||
solver.resize(3);
|
||||
xs.resize(3);
|
||||
|
||||
|
||||
as.reset();
|
||||
as.push_back(mpq(2)); as.push_back(mpq(1)); as.push_back(mpq(-1)); qm.set(b, 8);
|
||||
solver.add(0, as.c_ptr(), b);
|
||||
|
@ -1710,7 +1731,7 @@ void tst_linear_solver() {
|
|||
as.reset();
|
||||
as.push_back(mpq(-2)); as.push_back(mpq(1)); as.push_back(mpq(2)); qm.set(b, -3);
|
||||
solver.add(2, as.c_ptr(), b);
|
||||
|
||||
|
||||
VERIFY(solver.solve(xs.c_ptr()));
|
||||
SASSERT(qm.eq(xs[0], mpq(2)));
|
||||
SASSERT(qm.eq(xs[1], mpq(3)));
|
||||
|
@ -1719,7 +1740,7 @@ void tst_linear_solver() {
|
|||
|
||||
static void tst_lex(polynomial_ref const & p1, polynomial_ref const & p2, int lex_expected, polynomial::var min, int lex2_expected) {
|
||||
polynomial::manager & m = p1.m();
|
||||
std::cout << "compare ";
|
||||
std::cout << "compare ";
|
||||
m.display(std::cout, m.get_monomial(p1, 0));
|
||||
std::cout << " ";
|
||||
m.display(std::cout, m.get_monomial(p2, 0));
|
||||
|
@ -1735,7 +1756,7 @@ static void tst_lex(polynomial_ref const & p1, polynomial_ref const & p2, int le
|
|||
|
||||
static void tst_lex() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m), x1(m), x2(m), x3(m), x4(m), x5(m);
|
||||
x0 = m.mk_polynomial(m.mk_var());
|
||||
x1 = m.mk_polynomial(m.mk_var());
|
||||
|
@ -1743,13 +1764,13 @@ static void tst_lex() {
|
|||
x3 = m.mk_polynomial(m.mk_var());
|
||||
x4 = m.mk_polynomial(m.mk_var());
|
||||
x5 = m.mk_polynomial(m.mk_var());
|
||||
|
||||
|
||||
polynomial_ref one(m);
|
||||
one = m.mk_const(mpz(1));
|
||||
|
||||
tst_lex(x0*x4*x1, (x0^10)*(x1^3), 1, 4, -1);
|
||||
tst_lex(x0*x3*(x1^2)*x4, x0*(x3^2)*(x1^2)*x4, -1, 3, -1);
|
||||
tst_lex((x0^2)*x3*(x1^2)*x4, x0*(x3^2)*(x1^2)*x4, -1, 3, 1);
|
||||
tst_lex((x0^2)*x3*(x1^2)*x4, x0*(x3^2)*(x1^2)*x4, -1, 3, 1);
|
||||
tst_lex(x0*x3*(x1^2)*x4, x0*x3*(x1^2)*x4, 0, 3, 0);
|
||||
tst_lex(x0*(x3^2)*(x1^2)*x4, x0*x3*(x1^2)*x4, 1, 3, 1);
|
||||
tst_lex((x1^2)*x4, x0*x2*x3*x4*x5, -1, 1, -1);
|
||||
|
@ -1772,18 +1793,18 @@ static void tst_lex() {
|
|||
|
||||
static void tst_divides() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
reslimit rl; polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
x0 = m.mk_polynomial(m.mk_var());
|
||||
polynomial_ref q(m);
|
||||
polynomial_ref p(m);
|
||||
|
||||
q = 16*(x0^27) - 1984*(x0^26) + 1762*(x0^25) + 17351*(x0^24) - 14165*(x0^23) + 16460*(x0^22) + 2919*(x0^21) - 16823*(x0^20) + 1530*(x0^19) +
|
||||
q = 16*(x0^27) - 1984*(x0^26) + 1762*(x0^25) + 17351*(x0^24) - 14165*(x0^23) + 16460*(x0^22) + 2919*(x0^21) - 16823*(x0^20) + 1530*(x0^19) +
|
||||
10646*(x0^18) + 19217*(x0^17);
|
||||
p = 16*(x0^39) - 3648*(x0^38) + 338136*(x0^37) - 16037936*(x0^36) + 392334357*(x0^35) - rational("3851617443")*(x0^34) -
|
||||
rational("14636221526")*(x0^33) + rational("377151717618")*(x0^32) + rational("677140776981")*(x0^31) - rational("4308280094419")*(x0^30) +
|
||||
rational("312708087606")*(x0^29) + rational("8205543533730")*(x0^28) + rational("3331586202704")*(x0^27) - rational("15291636627072")*(x0^26) +
|
||||
rational("433482645282")*(x0^25) + rational("7397104817486")*(x0^24) + rational("1021197979053")*(x0^23) - rational("1373737505247")*(x0^22) -
|
||||
p = 16*(x0^39) - 3648*(x0^38) + 338136*(x0^37) - 16037936*(x0^36) + 392334357*(x0^35) - rational("3851617443")*(x0^34) -
|
||||
rational("14636221526")*(x0^33) + rational("377151717618")*(x0^32) + rational("677140776981")*(x0^31) - rational("4308280094419")*(x0^30) +
|
||||
rational("312708087606")*(x0^29) + rational("8205543533730")*(x0^28) + rational("3331586202704")*(x0^27) - rational("15291636627072")*(x0^26) +
|
||||
rational("433482645282")*(x0^25) + rational("7397104817486")*(x0^24) + rational("1021197979053")*(x0^23) - rational("1373737505247")*(x0^22) -
|
||||
rational("639394669026")*(x0^21) - rational("118513560618")*(x0^20) - rational("10405319535")*(x0^19) - rational("358722675")*(x0^18);
|
||||
std::cout << "----------------------\n";
|
||||
std::cout << "q: " << q << "\n";
|
||||
|
@ -1813,7 +1834,7 @@ void tst_polynomial() {
|
|||
tst_linear_solver();
|
||||
tst_newton_interpolation();
|
||||
tst_resultant();
|
||||
//
|
||||
//
|
||||
// tst_gcd4();
|
||||
// tst_gcd3();
|
||||
tst_zp();
|
||||
|
|
|
@ -19,7 +19,7 @@ Notes:
|
|||
#include"upolynomial_factorization_int.h"
|
||||
#include"timeit.h"
|
||||
#include"polynomial.h"
|
||||
|
||||
#include"rlimit.h"
|
||||
#if 0
|
||||
#include"polynomial_factorization.h"
|
||||
#endif
|
||||
|
@ -41,30 +41,30 @@ unsigned knuth_factors[2][11] = {
|
|||
|
||||
// [k,l,i]: how many factors the S_k has over p_i, when i = 0 it's Z, p_1 = 2, for l=0 distinct, for l = 1 total
|
||||
unsigned swinnerton_dyer_factors[5][2][11] = {
|
||||
// S1 = (x^2) - 2
|
||||
// S1 = (x^2) - 2
|
||||
{
|
||||
// 2, 3, 5, 7,11,13,17,19,23,29, Z
|
||||
// 2, 3, 5, 7,11,13,17,19,23,29, Z
|
||||
{1, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1},
|
||||
{2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1}
|
||||
},
|
||||
// S2 = (x^4) - 10*(x^2) + 1
|
||||
// S2 = (x^4) - 10*(x^2) + 1
|
||||
{
|
||||
{1, 1, 2, 2, 2, 2, 2, 2, 4, 2, 1},
|
||||
{4, 2, 2, 2, 2, 2, 2, 2, 4, 2, 1}
|
||||
},
|
||||
// S3 = (x^8) - 40*(x^6) + 352*(x^4) - 960*(x^2) + 576
|
||||
// S3 = (x^8) - 40*(x^6) + 352*(x^4) - 960*(x^2) + 576
|
||||
{
|
||||
{1, 2, 2, 4, 4, 4, 4, 4, 4, 4, 1},
|
||||
{8, 6, 4, 4, 4, 4, 4, 4, 4, 4, 1}
|
||||
},
|
||||
// S4 = (x^16) - 136*(x^14) + 6476*(x^12) - 141912*(x^10) + 1513334*(x^8) - 7453176*(x^6) + 13950764*(x^4) - 5596840*(x^2) + 46225
|
||||
// S4 = (x^16) - 136*(x^14) + 6476*(x^12) - 141912*(x^10) + 1513334*(x^8) - 7453176*(x^6) + 13950764*(x^4) - 5596840*(x^2) + 46225
|
||||
{
|
||||
{1, 4, 3, 4, 8, 8, 8, 8, 8, 8, 1},
|
||||
{16, 12, 10, 8, 8, 8, 8, 8, 8, 8, 1}
|
||||
},
|
||||
// SA = S1*S2*S3*S4
|
||||
{
|
||||
//p = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, Z
|
||||
//p = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, Z
|
||||
{ 2, 6, 3, 6, 15, 11, 16, 15, 18, 15, 1},
|
||||
{30, 21, 17, 16, 15, 15, 16, 15, 18, 15, 1}
|
||||
}
|
||||
|
@ -176,17 +176,17 @@ int random_polynomial[20][2][11] = {
|
|||
#if 0
|
||||
static void tst_square_free_finite_1() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager pm(nm);
|
||||
reslimit rl; polynomial::manager pm(rl, nm);
|
||||
|
||||
// example from Knuth, p. 442
|
||||
polynomial_ref x(pm);
|
||||
x = pm.mk_polynomial(pm.mk_var());
|
||||
|
||||
// polynomials \prod_{i < p} (x - i)^i
|
||||
for (unsigned prime_i = 0; prime_i < 5; ++ prime_i)
|
||||
for (unsigned prime_i = 0; prime_i < 5; ++ prime_i)
|
||||
{
|
||||
int p = primes[prime_i];
|
||||
|
||||
|
||||
// make the polynomial
|
||||
polynomial_ref f(pm);
|
||||
f = x - 1;
|
||||
|
@ -222,19 +222,19 @@ static void tst_square_free_finite_1() {
|
|||
}
|
||||
|
||||
static void tst_factor_finite_1() {
|
||||
|
||||
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager pm(nm);
|
||||
reslimit rl; polynomial::manager pm(rl, nm);
|
||||
|
||||
// example from Knuth, p. 442
|
||||
polynomial_ref x(pm);
|
||||
x = pm.mk_polynomial(pm.mk_var());
|
||||
polynomial_ref K(pm);
|
||||
K = (x^8) + (x^6) + 10*(x^4) + 10*(x^3) + 8*(x^2) + 2*x + 8;
|
||||
|
||||
|
||||
// factor them for all the prime numbers
|
||||
for (unsigned prime_i = 0; prime_i < sizeof(primes)/sizeof(unsigned); ++ prime_i)
|
||||
{
|
||||
for (unsigned prime_i = 0; prime_i < sizeof(primes)/sizeof(unsigned); ++ prime_i)
|
||||
{
|
||||
// make the Z_p
|
||||
unsigned prime = primes[prime_i];
|
||||
upolynomial::zp_manager upm(nm);
|
||||
|
@ -246,35 +246,35 @@ static void tst_factor_finite_1() {
|
|||
|
||||
cout << "Factoring " << K << "("; upm.display(cout, K_u); cout << ") in Z_" << prime << endl;
|
||||
cout << "Expecting " << knuth_factors[0][prime_i] << " distinct factors, " << knuth_factors[1][prime_i] << " total" << endl;
|
||||
|
||||
|
||||
// factor it
|
||||
upolynomial::zp_factors factors(upm);
|
||||
upolynomial::zp_factors factors(upm);
|
||||
/* bool factorized = */ upolynomial::zp_factor(upm, K_u, factors);
|
||||
|
||||
|
||||
// check the result
|
||||
unsigned distinct = factors.distinct_factors();
|
||||
unsigned total = factors.total_factors();
|
||||
unsigned total = factors.total_factors();
|
||||
|
||||
cout << "Got " << factors << endl;
|
||||
cout << "Thats " << distinct << " distinct factors, " << total << " total" << endl;
|
||||
|
||||
SASSERT(knuth_factors[0][prime_i] == distinct);
|
||||
SASSERT(knuth_factors[1][prime_i] == total);
|
||||
|
||||
|
||||
upolynomial::numeral_vector multiplied;
|
||||
factors.multiply(multiplied);
|
||||
SASSERT(upm.eq(K_u, multiplied));
|
||||
upm.reset(multiplied);
|
||||
|
||||
|
||||
// remove the temp
|
||||
upm.reset(K_u);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void tst_factor_finite_2() {
|
||||
|
||||
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager pm(nm);
|
||||
reslimit rl; polynomial::manager pm(rl, nm);
|
||||
|
||||
polynomial_ref x(pm);
|
||||
x = pm.mk_polynomial(pm.mk_var());
|
||||
|
@ -284,7 +284,7 @@ static void tst_factor_finite_2() {
|
|||
polynomial_ref S2 = (x^4) - 10*(x^2) + 1;
|
||||
polynomial_ref S3 = (x^8) - 40*(x^6) + 352*(x^4) - 960*(x^2) + 576;
|
||||
polynomial_ref S4 = (x^16) - 136*(x^14) + 6476*(x^12) - 141912*(x^10) + 1513334*(x^8) - 7453176*(x^6) + 13950764*(x^4) - 5596840*(x^2) + 46225;
|
||||
|
||||
|
||||
vector<polynomial_ref> S;
|
||||
S.push_back(S1);
|
||||
S.push_back(S2);
|
||||
|
@ -294,9 +294,9 @@ static void tst_factor_finite_2() {
|
|||
|
||||
// factor all the S_i them for all the prime numbers
|
||||
for (unsigned S_i = 0; S_i < S.size(); ++ S_i) {
|
||||
for (unsigned prime_i = 0; prime_i < sizeof(primes)/sizeof(unsigned); ++ prime_i) {
|
||||
unsigned prime = primes[prime_i];
|
||||
|
||||
for (unsigned prime_i = 0; prime_i < sizeof(primes)/sizeof(unsigned); ++ prime_i) {
|
||||
unsigned prime = primes[prime_i];
|
||||
|
||||
upolynomial::zp_manager upm(nm);
|
||||
upm.set_zp(prime);
|
||||
|
||||
|
@ -308,22 +308,22 @@ static void tst_factor_finite_2() {
|
|||
|
||||
upolynomial::zp_factors factors(upm);
|
||||
upolynomial::zp_factor(upm, S_i_u, factors);
|
||||
|
||||
|
||||
// check the result
|
||||
unsigned distinct = factors.distinct_factors();
|
||||
unsigned total = factors.total_factors();
|
||||
unsigned total = factors.total_factors();
|
||||
|
||||
cout << "Got " << factors << endl;
|
||||
cout << "Thats " << distinct << " distinct factors, " << total << " total" << endl;
|
||||
|
||||
SASSERT(swinnerton_dyer_factors[S_i][0][prime_i] == distinct);
|
||||
SASSERT(swinnerton_dyer_factors[S_i][1][prime_i] == total);
|
||||
|
||||
|
||||
upolynomial::numeral_vector multiplied;
|
||||
factors.multiply(multiplied);
|
||||
SASSERT(upm.eq(S_i_u, multiplied));
|
||||
upm.reset(multiplied);
|
||||
|
||||
|
||||
// remove the temp
|
||||
upm.reset(S_i_u);
|
||||
}
|
||||
|
@ -331,9 +331,9 @@ static void tst_factor_finite_2() {
|
|||
}
|
||||
|
||||
static void tst_factor_finite_3() {
|
||||
|
||||
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager pm(nm);
|
||||
reslimit rl; polynomial::manager pm(rl, nm);
|
||||
|
||||
polynomial_ref x(pm);
|
||||
x = pm.mk_polynomial(pm.mk_var());
|
||||
|
@ -360,15 +360,15 @@ static void tst_factor_finite_3() {
|
|||
random_p.push_back( 3*(x^10) + 2*(x^8) + 1*(x^7) + 1*(x^6) + 3*(x^4) + 3*(x^3) + 4*(x^2) + 3*x + 0 );
|
||||
random_p.push_back( 1*(x^10) + 2*(x^9) + 2*(x^6) + 4*(x^3) + 4*(x^2) + 0 );
|
||||
random_p.push_back( 1*(x^10) + 2*(x^9) + 2*(x^8) + 4*(x^7) + 4*(x^6) + 1*(x^5) + 1*(x^3) + 1*(x^2) + 3*x + 0 );
|
||||
|
||||
|
||||
// factor all the randoms them for all the prime numbers
|
||||
for (unsigned random_i = 0; random_i < random_p.size(); ++ random_i) {
|
||||
for (unsigned prime_i = 0; prime_i < sizeof(primes)/sizeof(unsigned); ++ prime_i) {
|
||||
unsigned prime = primes[prime_i];
|
||||
|
||||
for (unsigned prime_i = 0; prime_i < sizeof(primes)/sizeof(unsigned); ++ prime_i) {
|
||||
unsigned prime = primes[prime_i];
|
||||
|
||||
upolynomial::zp_manager upm(nm);
|
||||
upm.set_zp(prime);
|
||||
|
||||
|
||||
upolynomial::numeral_vector poly;
|
||||
upm.to_numeral_vector(random_p[random_i], poly);
|
||||
|
||||
|
@ -377,24 +377,24 @@ static void tst_factor_finite_3() {
|
|||
|
||||
upolynomial::zp_factors factors(upm);
|
||||
upolynomial::zp_factor(upm, poly, factors);
|
||||
|
||||
|
||||
// check the result
|
||||
unsigned distinct = factors.distinct_factors();
|
||||
unsigned total = factors.total_factors();
|
||||
unsigned total = factors.total_factors();
|
||||
|
||||
cout << "Got " << factors << endl;
|
||||
cout << "Thats " << distinct << " distinct factors, " << total << " total" << endl;
|
||||
|
||||
// SASSERT(random_polynomial[random_i][0][prime_i] == distinct);
|
||||
// SASSERT(random_polynomial[random_i][1][prime_i] == total);
|
||||
|
||||
|
||||
upolynomial::numeral_vector multiplied;
|
||||
factors.multiply(multiplied);
|
||||
bool equal = upm.eq(poly, multiplied);
|
||||
cout << (equal ? "equal" : "not equal") << endl;
|
||||
SASSERT(equal);
|
||||
upm.reset(multiplied);
|
||||
|
||||
|
||||
// remove the temp
|
||||
upm.reset(poly);
|
||||
}
|
||||
|
@ -403,11 +403,11 @@ static void tst_factor_finite_3() {
|
|||
|
||||
static void tst_factor_enumeration() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager pm(nm);
|
||||
reslimit rl; polynomial::manager pm(rl, nm);
|
||||
|
||||
polynomial_ref x(pm);
|
||||
x = pm.mk_polynomial(pm.mk_var());
|
||||
|
||||
|
||||
vector<polynomial_ref> factors;
|
||||
for (int i = 0; i < 5; ++ i) {
|
||||
polynomial_ref factor(pm);
|
||||
|
@ -419,12 +419,12 @@ static void tst_factor_enumeration() {
|
|||
|
||||
upolynomial::zp_manager upm_13(nm);
|
||||
upm_13.set_zp(13);
|
||||
upolynomial::zp_factors factors_13(upm_13);
|
||||
|
||||
upolynomial::zp_factors factors_13(upm_13);
|
||||
|
||||
upolynomial::numeral constant;
|
||||
nm.set(constant, 10);
|
||||
factors_13.set_constant(constant);
|
||||
|
||||
|
||||
for (unsigned i = 0; i < 5; ++ i) {
|
||||
upolynomial::numeral_vector ufactor;
|
||||
upm_13.to_numeral_vector(factors[i], ufactor);
|
||||
|
@ -463,7 +463,7 @@ static void tst_factor_enumeration() {
|
|||
factors_13.set_degree(i, factors_13.get_degree(i) + i);
|
||||
}
|
||||
cout << "Different: " << factors_13 << " of degree " << factors_13.get_degree() << endl;
|
||||
upolynomial::factorization_degree_set degrees1(factors_13);
|
||||
upolynomial::factorization_degree_set degrees1(factors_13);
|
||||
degrees1.display(cout); cout << endl; // [0, ..., 15]
|
||||
|
||||
polynomial_ref tmp1 = (x^3) + 1;
|
||||
|
@ -482,15 +482,15 @@ static void tst_factor_enumeration() {
|
|||
upm_13.reset(up3);
|
||||
|
||||
cout << "Different: " << tmp << " of degree " << tmp.get_degree() << endl;
|
||||
upolynomial::factorization_degree_set degrees2(tmp);
|
||||
degrees2.display(cout); cout << endl;
|
||||
upolynomial::factorization_degree_set degrees2(tmp);
|
||||
degrees2.display(cout); cout << endl;
|
||||
|
||||
tmp1 = (x^2) + 1;
|
||||
tmp2 = (x^10) + 2;
|
||||
tmp3 = x + 3;
|
||||
tmp3 = x + 3;
|
||||
upm_13.to_numeral_vector(tmp1, up1);
|
||||
upm_13.to_numeral_vector(tmp2, up2);
|
||||
upm_13.to_numeral_vector(tmp3, up3);
|
||||
upm_13.to_numeral_vector(tmp3, up3);
|
||||
tmp.clear();
|
||||
tmp.push_back(up1, 2);
|
||||
tmp.push_back(up2, 1);
|
||||
|
@ -499,23 +499,23 @@ static void tst_factor_enumeration() {
|
|||
upm_13.reset(up1);
|
||||
upm_13.reset(up2);
|
||||
upm_13.reset(up3);
|
||||
upolynomial::factorization_degree_set degrees3(tmp);
|
||||
degrees3.display(cout); cout << endl;
|
||||
upolynomial::factorization_degree_set degrees3(tmp);
|
||||
degrees3.display(cout); cout << endl;
|
||||
degrees1.intersect(degrees3);
|
||||
degrees1.display(cout); cout << endl;
|
||||
}
|
||||
|
||||
static void tst_factor_square_free_univariate_1(unsigned max_length) {
|
||||
|
||||
polynomial::numeral_manager nm;
|
||||
|
||||
polynomial::numeral_manager nm;
|
||||
upolynomial::numeral test;
|
||||
upolynomial::numeral p;
|
||||
nm.set(test, -9);
|
||||
nm.set(p, 5);
|
||||
nm.mod(test, p, test);
|
||||
|
||||
polynomial::manager pm(nm);
|
||||
|
||||
reslimit rl; polynomial::manager pm(rl, nm);
|
||||
|
||||
polynomial_ref x(pm);
|
||||
x = pm.mk_polynomial(pm.mk_var());
|
||||
|
||||
|
@ -527,8 +527,8 @@ static void tst_factor_square_free_univariate_1(unsigned max_length) {
|
|||
for(unsigned length = 1; length < max_length; ++ length) {
|
||||
|
||||
// starting from prime_i going for length
|
||||
for(unsigned start_i = 0; start_i < n_primes; ++ start_i) {
|
||||
|
||||
for(unsigned start_i = 0; start_i < n_primes; ++ start_i) {
|
||||
|
||||
polynomial_ref f(pm);
|
||||
|
||||
bool first = true;
|
||||
|
@ -541,18 +541,18 @@ static void tst_factor_square_free_univariate_1(unsigned max_length) {
|
|||
} else {
|
||||
f = f*(p1*(x^p2) - p2);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
upolynomial::manager upm(nm);
|
||||
scoped_mpz_vector f_u(nm);
|
||||
upm.to_numeral_vector(f, f_u);
|
||||
|
||||
|
||||
cout << "factoring "; upm.display(cout, f_u); cout << endl;
|
||||
cout << "expecting " << length << " factors ";
|
||||
upolynomial::factors factors(upm);
|
||||
/* bool ok = */ upolynomial::factor_square_free(upm, f_u, factors);
|
||||
/* bool ok = */ upolynomial::factor_square_free(upm, f_u, factors);
|
||||
cout << "got " << factors << endl;
|
||||
|
||||
|
||||
SASSERT(factors.distinct_factors() == length);
|
||||
}
|
||||
}
|
||||
|
@ -560,7 +560,7 @@ static void tst_factor_square_free_univariate_1(unsigned max_length) {
|
|||
|
||||
static void tst_factor_square_free_univariate_2() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager pm(nm);
|
||||
reslimit rl; polynomial::manager pm(rl, nm);
|
||||
|
||||
polynomial_ref x(pm);
|
||||
x = pm.mk_polynomial(pm.mk_var());
|
||||
|
@ -570,7 +570,7 @@ static void tst_factor_square_free_univariate_2() {
|
|||
polynomial_ref S2 = (x^4) - 10*(x^2) + 1;
|
||||
polynomial_ref S3 = (x^8) - 40*(x^6) + 352*(x^4) - 960*(x^2) + 576;
|
||||
polynomial_ref S4 = (x^16) - 136*(x^14) + 6476*(x^12) - 141912*(x^10) + 1513334*(x^8) - 7453176*(x^6) + 13950764*(x^4) - 5596840*(x^2) + 46225;
|
||||
|
||||
|
||||
vector<polynomial_ref> S;
|
||||
S.push_back(S1);
|
||||
S.push_back(S2);
|
||||
|
@ -580,17 +580,17 @@ static void tst_factor_square_free_univariate_2() {
|
|||
upolynomial::manager upm(nm);
|
||||
|
||||
// factor all the S_i them for all the prime numbers
|
||||
for (unsigned S_i = 0; S_i < S.size(); ++ S_i) {
|
||||
for (unsigned S_i = 0; S_i < S.size(); ++ S_i) {
|
||||
upolynomial::numeral_vector S_i_u;
|
||||
upm.to_numeral_vector(S[S_i], S_i_u);
|
||||
|
||||
cout << "Factoring "; upm.display(cout, S_i_u); cout << " over Z " << endl;
|
||||
upolynomial::factors factors(upm);
|
||||
upolynomial::factor_square_free(upm, S_i_u, factors);
|
||||
|
||||
|
||||
// check the result
|
||||
cout << "Got " << factors << endl;
|
||||
|
||||
|
||||
// remove the temp
|
||||
upm.reset(S_i_u);
|
||||
}
|
||||
|
@ -598,31 +598,31 @@ static void tst_factor_square_free_univariate_2() {
|
|||
|
||||
static void tst_factor_square_free_univariate_3() {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager pm(nm);
|
||||
reslimit rl; polynomial::manager pm(rl, nm);
|
||||
|
||||
polynomial_ref x(pm);
|
||||
x = pm.mk_polynomial(pm.mk_var());
|
||||
|
||||
polynomial_ref deg70 = (x^70) - 6*(x^65) - (x^60) + 60*(x^55) - 54*(x^50) - 230*(x^45) + 274*(x^40) + 542*(x^35) - 615*(x^30) - 1120*(x^25) + 1500*(x^20) - 160*(x^15) - 395*(x^10) + 76*(x^5) + 34;
|
||||
|
||||
|
||||
upolynomial::manager upm(nm);
|
||||
upolynomial::numeral_vector deg70_u;
|
||||
|
||||
|
||||
upm.to_numeral_vector(deg70, deg70_u);
|
||||
|
||||
cout << "Factoring "; upm.display(cout, deg70_u); cout << " over Z " << endl;
|
||||
upolynomial::factors factors(upm);
|
||||
upolynomial::factor_square_free(upm, deg70_u, factors);
|
||||
|
||||
|
||||
cout << "Got " << factors << endl;
|
||||
|
||||
|
||||
upm.reset(deg70_u);
|
||||
}
|
||||
#endif
|
||||
|
||||
void tst_factor_swinnerton_dyer_big(unsigned max) {
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager pm(nm);
|
||||
reslimit rl; polynomial::manager pm(rl, nm);
|
||||
|
||||
polynomial_ref x(pm);
|
||||
x = pm.mk_polynomial(pm.mk_var());
|
||||
|
@ -631,8 +631,8 @@ void tst_factor_swinnerton_dyer_big(unsigned max) {
|
|||
vector<polynomial::var> vars;
|
||||
|
||||
unsigned n = std::min(max, static_cast<unsigned>(sizeof(primes)/sizeof(unsigned)));
|
||||
for(unsigned prime_i = 0; prime_i < n; ++ prime_i) {
|
||||
|
||||
for(unsigned prime_i = 0; prime_i < n; ++ prime_i) {
|
||||
|
||||
int prime = primes[prime_i];
|
||||
|
||||
cout << "Computing Swinnerton-Dyer[" << prime_i + 1 << "]" << endl;
|
||||
|
@ -643,7 +643,7 @@ void tst_factor_swinnerton_dyer_big(unsigned max) {
|
|||
|
||||
polynomial_ref p(pm);
|
||||
p = (y^2) - prime;
|
||||
roots.push_back(p);
|
||||
roots.push_back(p);
|
||||
|
||||
polynomial_ref computation = x;
|
||||
for (unsigned i = 0; i < roots.size(); ++ i) {
|
||||
|
@ -663,17 +663,18 @@ void tst_factor_swinnerton_dyer_big(unsigned max) {
|
|||
}
|
||||
|
||||
cout << "Computed Swinnerton-Dyer[" << prime_i + 1 << "], degree = " << pm.total_degree(computation) << ", size = " << pm.size(computation) << endl;
|
||||
|
||||
|
||||
cout << "Starting factoring " << endl;
|
||||
|
||||
|
||||
{
|
||||
timeit timer(true, "factoring swinnerton-dyer");
|
||||
|
||||
upolynomial::manager upm(nm);
|
||||
scoped_mpz_vector sd_u(nm);
|
||||
upm.to_numeral_vector(computation, sd_u);
|
||||
reslimit rl;
|
||||
upolynomial::manager upm(rl, nm);
|
||||
scoped_mpz_vector sd_u(nm);
|
||||
upm.to_numeral_vector(computation, sd_u);
|
||||
upolynomial::factors factors(upm);
|
||||
upolynomial::factor_square_free(upm, sd_u, factors);
|
||||
upolynomial::factor_square_free(upm, sd_u, factors);
|
||||
cout << "Got " << factors.distinct_factors() << " factors" << endl;
|
||||
}
|
||||
|
||||
|
@ -681,16 +682,16 @@ void tst_factor_swinnerton_dyer_big(unsigned max) {
|
|||
}
|
||||
|
||||
static void tst_factor_square_free_multivariate_1(unsigned max_n) {
|
||||
#if 0
|
||||
polynomial::numeral_manager nm;
|
||||
#if 0
|
||||
polynomial::numeral_manager nm;
|
||||
upolynomial::numeral test;
|
||||
upolynomial::numeral p;
|
||||
nm.set(test, -9);
|
||||
nm.set(p, 5);
|
||||
nm.mod(test, p, test);
|
||||
|
||||
polynomial::manager pm(nm);
|
||||
|
||||
reslimit rl; polynomial::manager pm(rl, nm);
|
||||
|
||||
polynomial_ref x(pm);
|
||||
x = pm.mk_polynomial(pm.mk_var());
|
||||
|
||||
|
@ -700,7 +701,7 @@ static void tst_factor_square_free_multivariate_1(unsigned max_n) {
|
|||
// lets start simple x^n - y^n
|
||||
for (unsigned prime_i = 0; prime_i < sizeof(primes)/sizeof(unsigned); ++ prime_i) {
|
||||
unsigned prime = primes[prime_i];
|
||||
|
||||
|
||||
if (prime > max_n) {
|
||||
break;
|
||||
}
|
||||
|
@ -719,7 +720,7 @@ static void tst_factor_square_free_multivariate_1(unsigned max_n) {
|
|||
|
||||
|
||||
void tst_polynomial_factorization() {
|
||||
|
||||
|
||||
enable_trace("polynomial::factorization");
|
||||
// enable_trace("polynomial::factorization::bughunt");
|
||||
enable_trace("polynomial::factorization::multivariate");
|
||||
|
@ -727,12 +728,12 @@ void tst_polynomial_factorization() {
|
|||
|
||||
// Z_p square-free factorization tests
|
||||
// tst_square_free_finite_1();
|
||||
|
||||
|
||||
// Z_p factorization tests
|
||||
// tst_factor_finite_1();
|
||||
// tst_factor_finite_2();
|
||||
// tst_factor_finite_3();
|
||||
|
||||
|
||||
// Z factorization
|
||||
// tst_factor_enumeration();
|
||||
// tst_factor_square_free_univariate_1(3);
|
||||
|
|
|
@ -18,10 +18,12 @@ Notes:
|
|||
--*/
|
||||
#include"realclosure.h"
|
||||
#include"mpz_matrix.h"
|
||||
#include"rlimit.h"
|
||||
|
||||
static void tst1() {
|
||||
unsynch_mpq_manager qm;
|
||||
rcmanager m(qm);
|
||||
reslimit rl;
|
||||
rcmanager m(rl, qm);
|
||||
scoped_rcnumeral a(m);
|
||||
#if 0
|
||||
a = 10;
|
||||
|
@ -37,14 +39,14 @@ static void tst1() {
|
|||
qm.set(aux, 1, 3);
|
||||
m.set(a, aux);
|
||||
|
||||
#if 0
|
||||
#if 0
|
||||
std::cout << interval_pp(a) << std::endl;
|
||||
std::cout << decimal_pp(eps, 4) << std::endl;
|
||||
std::cout << decimal_pp(a) << std::endl;
|
||||
std::cout << a + eps << std::endl;
|
||||
std::cout << a * eps << std::endl;
|
||||
std::cout << (a + eps)*eps - eps << std::endl;
|
||||
#endif
|
||||
#endif
|
||||
std::cout << interval_pp(a - eps*2) << std::endl;
|
||||
std::cout << interval_pp(eps + 1) << std::endl;
|
||||
scoped_rcnumeral t(m);
|
||||
|
@ -80,7 +82,7 @@ static void tst2() {
|
|||
// 0 1 1
|
||||
A.set(0, 0, 1); A.set(0, 1, 1); A.set(0, 2, 1);
|
||||
A.set(1, 0, 0); A.set(1, 1, 1); A.set(1, 2, -1);
|
||||
A.set(2, 0, 0); A.set(2, 1, 1); A.set(2, 2, 1);
|
||||
A.set(2, 0, 0); A.set(2, 1, 1); A.set(2, 2, 1);
|
||||
std::cout << A;
|
||||
{
|
||||
int b[3];
|
||||
|
@ -143,8 +145,9 @@ static void tst_lin_indep(unsigned m, unsigned n, int _A[], unsigned ex_sz, unsi
|
|||
}
|
||||
|
||||
static void tst_denominators() {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager qm;
|
||||
rcmanager m(qm);
|
||||
rcmanager m(rl, qm);
|
||||
scoped_rcnumeral a(m);
|
||||
scoped_rcnumeral t(m);
|
||||
scoped_rcnumeral eps(m);
|
||||
|
|
|
@ -11,6 +11,7 @@ Copyright (c) 2015 Microsoft Corporation
|
|||
#include "mpq_inf.h"
|
||||
#include "vector.h"
|
||||
#include "rational.h"
|
||||
#include "rlimit.h"
|
||||
|
||||
#define R rational
|
||||
typedef simplex::simplex<simplex::mpz_ext> Simplex;
|
||||
|
@ -99,7 +100,8 @@ static void feas(Simplex& S) {
|
|||
}
|
||||
|
||||
static void test1() {
|
||||
Simplex S;
|
||||
reslimit rl;
|
||||
Simplex S(rl);
|
||||
add_row(S, vec(1,0), R(1));
|
||||
add_row(S, vec(0,1), R(1));
|
||||
add_row(S, vec(1,1), R(1));
|
||||
|
@ -107,7 +109,7 @@ static void test1() {
|
|||
}
|
||||
|
||||
static void test2() {
|
||||
Simplex S;
|
||||
reslimit rl; Simplex S(rl);
|
||||
add_row(S, vec(1, 0), R(1));
|
||||
add_row(S, vec(0, 1), R(1));
|
||||
add_row(S, vec(1, 1), R(1), true);
|
||||
|
@ -115,7 +117,7 @@ static void test2() {
|
|||
}
|
||||
|
||||
static void test3() {
|
||||
Simplex S;
|
||||
reslimit rl; Simplex S(rl);
|
||||
add_row(S, vec(-1, 0), R(-1));
|
||||
add_row(S, vec(0, -1), R(-1));
|
||||
add_row(S, vec(1, 1), R(1), true);
|
||||
|
@ -123,7 +125,7 @@ static void test3() {
|
|||
}
|
||||
|
||||
static void test4() {
|
||||
Simplex S;
|
||||
reslimit rl; Simplex S(rl);
|
||||
add_row(S, vec(1, 0), R(1));
|
||||
add_row(S, vec(0, -1), R(-1));
|
||||
add_row(S, vec(1, 1), R(1), true);
|
||||
|
@ -131,7 +133,7 @@ static void test4() {
|
|||
}
|
||||
|
||||
void tst_simplex() {
|
||||
Simplex S;
|
||||
reslimit rl; Simplex S(rl);
|
||||
|
||||
std::cout << "simplex\n";
|
||||
|
||||
|
@ -152,7 +154,7 @@ void tst_simplex() {
|
|||
is_sat = S.make_feasible();
|
||||
std::cout << "feasible: " << is_sat << "\n";
|
||||
S.display(std::cout);
|
||||
_scoped_numeral<unsynch_mpq_inf_manager> num(em);
|
||||
_scoped_numeral<unsynch_mpq_inf_manager> num(em);
|
||||
num = std::make_pair(mpq(1), mpq(0));
|
||||
S.set_lower(0, num);
|
||||
S.set_upper(0, num);
|
||||
|
|
|
@ -23,13 +23,14 @@ Revision History:
|
|||
#include"ast.h"
|
||||
#include"debug.h"
|
||||
#include"im_float_config.h"
|
||||
#include"rlimit.h"
|
||||
|
||||
#define PREC 100000
|
||||
|
||||
static void tst_sine_core(std::ostream & out, unsynch_mpq_manager & nm, interval_manager<im_default_config> & im, mpq & a, unsigned k) {
|
||||
scoped_mpq lo(nm), hi(nm);
|
||||
im.sine(a, k, lo, hi);
|
||||
nm.display(out, lo);
|
||||
nm.display(out, lo);
|
||||
out << " <= Sin["; nm.display(out, a); out << "]\n";
|
||||
out << "Sin["; nm.display(out, a); out << "] <= ";
|
||||
nm.display(out, hi);
|
||||
|
@ -37,9 +38,10 @@ static void tst_sine_core(std::ostream & out, unsynch_mpq_manager & nm, interval
|
|||
}
|
||||
|
||||
static void tst_sine(std::ostream & out, unsigned N, unsigned k) {
|
||||
unsynch_mpq_manager nm;
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(imc);
|
||||
reslimit rl;
|
||||
interval_manager<im_default_config> im(rl, imc);
|
||||
scoped_mpq a(nm);
|
||||
nm.set(a, 0);
|
||||
tst_sine_core(out, nm, im, a, 1);
|
||||
|
@ -55,7 +57,7 @@ static void tst_sine(std::ostream & out, unsigned N, unsigned k) {
|
|||
static void tst_cosine_core(std::ostream & out, unsynch_mpq_manager & nm, interval_manager<im_default_config> & im, mpq & a, unsigned k) {
|
||||
scoped_mpq lo(nm), hi(nm);
|
||||
im.cosine(a, k, lo, hi);
|
||||
nm.display(out, lo);
|
||||
nm.display(out, lo);
|
||||
out << " <= Cos["; nm.display(out, a); out << "]\n";
|
||||
out << "Cos["; nm.display(out, a); out << "] <= ";
|
||||
nm.display(out, hi);
|
||||
|
@ -63,9 +65,10 @@ static void tst_cosine_core(std::ostream & out, unsynch_mpq_manager & nm, interv
|
|||
}
|
||||
|
||||
static void tst_cosine(std::ostream & out, unsigned N, unsigned k) {
|
||||
unsynch_mpq_manager nm;
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(imc);
|
||||
interval_manager<im_default_config> im(rl, imc);
|
||||
scoped_mpq a(nm);
|
||||
nm.set(a, 0);
|
||||
tst_cosine_core(out, nm, im, a, 1);
|
||||
|
@ -79,10 +82,10 @@ static void tst_cosine(std::ostream & out, unsigned N, unsigned k) {
|
|||
|
||||
|
||||
template<typename fmanager>
|
||||
static void tst_float_sine_core(std::ostream & out,
|
||||
fmanager & fm,
|
||||
interval_manager<im_float_config<fmanager> > & im,
|
||||
typename fmanager::numeral & a,
|
||||
static void tst_float_sine_core(std::ostream & out,
|
||||
fmanager & fm,
|
||||
interval_manager<im_float_config<fmanager> > & im,
|
||||
typename fmanager::numeral & a,
|
||||
unsigned k) {
|
||||
_scoped_numeral<fmanager> lo(fm), hi(fm);
|
||||
im.sine(a, k, lo, hi);
|
||||
|
@ -95,9 +98,10 @@ const unsigned SBITS = 53;
|
|||
|
||||
template<typename fmanager>
|
||||
static void tst_float_sine(std::ostream & out, unsigned N, unsigned k) {
|
||||
reslimit rl;
|
||||
fmanager fm;
|
||||
im_float_config<fmanager> ifc(fm, EBITS, SBITS);
|
||||
interval_manager<im_float_config<fmanager> > im(ifc);
|
||||
interval_manager<im_float_config<fmanager> > im(rl, ifc);
|
||||
_scoped_numeral<fmanager> a(fm);
|
||||
fm.set(a, EBITS, SBITS, static_cast<int>(0));
|
||||
tst_float_sine_core(out, fm, im, a, 1);
|
||||
|
@ -130,9 +134,10 @@ static void tst_mpf_bug() {
|
|||
#endif
|
||||
|
||||
static void tst_e(std::ostream & out) {
|
||||
unsynch_mpq_manager nm;
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
im_default_config imc(nm);
|
||||
interval_manager<im_default_config> im(imc);
|
||||
interval_manager<im_default_config> im(rl, imc);
|
||||
im_default_config::interval r;
|
||||
for (unsigned i = 0; i < 64; i++) {
|
||||
im.e(i, r);
|
||||
|
@ -144,10 +149,11 @@ static void tst_e(std::ostream & out) {
|
|||
|
||||
static void tst_e_float(std::ostream & out) {
|
||||
std::cout << "e float...\n";
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager qm;
|
||||
mpf_manager fm;
|
||||
im_float_config<mpf_manager> ifc(fm);
|
||||
interval_manager<im_float_config<mpf_manager> > im(ifc);
|
||||
interval_manager<im_float_config<mpf_manager> > im(rl, ifc);
|
||||
scoped_mpq q(qm);
|
||||
im_float_config<mpf_manager>::interval r;
|
||||
for (unsigned i = 0; i < 64; i++) {
|
||||
|
|
|
@ -18,11 +18,13 @@ Notes:
|
|||
--*/
|
||||
#include"upolynomial.h"
|
||||
#include"timeit.h"
|
||||
#include"rlimit.h"
|
||||
|
||||
static void tst1() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
upolynomial::manager um(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
upolynomial::manager um(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
|
@ -36,7 +38,7 @@ static void tst1() {
|
|||
|
||||
std::cout << "degree(q): " << um.degree(q) << "\n";
|
||||
|
||||
// display coefficients of q
|
||||
// display coefficients of q
|
||||
std::cout << "expanded q: ";
|
||||
for (unsigned i = 0; i < q.size(); i++)
|
||||
std::cout << nm.to_string(q[i]) << " ";
|
||||
|
@ -50,7 +52,7 @@ static void tst1() {
|
|||
// So, if we perform destructive operations on these coefficients, we must execute the "trim" operation
|
||||
// before invoking another operation of upolynomial::manager
|
||||
um.trim(q);
|
||||
|
||||
|
||||
// q after adding 1 to all coefficients
|
||||
std::cout << "new q: "; um.display(std::cout, q); std::cout << "\n";
|
||||
|
||||
|
@ -64,7 +66,8 @@ static void tst1() {
|
|||
}
|
||||
|
||||
static void tst_isolate_roots(polynomial_ref const & p, unsigned prec, mpbq_manager & bqm, mpbq_vector & roots, mpbq_vector & lowers, mpbq_vector & uppers) {
|
||||
upolynomial::manager um(p.m().m());
|
||||
reslimit rl;
|
||||
upolynomial::manager um(rl, p.m().m());
|
||||
upolynomial::scoped_numeral_vector q(um);
|
||||
um.to_numeral_vector(p, q);
|
||||
std::cout << "isolating roots of: "; um.display(std::cout, q); std::cout << "\n";
|
||||
|
@ -119,7 +122,7 @@ static void tst_isolate_roots(polynomial_ref const & p, unsigned prec, mpbq_mana
|
|||
um.eval_sign_at(q.size(), q.c_ptr(), uppers[i]) == 0 ||
|
||||
um.sign_variations_at(sseq, lowers[i]) - um.sign_variations_at(sseq, uppers[i]) == 1);
|
||||
// Fourier sequence may also be used to check if the interval is isolating
|
||||
TRACE("upolynomial",
|
||||
TRACE("upolynomial",
|
||||
tout << "lowers[i]: " << bqm.to_string(lowers[i]) << "\n";
|
||||
tout << "uppers[i]: " << bqm.to_string(uppers[i]) << "\n";
|
||||
tout << "fourier lower: " << um.sign_variations_at(fseq, lowers[i]) << "\n";
|
||||
|
@ -132,7 +135,7 @@ static void tst_isolate_roots(polynomial_ref const & p, unsigned prec, mpbq_mana
|
|||
// fsv_upper - fsv_upper - num_roots is even
|
||||
// Recall that num_roots == 1 in the interval.
|
||||
(fsv_lower - fsv_upper >= 1 && (fsv_lower - fsv_upper - 1) % 2 == 0));
|
||||
|
||||
|
||||
// Double checking using Descartes bounds for the interval
|
||||
// Must use square free component.
|
||||
unsigned dab = um.descartes_bound_a_b(q_sqf.size(), q_sqf.c_ptr(), bqm, lowers[i], uppers[i]);
|
||||
|
@ -189,28 +192,29 @@ static void tst_isolate_roots(polynomial_ref const & p, unsigned expected_sz, ra
|
|||
}
|
||||
|
||||
static void tst_isolate_roots() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
polynomial_ref p(m);
|
||||
p = (x-1)*(x-2);
|
||||
{
|
||||
p = (x-1)*(x-2);
|
||||
{
|
||||
rational ex[2] = { rational(1), rational(2) };
|
||||
tst_isolate_roots(p, 2, ex);
|
||||
}
|
||||
p = (x-1)*(x-1)*x*x*x;
|
||||
{
|
||||
{
|
||||
rational ex[2] = { rational(1), rational(0) };
|
||||
tst_isolate_roots(p, 2, ex);
|
||||
}
|
||||
p = (x^5) - x - 1;
|
||||
{
|
||||
{
|
||||
rational ex[1] = { rational(11673039, 10000000) }; // approximated root
|
||||
tst_isolate_roots(p, 1, ex);
|
||||
}
|
||||
p = (x - 1)*(x + 1)*(x + 2)*(x + 3)*((x - 3)^2);
|
||||
p = (x - 1)*(x + 1)*(x + 2)*(x + 3)*((x - 3)^2);
|
||||
{
|
||||
rational ex[5] = { rational(1), rational(-1), rational(-2), rational(-3), rational(3) };
|
||||
tst_isolate_roots(p, 5, ex);
|
||||
|
@ -271,19 +275,20 @@ static void tst_isolate_roots() {
|
|||
};
|
||||
tst_isolate_roots(p, 3, ex, 10);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void tst_remove_one_half() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
polynomial_ref p(m), r(m);
|
||||
p = 4*(x^3) - 12*(x^2) - x + 3;
|
||||
r = 16*(x^2) - 40*x - 24;
|
||||
upolynomial::manager um(nm);
|
||||
upolynomial::manager um(rl, nm);
|
||||
upolynomial::scoped_numeral_vector _p(um), _q(um), _r(um);
|
||||
um.to_numeral_vector(p, _p);
|
||||
um.to_numeral_vector(r, _r);
|
||||
|
@ -321,15 +326,16 @@ static void tst_gcd(polynomial_ref const & p, polynomial_ref const & q, pmanager
|
|||
|
||||
static void tst_gcd() {
|
||||
std::cout << "\n\nTesting GCD\n";
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
polynomial_ref p(m);
|
||||
polynomial_ref q(m);
|
||||
|
||||
upolynomial::manager um(nm);
|
||||
upolynomial::manager um(rl, nm);
|
||||
|
||||
p = 13*((x - 3)^6)*((x - 5)^5)*((x - 11)^7);
|
||||
q = derivative(p, 0);
|
||||
|
@ -339,7 +345,7 @@ static void tst_gcd() {
|
|||
|
||||
p = (x^8) + (x^6) - 3*(x^4) - 3*(x^3) + 8*(x^2) + 2*x - 5;
|
||||
q = 3*(x^6) + 5*(x^4) - 4*(x^2) - 9*x + 21;
|
||||
|
||||
|
||||
tst_gcd(p, q, um);
|
||||
|
||||
p = ((x - 1)^2)*(x - 3)*(x + 2)*((x - 5)^3);
|
||||
|
@ -351,8 +357,9 @@ static void tst_gcd() {
|
|||
|
||||
static void tst_zp() {
|
||||
std::cout << "\n\nTesting Z_p\n";
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
|
@ -363,20 +370,21 @@ static void tst_zp() {
|
|||
|
||||
// Computing GCD of p an q in Z[x]
|
||||
std::cout << "GCD in Z[x]\n";
|
||||
upolynomial::manager um(nm);
|
||||
upolynomial::manager um(rl, nm);
|
||||
tst_gcd(p, q, um);
|
||||
|
||||
// Computing GCD of p an q in Z_3[x]
|
||||
std::cout << "GCD in Z_3[x]\n";
|
||||
upolynomial::zp_manager um3(nm);
|
||||
std::cout << "GCD in Z_3[x]\n";
|
||||
upolynomial::zp_manager um3(rl, nm);
|
||||
um3.set_zp(3);
|
||||
tst_gcd(p, q, um3);
|
||||
}
|
||||
}
|
||||
|
||||
static void tst_zp2() {
|
||||
std::cout << "\n\nTesting Z_p\n";
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
|
@ -387,20 +395,21 @@ static void tst_zp2() {
|
|||
|
||||
// Computing GCD of p an q in Z[x]
|
||||
std::cout << "GCD in Z[x]\n";
|
||||
upolynomial::manager um(nm);
|
||||
upolynomial::manager um(rl, nm);
|
||||
tst_gcd(u, v, um);
|
||||
|
||||
// Computing GCD of p an q in Z_3[x]
|
||||
std::cout << "GCD in Z_13[x]\n";
|
||||
upolynomial::zp_manager um13(nm);
|
||||
std::cout << "GCD in Z_13[x]\n";
|
||||
upolynomial::zp_manager um13(rl, nm);
|
||||
um13.set_zp(13);
|
||||
tst_gcd(u, v, um13);
|
||||
}
|
||||
}
|
||||
|
||||
static void tst_ext_gcd() {
|
||||
std::cout << "\nExtended GCD\n";
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
|
@ -410,8 +419,8 @@ static void tst_ext_gcd() {
|
|||
b = (x^8) + (x^6) + 10*(x^4) + 10*(x^3) + 8*(x^2) + 2*x + 8;
|
||||
|
||||
// Computing GCD of p an q in Z_3[x]
|
||||
std::cout << "GCD in Z_13[x]\n";
|
||||
upolynomial::zp_manager um(nm);
|
||||
std::cout << "GCD in Z_13[x]\n";
|
||||
upolynomial::zp_manager um(rl, nm);
|
||||
um.set_zp(13);
|
||||
mpzzp_manager & z13 = um.m();
|
||||
upolynomial::zp_manager::scoped_numeral_vector A(z13), B(z13), U(z13), V(z13), D(z13);
|
||||
|
@ -423,12 +432,13 @@ static void tst_ext_gcd() {
|
|||
std::cout << "U: "; um.display(std::cout, U); std::cout << "\n";
|
||||
std::cout << "V: "; um.display(std::cout, V); std::cout << "\n";
|
||||
std::cout << "D: "; um.display(std::cout, D); std::cout << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
static void tst_ext_gcd_z7() {
|
||||
std::cout << "\nExtended GCD in Z_7\n";
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
|
@ -440,8 +450,8 @@ static void tst_ext_gcd_z7() {
|
|||
|
||||
// Computing GCD of a and b in Z_3[x]
|
||||
// expecting: D = 1, U = 3*x + 6, V = 3*x^2 + 6*x + 4
|
||||
std::cout << "GCD in Z_7[x]\n";
|
||||
upolynomial::zp_manager um(nm);
|
||||
std::cout << "GCD in Z_7[x]\n";
|
||||
upolynomial::zp_manager um(rl, nm);
|
||||
um.set_zp(7);
|
||||
mpzzp_manager & z7 = um.m();
|
||||
upolynomial::zp_manager::scoped_numeral_vector A(z7), B(z7), U(z7), V(z7), D(z7);
|
||||
|
@ -453,12 +463,13 @@ static void tst_ext_gcd_z7() {
|
|||
std::cout << "U: "; um.display(std::cout, U); std::cout << "\n";
|
||||
std::cout << "V: "; um.display(std::cout, V); std::cout << "\n";
|
||||
std::cout << "D: "; um.display(std::cout, D); std::cout << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
static void tst_sturm() {
|
||||
std::cout << "\nSturm Seq\n";
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
|
@ -467,7 +478,7 @@ static void tst_sturm() {
|
|||
// p = ((x^17) + 5*(x^16) + 3*(x^15) + 10*(x^13) + 13*(x^10) + (x^9) + 8*(x^5) + 3*(x^2) + 7)*(((x^5) - x - 1)^2)*(((x^3) - 2)^2);
|
||||
// p = ((x^17) + 5*(x^16) + 3*(x^15) + 10*(x^13) + 13*(x^10) + (x^9) + 8*(x^5) + 3*(x^2) + 7)*(((x^5) - x - 1))*(((x^3) - 2));
|
||||
|
||||
upolynomial::manager um(nm);
|
||||
upolynomial::manager um(rl, nm);
|
||||
upolynomial::scoped_numeral_vector _p(um);
|
||||
upolynomial::scoped_upolynomial_sequence seq2(um);
|
||||
um.to_numeral_vector(p, _p);
|
||||
|
@ -478,7 +489,8 @@ static void tst_sturm() {
|
|||
|
||||
|
||||
static void tst_refinable(polynomial_ref const & p, mpbq_manager & bqm, mpbq & a, mpbq & b) {
|
||||
upolynomial::manager um(p.m().m());
|
||||
reslimit rl;
|
||||
upolynomial::manager um(rl, p.m().m());
|
||||
upolynomial::scoped_numeral_vector _p(um);
|
||||
um.to_numeral_vector(p, _p);
|
||||
std::cout << "before (" << bqm.to_string(a) << ", " << bqm.to_string(b) << ")\n";
|
||||
|
@ -497,8 +509,9 @@ static void tst_refinable(polynomial_ref const & p, mpbq_manager & bqm, mpbq & a
|
|||
|
||||
static void tst_refinable() {
|
||||
std::cout << "\nRefinable intervals\n";
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
|
@ -539,12 +552,12 @@ static void tst_refinable() {
|
|||
bqm.set(a, 1);
|
||||
bqm.set(b, 3);
|
||||
tst_refinable(p, bqm, a, b);
|
||||
|
||||
|
||||
bqm.del(a); bqm.del(b);
|
||||
}
|
||||
|
||||
static void tst_refine(polynomial_ref const & p, mpbq_manager & bqm, mpbq & a, mpbq & b, unsigned prec_k=100) {
|
||||
upolynomial::manager um(p.m().m());
|
||||
reslimit rl; upolynomial::manager um(rl, p.m().m());
|
||||
upolynomial::scoped_numeral_vector _p(um);
|
||||
um.to_numeral_vector(p, _p);
|
||||
std::cout << "before (" << bqm.to_string(a) << ", " << bqm.to_string(b) << ")\n";
|
||||
|
@ -561,8 +574,9 @@ static void tst_refine(polynomial_ref const & p, mpbq_manager & bqm, mpbq & a, m
|
|||
|
||||
static void tst_refine() {
|
||||
std::cout << "\nRefining intervals\n";
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
|
@ -574,7 +588,7 @@ static void tst_refine() {
|
|||
a = 1;
|
||||
b = 2;
|
||||
tst_refine(p, bqm, a, b, 20);
|
||||
|
||||
|
||||
p = (x^2) - 2;
|
||||
std::cout << "p: " << p << "\n";
|
||||
a = 1;
|
||||
|
@ -583,14 +597,15 @@ static void tst_refine() {
|
|||
}
|
||||
|
||||
static void tst_translate_q() {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
polynomial_ref p(m);
|
||||
p = (x-1)*(x-2)*(x-3)*(x-4);
|
||||
upolynomial::manager um(nm);
|
||||
upolynomial::manager um(rl, nm);
|
||||
upolynomial::scoped_numeral_vector _p(um), _q(um);
|
||||
um.to_numeral_vector(p, _p);
|
||||
SASSERT(um.eval_sign_at(_p.size(), _p.c_ptr(), mpq(1)) == 0);
|
||||
|
@ -637,7 +652,8 @@ static void tst_translate_q() {
|
|||
}
|
||||
|
||||
static void tst_convert_q2bq(unsynch_mpq_manager & m, polynomial_ref const & p, mpq const & a, mpq const & b) {
|
||||
upolynomial::manager um(m);
|
||||
reslimit rl;
|
||||
upolynomial::manager um(rl, m);
|
||||
upolynomial::scoped_numeral_vector _p(um);
|
||||
um.to_numeral_vector(p, _p);
|
||||
std::cout << "\np: ";
|
||||
|
@ -657,8 +673,9 @@ static void tst_convert_q2bq(unsynch_mpq_manager & m, polynomial_ref const & p,
|
|||
}
|
||||
|
||||
static void tst_convert_q2bq() {
|
||||
reslimit rl;
|
||||
unsynch_mpq_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
|
@ -704,8 +721,9 @@ static void tst_convert_q2bq() {
|
|||
}
|
||||
|
||||
static void tst_sturm2() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
|
@ -715,7 +733,7 @@ static void tst_sturm2() {
|
|||
p = (x^16) - 136*(x^14) + 6476*(x^12) - 141912*(x^10) + 1513334*(x^8) - 7453176*(x^6) + 13950764*(x^4) - 5596840*(x^2) + 46225;
|
||||
q = ((x^8) - 40*(x^6) + 352*(x^4) - 960*(x^2) + 576)^2;
|
||||
|
||||
upolynomial::manager um(nm);
|
||||
upolynomial::manager um(rl, nm);
|
||||
upolynomial::scoped_numeral_vector _p(um), _q(um);
|
||||
upolynomial::scoped_upolynomial_sequence seq2(um);
|
||||
um.to_numeral_vector(p, _p);
|
||||
|
@ -735,7 +753,7 @@ static void tst_isolate_roots2() {
|
|||
// create univariate polynomial using multivariate polynomial package
|
||||
polynomial_ref p(m);
|
||||
p = (2*x - 1)*(x - 21)*(x + 12)*(x - 19)*(x + 11)*(x + 34)*(x - 9)*(x - 72)*(10000*x - 4999)*((x^5) - x - 1)*((x^2) - 2)*((x^2) - 3)*((x^7) - 3)*((x^101) - 3);
|
||||
{
|
||||
{
|
||||
tst_isolate_roots(p, 10);
|
||||
}
|
||||
}
|
||||
|
@ -769,7 +787,7 @@ static void tst_isolate_roots3() {
|
|||
q = (x - x1 - x2 - x3 - x4 - x5 - x6);
|
||||
r = resultant(resultant(resultant(resultant(resultant(resultant(q, p1, 1), p2, 2), p3, 3), p4, 4), p5, 5), p6, 6);
|
||||
std::cout << "r: " << r << "\n";
|
||||
{
|
||||
{
|
||||
timeit timer(true, "isolate");
|
||||
tst_isolate_roots(r, 10);
|
||||
}
|
||||
|
@ -784,7 +802,7 @@ static void tst_gcd2() {
|
|||
polynomial_ref p(m);
|
||||
p = ((x^1000) - x + 1)^5;
|
||||
|
||||
upolynomial::manager um(nm);
|
||||
reslimit rl; upolynomial::manager um(rl, nm);
|
||||
upolynomial::scoped_numeral_vector _p(um);
|
||||
upolynomial::scoped_numeral_vector _p_sqf(um);
|
||||
um.to_numeral_vector(p, _p);
|
||||
|
@ -794,24 +812,26 @@ static void tst_gcd2() {
|
|||
}
|
||||
um.display(std::cout, _p_sqf.size(), _p_sqf.c_ptr()); std::cout << "\n";
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static void tst_isolate_roots5() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
polynomial_ref p(m);
|
||||
p = (x^70) - 6*(x^65) - (x^60) + 60*(x^55) - 54*(x^50) - 230*(x^45) + 274*(x^40) + 542*(x^35) - 615*(x^30)
|
||||
- 1120*(x^25) + 1500*(x^20) - 160*(x^15) - 395*(x^10) + 76*(x^5) + 34;
|
||||
{
|
||||
{
|
||||
tst_isolate_roots(p, 10);
|
||||
}
|
||||
}
|
||||
|
||||
static void tst_exact_div(polynomial_ref const & p1, polynomial_ref const & p2, bool expected, polynomial_ref const & expected_q) {
|
||||
upolynomial::manager um(p1.m().m());
|
||||
reslimit rl;
|
||||
upolynomial::manager um(rl, p1.m().m());
|
||||
upolynomial::scoped_numeral_vector _p1(um), _p2(um), _q(um), _r(um);
|
||||
um.to_numeral_vector(p1, _p1);
|
||||
um.to_numeral_vector(p2, _p2);
|
||||
|
@ -834,8 +854,9 @@ static void tst_exact_div(polynomial_ref const & p1, polynomial_ref const & p2,
|
|||
}
|
||||
|
||||
static void tst_exact_div() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
// create univariate polynomial using multivariate polynomial package
|
||||
|
@ -860,7 +881,7 @@ static void tst_fact(polynomial_ref const & p, unsigned num_distinct_factors, up
|
|||
SASSERT(is_univariate(p));
|
||||
std::cout << "---------------\n";
|
||||
std::cout << "p: " << p << std::endl;
|
||||
upolynomial::manager um(p.m().m());
|
||||
reslimit rl; upolynomial::manager um(rl, p.m().m());
|
||||
upolynomial::scoped_numeral_vector _p(um);
|
||||
upolynomial::factors fs(um);
|
||||
um.to_numeral_vector(p, _p);
|
||||
|
@ -878,8 +899,9 @@ static void tst_fact(polynomial_ref const & p, unsigned num_distinct_factors, up
|
|||
}
|
||||
|
||||
static void tst_fact() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m);
|
||||
x0 = m.mk_polynomial(m.mk_var());
|
||||
tst_fact((x0^4) + (x0^2) - 20, 3);
|
||||
|
@ -899,7 +921,7 @@ static void tst_fact() {
|
|||
tst_fact((x0^70) - 6*(x0^65) - (x0^60) + 60*(x0^55) - 54*(x0^50) - 230*(x0^45) + 274*(x0^40) + 542*(x0^35) - 615*(x0^30) - 1120*(x0^25) + 1500*(x0^20) - 160*(x0^15) - 395*(x0^10) + 76*(x0^5) + 34, 3);
|
||||
tst_fact(((x0^4) - 8*(x0^2)), 2);
|
||||
tst_fact((x0^5) - 2*(x0^3) + x0 - 1, 1);
|
||||
tst_fact( (x0^25) - 4*(x0^21) - 5*(x0^20) + 6*(x0^17) + 11*(x0^16) + 10*(x0^15) - 4*(x0^13) - 7*(x0^12) - 9*(x0^11) - 10*(x0^10) +
|
||||
tst_fact( (x0^25) - 4*(x0^21) - 5*(x0^20) + 6*(x0^17) + 11*(x0^16) + 10*(x0^15) - 4*(x0^13) - 7*(x0^12) - 9*(x0^11) - 10*(x0^10) +
|
||||
(x0^9) + (x0^8) + (x0^7) + (x0^6) + 3*(x0^5) + x0 - 1, 2);
|
||||
tst_fact( (x0^25) - 10*(x0^21) - 10*(x0^20) - 95*(x0^17) - 470*(x0^16) - 585*(x0^15) - 40*(x0^13) - 1280*(x0^12) - 4190*(x0^11) - 3830*(x0^10) + 400*(x0^9)+ 1760*(x0^8) + 760*(x0^7) - 2280*(x0^6) + 449*(x0^5) + 640*(x0^3) - 640*(x0^2) + 240*x0 - 32, 2);
|
||||
tst_fact( x0^10, 1);
|
||||
|
@ -919,7 +941,7 @@ static void tst_fact() {
|
|||
tst_fact( (x0^50) - 10*(x0^40) + 38*(x0^30) - 2*(x0^25) - 100*(x0^20) - 40*(x0^15) + 121*(x0^10) - 38*(x0^5) - 17, 1);
|
||||
|
||||
tst_fact( (((x0^5) + 5*(x0^4) + 10*(x0^3) + 10*(x0^2) + 5*x0)^10)
|
||||
+ 10*(((x0^5) + 5*(x0^4) + 10*(x0^3) + 10*(x0^2) + 5*x0)^9)
|
||||
+ 10*(((x0^5) + 5*(x0^4) + 10*(x0^3) + 10*(x0^2) + 5*x0)^9)
|
||||
+ 35*(((x0^5) + 5*(x0^4) + 10*(x0^3) + 10*(x0^2) + 5*x0)^8)
|
||||
+ 40*(((x0^5) + 5*(x0^4) + 10*(x0^3) + 10*(x0^2) + 5*x0)^7)
|
||||
- 32*(((x0^5) + 5*(x0^4) + 10*(x0^3) + 10*(x0^2) + 5*x0)^6)
|
||||
|
@ -934,37 +956,37 @@ static void tst_fact() {
|
|||
tst_fact( ((x0^5) - 15552)*
|
||||
((x0^20)- 15708*(x0^15) + rational("138771724")*(x0^10)- rational("432104148432")*(x0^5) + rational("614198284585616")),
|
||||
2);
|
||||
tst_fact( (x0^25) -
|
||||
rational("3125")*(x0^21) -
|
||||
rational("15630")*(x0^20) +
|
||||
rational("3888750")*(x0^17) +
|
||||
rational("38684375")*(x0^16) +
|
||||
rational("95765635")*(x0^15) -
|
||||
rational("2489846500")*(x0^13) -
|
||||
rational("37650481875")*(x0^12) -
|
||||
rational("190548065625")*(x0^11) -
|
||||
rational("323785250010")*(x0^10) +
|
||||
rational("750249453025")*(x0^9) +
|
||||
rational("14962295699875")*(x0^8) +
|
||||
rational("111775113235000")*(x0^7) +
|
||||
rational("370399286731250")*(x0^6) +
|
||||
rational("362903064503129")*(x0^5) -
|
||||
rational("2387239013984400")*(x0^4) -
|
||||
rational("23872390139844000")*(x0^3) -
|
||||
rational("119361950699220000")*(x0^2) -
|
||||
rational("298404876748050000")*x0 -
|
||||
tst_fact( (x0^25) -
|
||||
rational("3125")*(x0^21) -
|
||||
rational("15630")*(x0^20) +
|
||||
rational("3888750")*(x0^17) +
|
||||
rational("38684375")*(x0^16) +
|
||||
rational("95765635")*(x0^15) -
|
||||
rational("2489846500")*(x0^13) -
|
||||
rational("37650481875")*(x0^12) -
|
||||
rational("190548065625")*(x0^11) -
|
||||
rational("323785250010")*(x0^10) +
|
||||
rational("750249453025")*(x0^9) +
|
||||
rational("14962295699875")*(x0^8) +
|
||||
rational("111775113235000")*(x0^7) +
|
||||
rational("370399286731250")*(x0^6) +
|
||||
rational("362903064503129")*(x0^5) -
|
||||
rational("2387239013984400")*(x0^4) -
|
||||
rational("23872390139844000")*(x0^3) -
|
||||
rational("119361950699220000")*(x0^2) -
|
||||
rational("298404876748050000")*x0 -
|
||||
rational("298500366308609376"), 2);
|
||||
|
||||
tst_fact( rational("54")*(x0^24) - (x0^27) - 324*(x0^21) + rational("17496")*(x0^18) - 34992*(x0^15)+ rational("1889568")*(x0^12)- 1259712*(x0^9) + rational("68024448")*(x0^6), 3);
|
||||
|
||||
tst_fact( ((x0^3)- 432)*(((x0^3)+54)^2)*((x0^6)+108)*((x0^6)+6912)*((x0^6)- 324*(x0^3)+37044),
|
||||
5);
|
||||
|
||||
|
||||
tst_fact( ((x0^6)- 6*(x0^4) - 864*(x0^3) + 12*(x0^2) - 5184*x0 + 186616)*
|
||||
(((x0^6) - 6*(x0^4) + 108*(x0^3) + 12*(x0^2) + 648*x0 + 2908)^2)*
|
||||
((x0^12) - 12*(x0^10) + 60*(x0^8) + 56*(x0^6) + 6720*(x0^4) + 12768*(x0^2) + 13456)*
|
||||
((x0^12) - 12*(x0^10) + 60*(x0^8) + 13664*(x0^6) + 414960*(x0^4) + 829248*(x0^2) + 47886400)*
|
||||
((x0^12) - 12*(x0^10) - 648*(x0^9)+ 60*(x0^8) + 178904*(x0^6) + 15552*(x0^5) + 1593024*(x0^4) - 24045984*(x0^3) +
|
||||
((x0^12) - 12*(x0^10) - 648*(x0^9)+ 60*(x0^8) + 178904*(x0^6) + 15552*(x0^5) + 1593024*(x0^4) - 24045984*(x0^3) +
|
||||
5704800*(x0^2) - 143995968*x0 + 1372010896),
|
||||
5);
|
||||
}
|
||||
|
@ -975,7 +997,7 @@ static void tst_rem(polynomial_ref const & p, polynomial_ref const & q, polynomi
|
|||
std::cout << "---------------\n";
|
||||
std::cout << "p: " << p << std::endl;
|
||||
std::cout << "q: " << q << std::endl;
|
||||
upolynomial::manager um(p.m().m());
|
||||
reslimit rl; upolynomial::manager um(rl, p.m().m());
|
||||
upolynomial::scoped_numeral_vector _p(um), _q(um), _r(um);
|
||||
um.to_numeral_vector(p, _p);
|
||||
um.to_numeral_vector(q, _q);
|
||||
|
@ -987,8 +1009,9 @@ static void tst_rem(polynomial_ref const & p, polynomial_ref const & q, polynomi
|
|||
}
|
||||
|
||||
static void tst_rem() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x0(m), zero(m), one(m);
|
||||
x0 = m.mk_polynomial(m.mk_var());
|
||||
zero = m.mk_zero();
|
||||
|
@ -1002,7 +1025,7 @@ static void tst_lower_bound(polynomial_ref const & p) {
|
|||
SASSERT(is_univariate(p));
|
||||
std::cout << "---------------\n";
|
||||
std::cout << "p: " << p << std::endl;
|
||||
upolynomial::manager um(p.m().m());
|
||||
reslimit rl; upolynomial::manager um(rl, p.m().m());
|
||||
upolynomial::scoped_numeral_vector _p(um);
|
||||
um.to_numeral_vector(p, _p);
|
||||
std::cout << "_p: "; um.display(std::cout, _p); std::cout << "\n";
|
||||
|
@ -1012,8 +1035,9 @@ static void tst_lower_bound(polynomial_ref const & p) {
|
|||
}
|
||||
|
||||
static void tst_lower_bound() {
|
||||
reslimit rl;
|
||||
polynomial::numeral_manager nm;
|
||||
polynomial::manager m(nm);
|
||||
polynomial::manager m(rl, nm);
|
||||
polynomial_ref x(m), zero(m), one(m);
|
||||
x = m.mk_polynomial(m.mk_var());
|
||||
zero = m.mk_zero();
|
||||
|
@ -1031,7 +1055,7 @@ static void tst_lower_bound() {
|
|||
tst_lower_bound(((x^17) + 5*(x^16) + 3*(x^15) + 10*(x^13) + 13*(x^10) + (x^9) + 8*(x^5) + 3*(x^2) + 7)*(((x^5) - x - 1)^2)*(((x^3) - 2)^2));
|
||||
tst_lower_bound((((x^5) - 1000000000)^3)*((3*x - 10000000)^2)*((10*x - 632)^2));
|
||||
}
|
||||
|
||||
|
||||
void tst_upolynomial() {
|
||||
set_verbosity_level(1000);
|
||||
enable_trace("mpz_gcd");
|
||||
|
|
Loading…
Reference in a new issue