def extract_coeff(x1, x2, x3, cos_theta12, cos_theta23, cos_theta13, d12, d23, d13): """ Extract coefficients of a polynomial Args: x1, x2, x3: symbols representing the unknown camera-object distance cos_theta12, cos_theta23, cos_theta13: cos values of the inter-point angles d12, d23, d13: square of inter-point distances Returns: a: the coefficients of the polynomial of x1 """ f12 = x1**2 + x2**2 - 2 * x1 * x2 * cos_theta12 - d12 f23 = x2**2 + x3**2 - 2 * x2 * x3 * cos_theta23 - d23 f13 = x1**2 + x3**2 - 2 * x1 * x3 * cos_theta13 - d13 matrix = subresultants_qq_zz.sylvester(f23, f13, x3) f12_ = matrix.det() f1 = subresultants_qq_zz.sylvester(f12, f12_, x2).det() a1 = f1.func(*[term for term in f1.args if not term.free_symbols]) a2 = f1.coeff(x1**2) a3 = f1.coeff(x1**4) a4 = f1.coeff(x1**6) a5 = f1.coeff(x1**8) a = np.array([a1, a2, a3, a4, a5]) return a
def test_bezout(): x = var("x") p = -2 * x ** 5 + 7 * x ** 3 + 9 * x ** 2 - 3 * x + 1 q = -10 * x ** 4 + 21 * x ** 2 + 18 * x - 3 assert bezout(p, q, x, "bz").det() == sylvester(p, q, x, 2).det() assert bezout(p, q, x, "bz").det() != sylvester(p, q, x, 1).det() assert bezout(p, q, x, "prs") == backward_eye(5) * bezout(p, q, x, "bz") * backward_eye(5)
def test_bezout(): x = var('x') p = -2*x**5+7*x**3+9*x**2-3*x+1 q = -10*x**4+21*x**2+18*x-3 assert bezout(p, q, x, 'bz').det() == sylvester(p, q, x, 2).det() assert bezout(p, q, x, 'bz').det() != sylvester(p, q, x, 1).det() assert bezout(p, q, x, 'prs') == backward_eye(5) * bezout(p, q, x, 'bz') * backward_eye(5)
def test_bezout(): x = var("x") p = -2 * x**5 + 7 * x**3 + 9 * x**2 - 3 * x + 1 q = -10 * x**4 + 21 * x**2 + 18 * x - 3 assert bezout(p, q, x, "bz").det() == sylvester(p, q, x, 2).det() assert bezout(p, q, x, "bz").det() != sylvester(p, q, x, 1).det() assert bezout( p, q, x, "prs") == backward_eye(5) * bezout(p, q, x, "bz") * backward_eye(5)
def test_euclid_amv(): x = var('x') p = x**3 - 7*x + 7 q = 3*x**2 - 7 assert euclid_amv(p, q, x)[-1] == sylvester(p, q, x).det() assert euclid_amv(p, q, x) == subresultants_amv(p, q, x) 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 assert euclid_amv(p, q, x)[-1] != sylvester(p, q, x, 2).det() sam_factors = [1, 1, -1, -1, 1, 1] assert euclid_amv(p, q, x) == [i*j for i,j in zip(sam_factors, sturm_amv(p, q, x))]
def test_euclid_pg(): x = var('x') p = x**6+x**5-x**4-x**3+x**2-x+1 q = 6*x**5+5*x**4-4*x**3-3*x**2+2*x-1 assert euclid_pg(p, q, x)[-1] == sylvester(p, q, x).det() assert euclid_pg(p, q, x) == subresultants_pg(p, q, x) 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 assert euclid_pg(p, q, x)[-1] != sylvester(p, q, x, 2).det() sam_factors = [1, 1, -1, -1, 1, 1] assert euclid_pg(p, q, x) == [i*j for i,j in zip(sam_factors, sturm_pg(p, q, x))]
def test_euclid_amv(): x = var("x") p = x ** 3 - 7 * x + 7 q = 3 * x ** 2 - 7 assert euclid_amv(p, q, x)[-1] == sylvester(p, q, x).det() assert euclid_amv(p, q, x) == subresultants_amv(p, q, x) 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 assert euclid_amv(p, q, x)[-1] != sylvester(p, q, x, 2).det() sam_factors = [1, 1, -1, -1, 1, 1] assert euclid_amv(p, q, x) == [i * j for i, j in zip(sam_factors, sturm_amv(p, q, x))]
def test_euclid_pg(): x = var("x") p = x**6 + x**5 - x**4 - x**3 + x**2 - x + 1 q = 6 * x**5 + 5 * x**4 - 4 * x**3 - 3 * x**2 + 2 * x - 1 assert euclid_pg(p, q, x)[-1] == sylvester(p, q, x).det() assert euclid_pg(p, q, x) == subresultants_pg(p, q, x) 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 assert euclid_pg(p, q, x)[-1] != sylvester(p, q, x, 2).det() sam_factors = [1, 1, -1, -1, 1, 1] assert euclid_pg( p, q, x) == [i * j for i, j in zip(sam_factors, sturm_pg(p, q, x))]
def test_sturm_amv(): x = var('x') 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 assert sturm_amv(p, q, x)[-1] != sylvester(p, q, x, 2).det() sam_factors = [1, 1, -1, -1, 1, 1] assert sturm_amv(p, q, x) == [i*j for i,j in zip(sam_factors, euclid_amv(p, q, x))] p = -9*x**5 - 5*x**3 - 9 q = -45*x**4 - 15*x**2 assert sturm_amv(p, q, x, 1)[-1] == sylvester(p, q, x, 1).det() assert sturm_amv(p, q, x)[-1] != sylvester(p, q, x, 2).det() assert sturm_amv(-p, q, x)[-1] == sylvester(-p, q, x, 2).det() assert sturm_pg(-p, q, x) == modified_subresultants_pg(-p, q, x)
def test_subresultants_vv_2(): x = var('x') 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 assert subresultants_vv_2(p, q, x) == subresultants(p, q, x) assert subresultants_vv_2(p, q, x)[-1] == sylvester(p, q, x).det() assert subresultants_vv_2(p, q, x) != euclid_amv(p, q, x) amv_factors = [1, 1, -1, 1, -1, 1] assert subresultants_vv_2(p, q, x) == [i*j for i, j in zip(amv_factors, modified_subresultants_amv(p, q, x))] p = x**3 - 7*x + 7 q = 3*x**2 - 7 assert subresultants_vv_2(p, q, x) == euclid_amv(p, q, x)
def test_modified_subresultants_amv(): x = var('x') 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 amv_factors = [1, 1, -1, 1, -1, 1] assert modified_subresultants_amv(p, q, x) == [i*j for i, j in zip(amv_factors, subresultants_amv(p, q, x))] assert modified_subresultants_amv(p, q, x)[-1] != sylvester(p + x**8, q, x).det() assert modified_subresultants_amv(p, q, x) != sturm_amv(p, q, x) p = x**3 - 7*x + 7 q = 3*x**2 - 7 assert modified_subresultants_amv(p, q, x) == sturm_amv(p, q, x) assert modified_subresultants_amv(-p, q, x) != sturm_amv(-p, q, x)
def test_subresultants_bezout(): x = var('x') 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 assert subresultants_bezout(p, q, x) == subresultants(p, q, x) assert subresultants_bezout(p, q, x)[-1] == sylvester(p, q, x).det() assert subresultants_bezout(p, q, x) != euclid_amv(p, q, x) amv_factors = [1, 1, -1, 1, -1, 1] assert subresultants_bezout(p, q, x) == [i*j for i, j in zip(amv_factors, modified_subresultants_amv(p, q, x))] p = x**3 - 7*x + 7 q = 3*x**2 - 7 assert subresultants_bezout(p, q, x) == euclid_amv(p, q, x)
def _roots_using_eliminator_method(system, variable, other_variable): """ For solving a 2 polynomial system of 2 unknowns. Calculates the real roots of the first unknown using Sylvester's resultant or the eliminator. Note that there is a constrain that the roots must be between 0 and 1. Attributes ---------- system: list A list of size 2 with the polynomials variable: symbol The variable for which we are returning the roots other_variable: symbol The second variable of the system """ matrix = subresultants_qq_zz.sylvester(system[0], system[1], other_variable) matrix = sym.N(matrix, 9) resultant = matrix.det(method="berkowitz") num, den = sym.fraction(resultant.factor()) # candidate roots coeffs = sym.Poly(num, variable).all_coeffs() roots = np.roots(coeffs) feasible_roots = set() for root in roots: if not np.iscomplex(root): if root >= 0 and root <= 1: feasible_roots.add(root) if den != 1: for root in feasible_roots: if den.subs({variable: root}) == 0: feasible_roots.remove(root) return feasible_roots
def test_sylvester(): x = var('x') assert sylvester(x**3 -7, 0, x) == sylvester(x**3 -7, 0, x, 1) == Matrix([[0]]) assert sylvester(0, x**3 -7, x) == sylvester(0, x**3 -7, x, 1) == Matrix([[0]]) assert sylvester(x**3 -7, 0, x, 2) == Matrix([[0]]) assert sylvester(0, x**3 -7, x, 2) == Matrix([[0]]) assert sylvester(x**3 -7, 7, x).det() == sylvester(x**3 -7, 7, x, 1).det() == 343 assert sylvester(7, x**3 -7, x).det() == sylvester(7, x**3 -7, x, 1).det() == 343 assert sylvester(x**3 -7, 7, x, 2).det() == -343 assert sylvester(7, x**3 -7, x, 2).det() == -343 assert sylvester(3, 7, x).det() == sylvester(3, 7, x, 1).det() == sylvester(3, 7, x, 2).det() == 1 assert sylvester(3, 0, x).det() == sylvester(3, 0, x, 1).det() == sylvester(3, 0, x, 2).det() == 1 assert sylvester(x - 3, x - 8, x) == sylvester(x - 3, x - 8, x, 1) == sylvester(x - 3, x - 8, x, 2) == Matrix([[1, -3], [1, -8]]) assert sylvester(x**3 - 7*x + 7, 3*x**2 - 7, x) == sylvester(x**3 - 7*x + 7, 3*x**2 - 7, x, 1) == Matrix([[1, 0, -7, 7, 0], [0, 1, 0, -7, 7], [3, 0, -7, 0, 0], [0, 3, 0, -7, 0], [0, 0, 3, 0, -7]]) assert sylvester(x**3 - 7*x + 7, 3*x**2 - 7, x, 2) == Matrix([ [1, 0, -7, 7, 0, 0], [0, 3, 0, -7, 0, 0], [0, 1, 0, -7, 7, 0], [0, 0, 3, 0, -7, 0], [0, 0, 1, 0, -7, 7], [0, 0, 0, 3, 0, -7]])
def test_sylvester(): x = var('x') assert sylvester(x**3 - 7, 0, x) == sylvester(x**3 - 7, 0, x, 1) == Matrix( [[0]]) assert sylvester(0, x**3 - 7, x) == sylvester(0, x**3 - 7, x, 1) == Matrix( [[0]]) assert sylvester(x**3 - 7, 0, x, 2) == Matrix([[0]]) assert sylvester(0, x**3 - 7, x, 2) == Matrix([[0]]) assert sylvester(x**3 - 7, 7, x).det() == sylvester(x**3 - 7, 7, x, 1).det() == 343 assert sylvester(7, x**3 - 7, x).det() == sylvester(7, x**3 - 7, x, 1).det() == 343 assert sylvester(x**3 - 7, 7, x, 2).det() == -343 assert sylvester(7, x**3 - 7, x, 2).det() == 343 assert sylvester(3, 7, x).det() == sylvester( 3, 7, x, 1).det() == sylvester(3, 7, x, 2).det() == 1 assert sylvester(3, 0, x).det() == sylvester( 3, 0, x, 1).det() == sylvester(3, 0, x, 2).det() == 1 assert sylvester(x - 3, x - 8, x) == sylvester(x - 3, x - 8, x, 1) == sylvester( x - 3, x - 8, x, 2) == Matrix([[1, -3], [1, -8]]) assert sylvester(x**3 - 7 * x + 7, 3 * x**2 - 7, x) == sylvester( x**3 - 7 * x + 7, 3 * x**2 - 7, x, 1) == Matrix( [[1, 0, -7, 7, 0], [0, 1, 0, -7, 7], [3, 0, -7, 0, 0], [0, 3, 0, -7, 0], [0, 0, 3, 0, -7]]) assert sylvester(x**3 - 7 * x + 7, 3 * x**2 - 7, x, 2) == Matrix([[1, 0, -7, 7, 0, 0], [0, 3, 0, -7, 0, 0], [0, 1, 0, -7, 7, 0], [0, 0, 3, 0, -7, 0], [0, 0, 1, 0, -7, 7], [0, 0, 0, 3, 0, -7]])