On this page
The spectral theorem for real symmetric matrices
Imports 1 library modules and 14 external
External: HB.structures, mathcomp.classical.all_ssreflect_compat, mathcomp.algebra.algebraic_hierarchy.ssralg, mathcomp.algebra.numeric_hierarchy.ssrnum, mathcomp.algebra.matrix, mathcomp.algebra.sesquilinear, mathcomp.classical.boolp, mathcomp.classical.classical_sets, mathcomp.reals.reals, mathcomp.analysis.topology_theory.topology, mathcomp.analysis.normedtype_theory.normedtype, mathcomp.analysis.derive, mathcomp.algebra.ring_tactic, mathcomp.algebra.field_tactic
Imported by 31
- GaussianAnalysis.matrix.whitening
- GaussianAnalysis.matrix.opnorm
- GaussianAnalysis.matrix.lambda_max
- GaussianAnalysis.matrix.psd_splitting
- GaussianAnalysis.matrix.spectral_gap
- GaussianAnalysis.matrix.nets
- GaussianAnalysis.matrix.random_opnorm
- GaussianAnalysis.matrix.von_neumann
- GaussianAnalysis.matrix.psd_part
- GaussianAnalysis.matrix.effective_rank
- GaussianAnalysis.matrix.nuclear
- GaussianAnalysis.matrix.condition_cone
- GaussianAnalysis.matrix.tensor_packing
- GaussianAnalysis.probability.hanson_wright
- GaussianAnalysis.probability.finite_gap
- GaussianAnalysis.random_matrix.goe
- GaussianAnalysis.random_matrix.goe_edge
- GaussianAnalysis.random_matrix.goe_rotation
- GaussianAnalysis.random_matrix.matrix_series
- GaussianAnalysis.comparison.brascamp_lieb
- GaussianAnalysis.convex.self_concordant
- GaussianAnalysis.convex.logdet_barrier
- GaussianAnalysis.convex.minimizers
- GaussianAnalysis.convex.gauss_feature
- GaussianAnalysis.convex.ls_insertion
- GaussianAnalysis.convex.barrier_lindeberg
- GaussianAnalysis.convex.moreau
- GaussianAnalysis.convex.feature_mixture
- GaussianAnalysis.fourier.small_ball
- GaussianApplications.SKGap.Ising
- GaussianApplications.SKGap.Poincare
Required by 35 files of the paper proofs
- extension/Condition/Cover.v
- extension/Condition/GaussianCone.v
- extension/Condition/Sat.v
- extension/Condition/Slices.v
- extension/Condition/Unsat.v
- extension/ConditionKappa/GaussianLimit.v
- extension/ConditionKappa/Geometry.v
- extension/ConditionKappa/Sat.v
- extension/ConditionKappa/Unsat.v
- extension/Features/Regular.v
- extension/Gaussian/Cones.v
- extension/Gaussian/FittingError.v
- extension/Gaussian/Limit.v
- extension/Gaussian/Representation.v
- extension/Gaussian/Subcritical.v
- extension/Mixture/Interpolation.v
- extension/Sat/ApproximateFit.v
- extension/Sat/Interpolation.v
- extension/Sat/LightTail.v
- extension/Sat/LightTailBound.v
- extension/Sat/SparseLower.v
- extension/Sat/Universality.v
- extension/Unsat/FourthMomentThree.v
- extension/Unsat/GoeBridge.v
- extension/Unsat/LeastSquares.v
- extension/Unsat/Ridge.v
- extension/Unsat/Universality.v
- theories/Feature/DiagonalTrace.v
- theories/Spectral/Cutoff.v
- theories/Spectral/OperatorTransport.v
- theories/Spectral/OrthogonalBounds.v
- theories/Spectral/SymmetricDiagonalization.v
- theories/SquareFree/EdgeLower.v
- theories/SquareFree/EdgeUpper.v
- theories/SquareFree/WalkNBEvent.v
Every real symmetric matrix A is orthogonally diagonalizable: A = P^T *m diag_mx d *m P with P orthogonal (symmetric_spectral). The proof is the analytic one and works over any realType: the quadratic form of A attains its maximum on the compact unit sphere, a maximizer is an eigenvector, and the Householder reflection that sends it to the first basis vector splits off one dimension. No complex number is used.
The Frobenius norm is compared with mx_norm, the norm of MathComp-Analysis on matrices (the largest absolute value of an entry): mx_norm A <= frobenius A <= sqrt (m n) mx_norm A (mx_norm_le_frobenius, frobenius_le_mx_norm). So the topology of 'M[R]_(m, n) is the topology of the Frobenius norm, and the unit sphere is compact (compact_unit_sphere).
householder w | the Householder reflection 1 - (2 / mxdot w w) *: (w *m w^T) of w : 'cV[R]_n, equal to 1 when w = 0 |
sym_ | an orthogonal matrix P such that A = P^T *m diag_mx (sym_spectral_diag A) *m P when A is symmetric |
sym_ | the eigenvalues of A, in the order of the rows of sym_spectralmx A |
Main results
| Results | Statement | Used by theories/ |
|---|---|---|
Spectral theorem: every real symmetric matrix is P^T diag(d) P with P orthogonal, over any realType. Proved by maximizing the quadratic form on the unit sphere and splitting off a dimension with a Householder reflection. | Spectral/ | |
mx_norm A <= frobenius A <= sqrt (m n) mx_norm A, where mx_norm is the norm of MathComp-Analysis on matrices (the largest absolute value of an entry), so the Frobenius norm defines the topology of 'M[R]_(m, n); the unit sphere of 'rV[R]_n is compact. | through symmetric_spectral | |
| The quadratic form attains its maximum on the unit sphere; for a symmetric matrix a maximizer is an eigenvector. | through symmetric_spectral | |
If A = P^T diag(d) P with P orthogonal: the trace is the sum of the d_i, the squared Frobenius norm is the sum of the d_i^2, x^T A x = sum_i d_i (P x)_i^2, and x^T A x <= b x^T x for all x if and only if every d_i <= b (likewise for lower bounds, positive semidefiniteness and absolute values). | Spectral/, Spectral/; spectral_form_le inside the library only | |
If A = P^T diag(d) P with P orthogonal, then A^k = P^T diag(d^k) P. For symmetric A, B: tr(ABAB) <= tr(A^2 B^2). | Feature/; spectral_exp inside the library only |
Declarations38 exported
Variable R : fieldType.
forall [R : fieldType] [n : nat] (A : 'M_n), reflect (A^T = A) (A \is symmetricmx)
Statement as written in the source
Lemma symmetricmxP n (A : 'M[R]_n) : reflect (A^T = A) (A \is symmetricmx).
Used by 86 declarations in 27 files
- this file: symmetricmx_conj, mxtrace_ABAB_le, householder_sym, mxdot_mulmx_sym, symmetric_eigenvector, symmetric_block_of_eigen
- GaussianAnalysis.matrix.whitening: sym_spectral_diag_ge
- GaussianAnalysis.matrix.opnorm: opnorm_spectral
- GaussianAnalysis.matrix.lambda_max: lambda_max_eigenvector
- GaussianAnalysis.matrix.psd_splitting: orthoprojmx1, orthoprojmx0, orthoprojmxB, psdmx_conj, psdmxD, psdmx0, mxtrace_psd_ge0, frobenius_sqr_sym, spectral_nonneg_proj, mxdot_block0, mxdot_sym_tr, two_matrix_split, mxdot_compress, trace_quad_sub_le
- GaussianAnalysis.matrix.spectral_gap: opnorm_row_sum
- GaussianAnalysis.matrix.random_opnorm: sym_part_sym, mxdot_sym_part, mxdot_psd_le
- GaussianAnalysis.matrix.von_neumann: hoffman_wielandt
- GaussianAnalysis.matrix.psd_part: psd_conj, mxdot_psd_ge0, psd_partE, spec_conj_diag, mxdot_spec_le
- GaussianAnalysis.matrix.effective_rank: effective_rank_spec
- GaussianAnalysis.matrix.nuclear: nuclear_spectral, nuclear_sym, range_duality_sym
- GaussianAnalysis.matrix.condition_cone: cond_cone0, cond_cone1, cond_coneZ, cond_cone_convex, cond_cone_vec_closed, cond_clip_cone, cond_support_sym
- GaussianAnalysis.matrix.tensor_packing: gram_sym, opnorm_compress_gram
- GaussianAnalysis.probability.hanson_wright: gauss_chaos_mgf
- GaussianAnalysis.probability.finite_gap: wop_mx_sym
- GaussianAnalysis.random_matrix.goe: goe_mx_symmetric
- GaussianAnalysis.random_matrix.goe_rotation: goe_equiv_pair, goe_diag_var_tail
- GaussianAnalysis.random_matrix.matrix_series: mxtrace_sandwich_le, series_sym, sym_dilation_sym, gauss_mx_series_opnorm_moment
- GaussianAnalysis.convex.logdet_barrier: posdefmx_spectral, posdefmx_congruence, congruence_diag, sym_tracelessP, posdefmx_ge, posdefmx_convex, posdefmx_open, rel_open_convex_pd_slice, rel_open_convex_pd_slice2, logdet2_sc_barrier, posdefmx_scalar, logdet_barrier2_ge0
- GaussianAnalysis.convex.minimizers: vspace_orthonormal, quad_response
- GaussianAnalysis.convex.gauss_feature: gauss_mxdot_moments, gauss_regular_feature
- GaussianAnalysis.convex.ls_insertion: ins_hformC, ins_hessian_pd, ins_inv_sym, ins_T_sym, ins_T_frobenius
- GaussianAnalysis.convex.barrier_lindeberg: loo_compare
- GaussianAnalysis.convex.feature_mixture: mixture_regular_feature_dot
- GaussianAnalysis.fourier.small_ball: vector_small_ball, vector_small_ball_variance
- GaussianApplications.SKGap.Ising: quad_expand
- GaussianApplications.SKGap.Poincare: A_sym, ising_cov_sym, gap_from_bounds, scaled_bounds, sk_coupling_sym
forall [R : fieldType] [m n : nat] [A : 'M_n] (P : 'M_(m, n)), A \is symmetricmx -> P *m A *m P^T \is symmetricmx
Statement as written in the source
Lemma symmetricmx_conj m n (A : 'M[R]_n) (P : 'M[R]_(m, n)) : A \is symmetricmx -> P *m A *m P^T \is symmetricmx.
Used by 7 declarations in 5 files
- this file: symmetric_spectral
- GaussianAnalysis.matrix.opnorm: opnorm_spectral
- GaussianAnalysis.matrix.psd_part: psd_conj, psd_partE, spec_conj_diag
- GaussianAnalysis.matrix.nuclear: nuclear_spectral
- GaussianAnalysis.matrix.condition_cone: cond_clip_cone
Variable R : realFieldType.
forall [R : realFieldType] [n : nat] [A B : 'M_n], A \is symmetricmx -> B \is symmetricmx -> \tr (A *m B *m A *m B) <= \tr (A *m A *m B *m B)
Stated in the README together with spectral_exp.
Statement as written in the source
Lemma mxtrace_ABAB_le n (A B : 'M[R]_n) : A \is symmetricmx -> B \is symmetricmx -> \tr (A *m B *m A *m B) <= \tr (A *m A *m B *m B).
Variable R : realType. Implicit Types m n : nat.
forall [R : realType] [m n : nat] (A : 'M_(m, n)) (i : 'I_m) (j : 'I_n), `|A i j| <= mx_norm A
Statement as written in the source
Lemma entry_le_mx_norm m n (A : 'M[R]_(m, n)) i j : `|A i j| <= mx_norm A.
Used by 1 declaration in 1 file
- this file: frobenius_le_mx_norm
forall [R : realType] [m n : nat] (A : 'M_(m, n)), mx_norm A <= frobenius A
mx_norm A <= frobenius A <= sqrt (m n) mx_norm A, where mx_norm is the norm of MathComp-Analysis on matrices (the largest absolute value of an entry), so the Frobenius norm defines the topology of 'M[R]_(m, n); the unit sphere of 'rV[R]_n is compact.
theories/ by: through symmetric_spectralStatement as written in the source
Lemma mx_norm_le_frobenius m n (A : 'M[R]_(m, n)) : mx_norm A <= frobenius A.
Used by 3 declarations in 3 files
- this file: compact_unit_sphere
- GaussianAnalysis.matrix.nuclear: range_duality
- GaussianAnalysis.convex.minimizers: sc_minimizer
forall [R : realType] [m n : nat] (A : 'M_(m, n)), frobenius A <= Num.ExtraDef.sqrtr (m * n)%:R * mx_norm A
Stated in the README together with mx_norm_le_frobenius.
Statement as written in the source
Lemma frobenius_le_mx_norm m n (A : 'M[R]_(m, n)) : frobenius A <= Num.sqrt (m * n)%:R * mx_norm A.
Used by 2 declarations in 2 files
- GaussianAnalysis.convex.self_concordant: sc_function_continuous
- GaussianAnalysis.convex.logdet_barrier: frobenius_vec_mx
forall [R : realType] [n : nat] [A : 'M_n], continuous (fun w : 'rV_n => (w *m A *m w^T) 0 0)
Statement as written in the source
Lemma continuous_form n (A : 'M[R]_n) : continuous (fun w : 'rV[R]_n => (w *m A *m w^T) 0 0).
Used by 4 declarations in 3 files
- this file: continuous_mxdot, rayleigh_max
- GaussianAnalysis.convex.minimizers: continuous_ls_reduced
- GaussianAnalysis.convex.moreau: continuous_dist2
forall [R : realType] [n : nat], continuous (fun w : 'rV_n => mxdot w w)
Statement as written in the source
Lemma continuous_mxdot n : continuous (fun w : 'rV[R]_n => mxdot w w).
Used by 1 declaration in 1 file
- this file: compact_unit_sphere
forall [R : realType] [n : nat], compact [set w | mxdot w w = 1]
Stated in the README together with mx_norm_le_frobenius.
Statement as written in the source
Lemma compact_unit_sphere n : compact [set w : 'rV[R]_n | mxdot w w = 1].
Used by 1 declaration in 1 file
- this file: rayleigh_max
Variable R : realFieldType. Implicit Types n : nat.
forall [R : realFieldType] [n : nat], 'cV_n -> 'M_nDefinition householder n (w : 'cV[R]_n) : 'M[R]_n := 1%:M - (2 / mxdot w w) *: (w *m w^T).
Used by 10 declarations in 3 files
- this file: householder0, householder_tr, householder_sym, householderK, householder_orthogonal, householder_swap, householderN, symmetric_spectral
- GaussianAnalysis.random_matrix.goe_rotation: goe_equiv_form
- GaussianAnalysis.comparison.brascamp_lieb: gauss_ibp_unit
forall (R : realFieldType) (n : nat), householder (0 : 'cV_n) = 1%:M
Statement as written in the source
Lemma householder0 n : householder (0 : 'cV[R]_n) = 1%:M.
Used by 2 declarations in 1 file
- this file: householderK, householder_swap
forall [R : realFieldType] [n : nat] (w : 'cV_n), (householder w)^T = householder w
Statement as written in the source
Lemma householder_tr n (w : 'cV[R]_n) : (householder w)^T = householder w.
Used by 5 declarations in 3 files
- this file: householder_sym, householder_orthogonal, symmetric_spectral
- GaussianAnalysis.random_matrix.goe_rotation: goe_equiv_form
- GaussianAnalysis.comparison.brascamp_lieb: gauss_ibp_unit
forall [R : realFieldType] [n : nat] (w : 'cV_n), householder w \is symmetricmx
Statement as written in the source
Lemma householder_sym n (w : 'cV[R]_n) : householder w \is symmetricmx.
forall [R : realFieldType] [n : nat] (w : 'cV_n), householder w *m householder w = 1%:M
Statement as written in the source
Lemma householderK n (w : 'cV[R]_n) : householder w *m householder w = 1%:M.
Used by 2 declarations in 1 file
- this file: householder_orthogonal, symmetric_spectral
forall [R : realFieldType] [n : nat] (w : 'cV_n), householder w \is orthogonalmx
Statement as written in the source
Lemma householder_orthogonal n (w : 'cV[R]_n) : householder w \is orthogonalmx.
Used by 3 declarations in 3 files
- this file: symmetric_spectral
- GaussianAnalysis.random_matrix.goe_rotation: goe_equiv_form
- GaussianAnalysis.comparison.brascamp_lieb: gauss_ibp_unit
forall [R : realFieldType] [n : nat] [u v : 'cV_n], mxdot u u = mxdot v v -> householder (u - v) *m u = v
Statement as written in the source
Lemma householder_swap n (u v : 'cV[R]_n) : mxdot u u = mxdot v v -> householder (u - v) *m u = v.
Used by 3 declarations in 3 files
- this file: symmetric_spectral
- GaussianAnalysis.random_matrix.goe_rotation: goe_equiv_form
- GaussianAnalysis.comparison.brascamp_lieb: gauss_ibp_unit
Variable R : realType. Implicit Types n : nat.
forall [R : realType] [n : nat] (w : 'cV_n), householder (- w) = householder w
Statement as written in the source
Lemma householderN n (w : 'cV[R]_n) : householder (- w) = householder w.
Used by 1 declaration in 1 file
- this file: symmetric_spectral
forall [R : realType] [n : nat] [M : 'M_n] (x y : 'cV_n), M \is symmetricmx -> mxdot (M *m x) y = mxdot x (M *m y)
Statement as written in the source
Used by 2 declarations in 2 files
- this file: psd_form_eq0
- GaussianApplications.SKGap.Ising: quad_expand
forall [R : realType] [n : nat] [M : 'M_n] [v : 'cV_n], M \is symmetricmx -> (forall x : 'cV_n, 0 <= mxdot x (M *m x)) -> mxdot v (M *m v) = 0 -> M *m v = 0
A nonnegative symmetric form vanishes at v only if M v = 0.
Statement as written in the source
Used by 2 declarations in 2 files
- this file: symmetric_eigenvector
- GaussianAnalysis.matrix.lambda_max: lambda_max_eigenvector
forall [R : realType] [n : nat] (A : 'M_n.+1), exists2 v : 'cV_n.+1, mxdot v v = 1 & forall x : 'cV_n.+1, mxdot x (A *m x) <= mxdot v (A *m v) * mxdot x x
The quadratic form attains its maximum on the unit sphere; for a symmetric matrix a maximizer is an eigenvector.
theories/ by: through symmetric_spectralStatement as written in the source
Used by 2 declarations in 2 files
- this file: symmetric_eigenvector
- GaussianAnalysis.matrix.lambda_max: lambda_max_attained
forall [R : realType] [n : nat] [A : 'M_n.+1], A \is symmetricmx -> exists2 v : 'cV_n.+1, mxdot v v = 1 & A *m v = mxdot v (A *m v) *: v
Stated in the README together with rayleigh_max.
Statement as written in the source
Used by 1 declaration in 1 file
- this file: symmetric_spectral
forall [R : realType] [k : nat] [M : 'M_(1 + k)] [l : R], M \is symmetricmx -> M *m col_mx 1%:M 0 = l *: col_mx 1%:M 0 -> M = block_mx l%:M 0 0 (drsubmx M) /\ drsubmx M \is symmetricmx
Statement as written in the source
Lemma symmetric_block_of_eigen k (M : 'M[R]_(1 + k)) (l : R) : M \is symmetricmx -> M *m col_mx 1%:M 0 = l *: col_mx 1%:M 0 -> M = block_mx l%:M 0 0 (drsubmx M) /\ drsubmx M \is symmetricmx.
Used by 1 declaration in 1 file
- this file: symmetric_spectral
forall [R : realType] [n : nat] [A : 'M_n], A \is symmetricmx -> exists2 P : 'M_n, P \is orthogonalmx & exists d : 'rV_n, A = P^T *m diag_mx d *m P
Spectral theorem: every real symmetric matrix is P^T diag(d) P with P orthogonal, over any realType. Proved by maximizing the quadratic form on the unit sphere and splitting off a dimension with a Householder reflection.
theories/ by: Spectral/SymmetricDiagonalization Statement as written in the source
Lemma symmetric_spectral n (A : 'M[R]_n) : A \is symmetricmx -> exists2 P : 'M[R]_n, P \is orthogonalmx & exists d : 'rV[R]_n, A = P^T *m diag_mx d *m P.
Used by 17 declarations in 11 files
- this file: ex_sym_spectral
- GaussianAnalysis.matrix.opnorm: opnorm_symP, opnorm_exp_le_trace, opnorm_le_form_exp
- GaussianAnalysis.matrix.spectral_gap: psd_square_gap
- GaussianAnalysis.matrix.random_opnorm: mxdot_psd_le
- GaussianAnalysis.matrix.psd_part: mxdot_psd_ge0
- GaussianAnalysis.matrix.tensor_packing: tensor_packing
- GaussianAnalysis.probability.hanson_wright: gauss_chaos_mgf
- GaussianAnalysis.random_matrix.matrix_series: mxtrace_sandwich_le, mxtrace_mul_psd_le, psdmx_exp_even
- GaussianAnalysis.convex.logdet_barrier: posdefmx_spectral, congruence_diag, logdet_barrier2_ge0
- GaussianAnalysis.convex.gauss_feature: gauss_quad_moments
- GaussianAnalysis.convex.ls_insertion: ins_T_frobenius
Variable R : realType. Implicit Types n : nat.
forall [R : realType] [n : nat] [A P : 'M_n] [d : 'rV_n] (i : 'I_n), P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> A *m (row i P)^T = d 0 i *: (row i P)^T
Statement as written in the source
Lemma spectral_eigenvector n (A P : 'M[R]_n) (d : 'rV[R]_n) i : P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> A *m (row i P)^T = d 0 i *: (row i P)^T.
Used by 6 declarations in 5 files
- this file: spectral_form_le, spectral_form_ge
- GaussianAnalysis.matrix.opnorm: opnorm_spectral
- GaussianAnalysis.matrix.spectral_gap: psd_square_gap
- GaussianAnalysis.matrix.condition_cone: cond_cone_quad
- GaussianAnalysis.convex.logdet_barrier: posdefmx_spectral
forall [R : realType] [n : nat] [P : 'M_n] (i : 'I_n), P \is orthogonalmx -> mxdot (row i P)^T (row i P)^T = 1
Statement as written in the source
Lemma orthogonalmx_row_unit n (P : 'M[R]_n) i : P \is orthogonalmx -> mxdot (row i P)^T (row i P)^T = 1.
Used by 6 declarations in 5 files
- this file: spectral_form_le, spectral_form_ge
- GaussianAnalysis.matrix.opnorm: opnorm_spectral
- GaussianAnalysis.matrix.spectral_gap: psd_square_gap
- GaussianAnalysis.matrix.condition_cone: cond_cone_quad
- GaussianAnalysis.convex.logdet_barrier: posdefmx_spectral
forall [R : realType] [n : nat] [A P : 'M_n] [d : 'rV_n], P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> \tr A = \sum_i d 0 i
If A = P^T diag(d) P with P orthogonal: the trace is the sum of the d_i, the squared Frobenius norm is the sum of the d_i^2, x^T A x = sum_i d_i (P x)_i^2, and x^T A x <= b x^T x for all x if and only if every d_i <= b (likewise for lower bounds, positive semidefiniteness and absolute values).
theories/ by: Spectral/SymmetricDiagonalization , Spectral/Cutoff ; spectral_form_le inside the library onlyStatement as written in the source
Lemma spectral_trace n (A P : 'M[R]_n) (d : 'rV[R]_n) : P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> \tr A = \sum_i d 0 i.
Used by 9 declarations in 8 files
- GaussianAnalysis.matrix.opnorm: opnorm_exp_le_trace
- GaussianAnalysis.matrix.random_opnorm: mxdot_psd_le
- GaussianAnalysis.matrix.von_neumann: sum_spec_exp
- GaussianAnalysis.matrix.psd_part: trace_psd_part_shift, sum_spec_trace
- GaussianAnalysis.matrix.tensor_packing: tensor_packing
- GaussianAnalysis.probability.hanson_wright: gauss_chaos_mgf
- GaussianAnalysis.random_matrix.matrix_series: mxtrace_mul_psd_le
- GaussianAnalysis.convex.ls_insertion: ins_T_frobenius
forall [R : realType] [n : nat] [A P : 'M_n] [d : 'rV_n], P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> mxdot A A = \sum_i d 0 i ^+ 2
Stated in the README together with spectral_trace.
Statement as written in the source
Lemma spectral_mxdot n (A P : 'M[R]_n) (d : 'rV[R]_n) : P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> mxdot A A = \sum_i d 0 i ^+ 2.
Used by 4 declarations in 4 files
- GaussianAnalysis.matrix.von_neumann: mxdot_spec
- GaussianAnalysis.matrix.psd_part: frobenius_psd_part_shift
- GaussianAnalysis.matrix.condition_cone: cond_clip_energy
- GaussianAnalysis.convex.ls_insertion: ins_T_frobenius
forall [R : realType] [n : nat] [A P : 'M_n] [d : 'rV_n] (x : 'cV_n), A = P^T *m diag_mx d *m P -> mxdot x (A *m x) = \sum_i d 0 i * (P *m x) i 0 ^+ 2
Stated in the README together with spectral_trace.
Statement as written in the source
Lemma spectral_form n (A P : 'M[R]_n) (d : 'rV[R]_n) (x : 'cV[R]_n) : A = P^T *m diag_mx d *m P -> mxdot x (A *m x) = \sum_i d 0 i * (P *m x) i 0 ^+ 2.
Used by 4 declarations in 3 files
- this file: spectral_form_le, spectral_form_ge
- GaussianAnalysis.matrix.spectral_gap: psd_square_gap
- GaussianAnalysis.matrix.tensor_packing: spectral_rowperp_form_le
forall [R : realType] [n : nat] [A P : 'M_n] [d : 'rV_n] (b : R), P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> (forall x : 'cV_n, mxdot x (A *m x) <= b * mxdot x x) <-> (forall i : 'I_n, d 0 i <= b)
Stated in the README together with spectral_trace.
Statement as written in the source
Lemma spectral_form_le n (A P : 'M[R]_n) (d : 'rV[R]_n) (b : R) : P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> (forall x : 'cV[R]_n, mxdot x (A *m x) <= b * mxdot x x) <-> (forall i, d 0 i <= b).
Used by 8 declarations in 5 files
- this file: spectral_form_abs
- GaussianAnalysis.matrix.opnorm: opnorm_le_form_exp
- GaussianAnalysis.matrix.condition_cone: cond_coneP, cond_clip_cone, cond_slice_t, cond_slice_form
- GaussianAnalysis.probability.hanson_wright: gauss_chaos_mgf
- GaussianAnalysis.convex.ls_insertion: ins_T_frobenius
forall [R : realType] [n : nat] [A P : 'M_n] [d : 'rV_n] (b : R), P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> (forall x : 'cV_n, b * mxdot x x <= mxdot x (A *m x)) <-> (forall i : 'I_n, b <= d 0 i)
Statement as written in the source
Lemma spectral_form_ge n (A P : 'M[R]_n) (d : 'rV[R]_n) (b : R) : P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> (forall x : 'cV[R]_n, b * mxdot x x <= mxdot x (A *m x)) <-> (forall i, b <= d 0 i).
Used by 9 declarations in 5 files
- this file: spectral_psd, spectral_form_abs
- GaussianAnalysis.matrix.whitening: sym_spectral_diag_ge
- GaussianAnalysis.matrix.condition_cone: cond_coneP, cond_clip_cone, cond_slice_t, cond_slice_form
- GaussianAnalysis.probability.hanson_wright: gauss_chaos_mgf
- GaussianAnalysis.convex.logdet_barrier: posdefmx_ge
forall [R : realType] [n : nat] [A P : 'M_n] [d : 'rV_n], P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> (forall x : 'cV_n, 0 <= mxdot x (A *m x)) <-> (forall i : 'I_n, 0 <= d 0 i)
Stated in the README together with spectral_trace.
Statement as written in the source
Lemma spectral_psd n (A P : 'M[R]_n) (d : 'rV[R]_n) : P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> (forall x : 'cV[R]_n, 0 <= mxdot x (A *m x)) <-> (forall i, 0 <= d 0 i).
Used by 9 declarations in 7 files
- GaussianAnalysis.matrix.spectral_gap: psd_square_gap
- GaussianAnalysis.matrix.random_opnorm: mxdot_psd_le
- GaussianAnalysis.matrix.psd_part: psd_conj, mxdot_psd_ge0, spec_psd_ge0
- GaussianAnalysis.matrix.condition_cone: cond_cone_quad
- GaussianAnalysis.matrix.tensor_packing: tensor_packing
- GaussianAnalysis.random_matrix.matrix_series: mxtrace_mul_psd_le
- GaussianAnalysis.convex.ls_insertion: ins_T_frobenius
forall [R : realType] [n : nat] [A P : 'M_n] [d : 'rV_n] (b : R), P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> (forall x : 'cV_n, `|mxdot x (A *m x)| <= b * mxdot x x) <-> (forall i : 'I_n, `|d 0 i| <= b)
Stated in the README together with spectral_trace.
Statement as written in the source
Lemma spectral_form_abs n (A P : 'M[R]_n) (d : 'rV[R]_n) (b : R) : P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> (forall x : 'cV[R]_n, `|mxdot x (A *m x)| <= b * mxdot x x) <-> (forall i, `|d 0 i| <= b).
Used by 3 declarations in 1 file
- GaussianAnalysis.matrix.opnorm: opnorm_symP, opnorm_spectral, opnorm_le_form_exp
forall [R : realType] [n : nat] [A P : 'M_n] [d : 'rV_n] (k : nat), P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> A ^+ k = P^T *m diag_mx (\row_i d 0 i ^+ k) *m P
If A = P^T diag(d) P with P orthogonal, then A^k = P^T diag(d^k) P. For symmetric A, B: tr(ABAB) <= tr(A^2 B^2).
Statement as written in the source
Lemma spectral_exp n (A P : 'M[R]_n) (d : 'rV[R]_n) k : P \is orthogonalmx -> A = P^T *m diag_mx d *m P -> A ^+ k = P^T *m diag_mx (\row_i d 0 i ^+ k) *m P.
Used by 5 declarations in 3 files
- GaussianAnalysis.matrix.opnorm: opnorm_exp_le_trace, opnorm_le_form_exp
- GaussianAnalysis.matrix.von_neumann: sum_spec_exp
- GaussianAnalysis.random_matrix.matrix_series: mxtrace_sandwich_le, psdmx_exp_even
A chosen orthogonal diagonalization.
forall [R : realType] [n : nat] (A : 'M_n), exists Pd : 'M_n * 'rV_n, (Pd.1 \is orthogonalmx) && ((A \is symmetricmx) ==> (A == (Pd.1)^T *m diag_mx Pd.2 *m Pd.1))
Statement as written in the source
Lemma ex_sym_spectral n (A : 'M[R]_n) : exists Pd : 'M[R]_n * 'rV[R]_n, (Pd.1 \is orthogonalmx) && ((A \is symmetricmx) ==> (A == Pd.1^T *m diag_mx Pd.2 *m Pd.1)).
Used by 4 declarations in 1 file
forall [R : realType] [n : nat], 'M_n -> 'M_nDefinition sym_spectralmx n (A : 'M[R]_n) : 'M[R]_n := (xchoose (ex_sym_spectral A)).1.
Used by 16 declarations in 6 files
- this file: sym_spectralmx_orthogonal, sym_spectralE
- GaussianAnalysis.matrix.whitening: whitening_mx, whitening_mxP, frobenius_whitening_mx
- GaussianAnalysis.matrix.psd_splitting: spectral_nonneg_proj
- GaussianAnalysis.matrix.von_neumann: spec_decomposition
- GaussianAnalysis.matrix.psd_part: psd_part, psd_partE, psd_part_conj, psd_part_moreau, psd_partZ, spec_conj_diag
- GaussianAnalysis.matrix.condition_cone: cond_clip, cond_clip_cone, cond_clip_energy
forall [R : realType] [n : nat], 'M_n -> 'rV_nDefinition sym_spectral_diag n (A : 'M[R]_n) : 'rV[R]_n := (xchoose (ex_sym_spectral A)).2.
Used by 21 declarations in 6 files
- this file: sym_spectralE
- GaussianAnalysis.matrix.whitening: whitening_mx, sym_spectral_diag_ge, whitening_mxP, frobenius_whitening_mx
- GaussianAnalysis.matrix.psd_splitting: spectral_nonneg_proj
- GaussianAnalysis.matrix.von_neumann: spec_seq, perm_spec_seq, spec_perm, sum_spec, spec_decomposition
- GaussianAnalysis.matrix.psd_part: psd_part, psd_partE, psd_part_nearest, psd_part_conj, psd_part_moreau, psd_partZ, spec_conj_diag
- GaussianAnalysis.matrix.condition_cone: cond_clip, cond_clip_cone, cond_clip_energy
forall [R : realType] [n : nat] (A : 'M_n), sym_spectralmx A \is orthogonalmx
Statement as written in the source
Lemma sym_spectralmx_orthogonal n (A : 'M[R]_n) : sym_spectralmx A \is orthogonalmx.
Used by 14 declarations in 5 files
- GaussianAnalysis.matrix.whitening: sym_spectral_diag_ge, whitening_mxP, frobenius_whitening_mx
- GaussianAnalysis.matrix.psd_splitting: spectral_nonneg_proj
- GaussianAnalysis.matrix.von_neumann: spec_decomposition
- GaussianAnalysis.matrix.psd_part: psd_partE, psd_part_psd, psd_part_nearest, psd_part_conj, psd_part_moreau, psd_partZ, spec_conj_diag
- GaussianAnalysis.matrix.condition_cone: cond_clip_cone, cond_clip_energy
forall [R : realType] [n : nat] [A : 'M_n], A \is symmetricmx -> A = (sym_spectralmx A)^T *m diag_mx (sym_spectral_diag A) *m sym_spectralmx A
Statement as written in the source
Lemma sym_spectralE n (A : 'M[R]_n) : A \is symmetricmx -> A = (sym_spectralmx A)^T *m diag_mx (sym_spectral_diag A) *m sym_spectralmx A.
Used by 11 declarations in 5 files
- GaussianAnalysis.matrix.whitening: sym_spectral_diag_ge, whitening_mxP
- GaussianAnalysis.matrix.psd_splitting: spectral_nonneg_proj
- GaussianAnalysis.matrix.von_neumann: spec_decomposition
- GaussianAnalysis.matrix.psd_part: psd_partE, psd_part_nearest, psd_part_conj, psd_part_moreau, psd_partZ, spec_conj_diag
- GaussianAnalysis.matrix.condition_cone: cond_clip_energy