+ sage: L31 = Cone([(1,0,1), (0,-1,1), (-1,0,1), (0,1,1)])
+ sage: lyapunov_rank(L31)
+ 1
+
+ Likewise for the `L^{3}_{\infty}` cone [Rudolf]_::
+
+ sage: L3infty = Cone([(0,1,1), (1,0,1), (0,-1,1), (-1,0,1)])
+ sage: lyapunov_rank(L3infty)
+ 1
+
+ A single ray in `n` dimensions should have Lyapunov rank `n^{2} - n
+ + 1` [Orlitzky]_::
+
+ sage: K = Cone([(1,0,0,0,0)])
+ sage: lyapunov_rank(K)
+ 21
+ sage: K.lattice_dim()**2 - K.lattice_dim() + 1
+ 21
+
+ A subspace (of dimension `m`) in `n` dimensions should have a
+ Lyapunov rank of `n^{2} - m\left(n - m)` [Orlitzky]_::
+
+ sage: e1 = (1,0,0,0,0)
+ sage: neg_e1 = (-1,0,0,0,0)
+ sage: e2 = (0,1,0,0,0)
+ sage: neg_e2 = (0,-1,0,0,0)
+ sage: z = (0,0,0,0,0)
+ sage: K = Cone([e1, neg_e1, e2, neg_e2, z, z, z])
+ sage: lyapunov_rank(K)
+ 19
+ sage: K.lattice_dim()**2 - K.dim()*K.codim()
+ 19
+
+ The Lyapunov rank should be additive on a product of proper cones
+ [Rudolf]_::
+
+ sage: L31 = Cone([(1,0,1), (0,-1,1), (-1,0,1), (0,1,1)])
+ sage: octant = Cone([(1,0,0), (0,1,0), (0,0,1)])
+ sage: K = L31.cartesian_product(octant)
+ sage: lyapunov_rank(K) == lyapunov_rank(L31) + lyapunov_rank(octant)
+ True
+
+ Two isomorphic cones should have the same Lyapunov rank [Rudolf]_.
+ The cone ``K`` in the following example is isomorphic to the nonnegative
+ octant in `\mathbb{R}^{3}`::
+
+ sage: K = Cone([(1,2,3), (-1,1,0), (1,0,6)])
+ sage: lyapunov_rank(K)
+ 3
+
+ The dual cone `K^{*}` of ``K`` should have the same Lyapunov rank as ``K``
+ itself [Rudolf]_::
+
+ sage: K = Cone([(2,2,4), (-1,9,0), (2,0,6)])
+ sage: lyapunov_rank(K) == lyapunov_rank(K.dual())
+ True