]>
gitweb.michael.orlitzky.com - sage.d.git/blob - mjo/ldlt.py
1c2663ea3d574360059b07d22f9af8163ebdc2e7
3 def is_positive_semidefinite_naive(A
):
5 A naive positive-semidefinite check that tests the eigenvalues for
6 nonnegativity. We follow the sage convention that positive
7 (semi)definite matrices must be symmetric or Hermitian.
11 sage: from mjo.ldlt import is_positive_semidefinite_naive
15 The trivial matrix is vaciously positive-semidefinite::
17 sage: A = matrix(QQ, 0)
20 sage: is_positive_semidefinite_naive(A)
25 return True # vacuously
26 return A
.is_hermitian() and all( v
>= 0 for v
in A
.eigenvalues() )
29 def is_positive_semidefinite(A
):
31 A fast positive-semidefinite check based on the block-LDLT
36 sage: from mjo.ldlt import (is_positive_semidefinite,
37 ....: is_positive_semidefinite_naive)
41 Check that the naive and fast answers are the same, in general::
43 sage: set_random_seed()
44 sage: F = NumberField(x^2 + 1, 'I')
45 sage: from sage.misc.prandom import choice
46 sage: ring = choice([ZZ,QQ,F])
47 sage: A = matrix.random(ring, 10)
48 sage: is_positive_semidefinite(A) == is_positive_semidefinite_naive(A)
51 Check that the naive and fast answers are the same for a Hermitian
54 sage: set_random_seed()
55 sage: F = NumberField(x^2 + 1, 'I')
56 sage: from sage.misc.prandom import choice
57 sage: ring = choice([ZZ,QQ,F])
58 sage: A = matrix.random(ring, 10); A = A + A.conjugate_transpose()
59 sage: is_positive_semidefinite(A) == is_positive_semidefinite_naive(A)
63 if not A
.is_hermitian():
65 _
,_
,d
= A
._block
_ldlt
()
71 # A 2x2 block indicates that it's indefinite