def isom(A, B): # First check that A is a symmetric matrix. if not matrix(A).is_symmetric(): return False # Then check A against the viable database candidates. else: n = len(A[0]) m = len(B[0]) Avec = [] Bvec = [] for i in range(n): for j in range(i, n): if i == j: Avec += [A[i][j]] else: Avec += [2 * A[i][j]] for i in range(m): for j in range(i, m): if i == j: Bvec += [B[i][j]] else: Bvec += [2 * B[i][j]] Aquad = QuadraticForm(ZZ, len(A[0]), Avec) # check positive definite if Aquad.is_positive_definite(): Bquad = QuadraticForm(ZZ, len(B[0]), Bvec) return Aquad.is_globally_equivalent_to(Bquad) else: return False
def QuadraticForm_from_quadric(Q): """ On input a homogeneous polynomial of degree 2 return the Quadratic Form corresponding to it. """ R = Q.parent() assert all([sum(e)==2 for e in Q.exponents()]) M = copy(zero_matrix(R.ngens(),R.ngens())) for i in range(R.ngens()): for j in range(R.ngens()): if i==j: M[i,j]=2*Q.coefficient(R.gen(i)*R.gen(j)) else: M[i,j]=Q.coefficient(R.gen(i)*R.gen(j)) return QuadraticForm(M)