# Determinantal representations of hyperbolic plane cubics

This page demonstrates how the method detRep computes monic symmetric determinantal representations of a hyperbolic cubic $f$ in $3$ variables, or gives an error if certain necessary conditions for existence of such a representation are not met. First, the polynomial is dehomogenized to obtain a bivariate polynomial. Next, if $f = det(I + x_1A_1 + x_2A_2)$ is a symmetric determinantal representation, then by suitable conjugation one may assume $A_1 = D_1$ is a diagonal matrix. Since $A_2$ is symmetric, there exists an orthogonal change-of-basis matrix $V$ such that $VA_2V^T = D_2$ is diagonal. Since $D_1, D_2$ can be found using the method bivariateDiagEntries, to find a symmetric determinantal representation of $f$ it suffices to compute the possible orthogonal matrices $V$. This method computes the orthostochastic matrices which are the Hadamard squares of $V$, via the algorithm in [1], and returns the associated determinantal representation (using the method orthogonalFromOrthostochastic - see that method for more on the possible orthogonal matrices returned).

For a generic hyperbolic polynomial of degree $d$ in 3 variables, the number of definite determinantal representations is $2^g$, where $g = (d-1)(d-2)/2$ is the genus of the plane curve.

For plane curves in special position, the option HyperbolicPt allows the user to specify a point $e$ such that the polynomial is hyperbolic with respect to $e$. In this case, a general coordinate change which brings $e$ to $(1,0,0)$ is applied before computing the determinantal representation (which will then be inverted before giving the result - note that the representation will no longer be monic in general).

When working over an InexactFieldFamily like RR or CC, the option Tolerance can be used to specify the internal threshold for checking equality (any floating point number below the tolerance is treated as numerically zero).

 i1 : R = RR[x1, x2, x3] o1 = R o1 : PolynomialRing i2 : f = 6*x1^3+36*x1^2*x2+66*x1*x2^2+36*x2^3+11*x1^2*x3+42*x1*x2*x3+36*x2^2*x3+6*x1*x3^2+11*x2*x3^2+x3^3 3 2 2 3 2 2 o2 = 6x1 + 36x1 x2 + 66x1*x2 + 36x2 + 11x1 x3 + 42x1*x2*x3 + 36x2 x3 + ------------------------------------------------------------------------ 2 2 3 6x1*x3 + 11x2*x3 + x3 o2 : R i3 : repList = detRep f o3 = {| 1.81712x1+5.45136x2+1.36284x3 .489588x3 | .489588x3 1.81712x1+3.63424x2+1.21141x3 | .0462468x3 .237183x3 ------------------------------------------------------------------------ .0462468x3 |, | 1.81712x1+5.45136x2+1.36284x3 .237183x3 | | .438081x3 1.81712x1+1.81712x2+.757134x3 | | .312572x3 ------------------------------------------------------------------------ .438081x3 .312572x3 |} 1.81712x1+3.63424x2+1.21141x3 .0920576x3 | .0920576x3 1.81712x1+1.81712x2+.757134x3 | o3 : List i4 : all(repList, A -> clean(1e-10, f - det A) == 0) o4 = true i5 : g = product gens R -- hyperbolic with respect to (1,1,1) o5 = x1*x2*x3 o5 : R i6 : B = clean(1e-6, first detRep(g, HyperbolicPt => matrix{{1_RR},{1},{1}})) o6 = | .826721x1 0 0 | | 0 .926078x2 0 | | 0 0 1.30615x3 | 3 3 o6 : Matrix R <--- R i7 : clean(1e-6, g - det B) o7 = 0 o7 : R