On this page
The upper edge of the Gaussian orthogonal ensemble
Imports 13 library modules and 26 external
- GaussianAnalysis.gaussian.measurable_matrix
- GaussianAnalysis.gaussian.gauss
- GaussianAnalysis.matrix.euclidean
- GaussianAnalysis.matrix.opnorm
- GaussianAnalysis.matrix.real_spectral
- GaussianAnalysis.matrix.nets
- GaussianAnalysis.matrix.lambda_max
- GaussianAnalysis.comparison.gauss_smoothing
- GaussianAnalysis.comparison.gauss_concentration
- GaussianAnalysis.comparison.slepian
- GaussianAnalysis.comparison.gordon
- GaussianAnalysis.comparison.escape
- GaussianAnalysis.random_matrix.goe
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.classical.functions, mathcomp.algebra.interval, mathcomp.reals.reals, mathcomp.analysis.ereal, mathcomp.analysis.topology_theory.topology, mathcomp.analysis.normedtype_theory.normedtype, mathcomp.analysis.sequences, mathcomp.analysis.derive, mathcomp.analysis.exp, mathcomp.analysis.measure_theory.measure, mathcomp.analysis.lebesgue_measure, mathcomp.analysis.lebesgue_integral_theory.lebesgue_integral, mathcomp.analysis.numfun, mathcomp.analysis.measurable_realfun, mathcomp.analysis.probability_theory.probability, mathcomp.algebra.arithmetic_tactic, mathcomp.algebra.ring_tactic, mathcomp.algebra.field_tactic
Let a have law gauss (d * d) with d >= 1, and let W = goe_mx a be the GOE matrix of random_matrix/goe.v: its entries W_ij, i <= j, are independent and centered, of variance 1 / d off the diagonal and 2 / d on it. Its largest eigenvalue lambda_max W (matrix/lambda_max.v) has mean at most 2 (goe_lambda_max_mean), the right edge of the semicircle law (wigner.v). For every t >= 0, P(lambda_max W >= 2 + t) <= exp (- d t^2 / 4) (goe_lambda_max_tail), and the same holds for - W (goe_lambda_maxN_tail), so P(opnorm W >= 2 + t) <= 2 exp (- d t^2 / 4) (goe_opnorm_edge_tail). The file does not bound E opnorm W by 2: goe.v bounds it by 2 sqrt 2.
The proof compares Gaussian processes. For a unit column x, x^T W x = sqrt (2 / d) <a, mxvec (x x^T)> (goe_mx_form), a linear function of a. For a finite family x_0, ..., x_k of unit columns, the process x_j^T W x_j is the row a *m goe_form_mx xs. Its increments have variance (4 / d) (1 - <x_j, x_l>^2) <= (8 / d) (1 - <x_j, x_l>) (goe_form_incr_var), the increment variance of (2 / sqrt d) <g, x_j> for g of law gauss d, diagonal entries included. The Sudakov-Fernique inequality (sudakov_fernique) and E |g| <= sqrt d (gauss_frobenius_mean) give E max_j x_j^T W x_j <= 2 (goe_form_max_mean). On an eps-net of the unit sphere, lambda_max A <= max_j x_j^T A x_j + 2 eps opnorm A (lambda_max_net_le), and E opnorm W <= 2 sqrt 2 (goe_opnorm_mean), so letting eps tend to 0 bounds the mean. The map a |-> lambda_max W is sqrt (2 / d)-Lipschitz (goe_lambda_max_lipschitz, from frobenius_goe_mx), hence measurable and integrable, and Gaussian concentration with the sharp constant (gauss_concentration_upper_tail) gives the tails. The matrix - W is goe_mx (- a) (goe_mxN), and gauss (d * d) is invariant under a |-> - a (integral_gauss_opp).
This file is a Rocq formalization of the credited argument of 'Cutoff throughout the high-temperature Sherrington-Kirkpatrick phase' (family 227 of the OpenAI math collection, revision 1581d4cbd): the lemma 'Gaussian concentration and comparison' and the first paragraph of the proof of the proposition 'Good disorder', in the appendix 'Uniform spectral and entropy estimates' (appendices/entropy.tex). The Lean modules that follow the same argument, in lean/OAI/Probability/SKRatio of the collection:
Lean: goe_expected_top (Matrices/DiagonalTMemLp.lean, line 93)
Lean: goe_norm_tail (Matrices/GoeMatrixQuadCoeff.lean, line 115)
The manuscript, the Lean modules and this file differ in three ways. The manuscript takes beta W with beta < 1/2; here beta = 1. It compares the suprema over the unit sphere as continuous processes on a compact set; here the comparison is on finite families, and a net passes to the sphere. Its concentration inequality, from the argument of Maurey and Pisier, bounds the moment generating function of F - E F by exp (pi^2 D^2 s^2 / 8) for F D-Lipschitz, which gives exp (- d t^2 / pi^2) for the upper tail of lambda_max W; the Lean modules use the same inequality and bound P(opnorm W > 2 + t) by 2 exp (- d t^2 / pi^2). Here the sharp constant of gauss_concentration gives exp (- d t^2 / 4) and 2 exp (- d t^2 / 4), for the non-strict inequalities.
goe_ | the matrix of the process x_j^T W x_j, W = goe_mx a: (a *m goe_form_mx xs) 0 j = x_j^T W x_j |
goe_ | (2 / sqrt d) times the matrix whose columns are the x_j, the matrix of the process (2 / sqrt d) <g, x_j> |
Main results
| Results | Statement |
|---|---|
For d >= 1, a of law gauss (d * d) and the GOE matrix W = goe_mx a: E lambda_max W <= 2 and E lambda_max (- W) <= 2. For every finite family of unit columns x_j, E max_j x_j^T W x_j <= 2, by the Sudakov-Fernique inequality against (2 / sqrt d) <g, x_j> for g of law gauss d, whose increments have larger variances; a net of the unit sphere passes to lambda_max. A Rocq formalization of the credited argument of family 227 of the OpenAI math collection (see the header). | |
For d >= 1 and t >= 0: P(lambda_max W >= 2 + t) <= exp (- d t^2 / 4), the same for - W, and P(opnorm W >= 2 + t) <= 2 exp (- d t^2 / 4). The maps a |-> lambda_max W and a |-> lambda_max (- W) are sqrt (2 / d)-Lipschitz for every d, hence measurable and integrable, and Gaussian concentration with the sharp constant gives the tails. | |
For a square matrix A of size n > 0 and unit columns x_j such that every unit column lies within eps of some x_j: lambda_max A <= max_j x_j^T A x_j + 2 eps opnorm A. |
Declarations24 exported
Context {R : realType}.
forall {R : realType} [m n : nat] (a : 'rV_(m * n)) (M : 'M_(m, n)), mxdot (vec_mx a) M = mxdot a (mxvec M)
Statement as written in the source
Used by 2 declarations in 1 file
- this file: mxdot_mxvec_mxvec, goe_mx_form
Statement as written in the source
Used by 1 declaration in 1 file
- this file: goe_form_cov
forall {R : realType} [d : nat] (a : 'rV_(d * d)) (x : 'cV_d), mxdot x (goe_mx a *m x) = Num.ExtraDef.sqrtr (2 / d%:R) * mxdot a (mxvec (x *m x^T))
The quadratic form of the GOE matrix at x is a linear function of a.
Statement as written in the source
Used by 1 declaration in 1 file
- this file: goe_form_mxE
Used by 2 declarations in 1 file
- this file: goe_lambda_maxN_lipschitz, goe_lambda_maxN_mean
Context {R : realType} (d : nat). Local Notation gauss := (@gauss R).
forall {R : realType} [d k : nat], ('I_k -> 'cV_d) -> 'M_(d * d, k)Definition goe_form_mx k (xs : 'I_k -> 'cV[R]_d) : 'M[R]_(d * d, k) := \matrix_(p, j) (Num.sqrt (2 / d%:R) * mxvec (xs j *m (xs j)^T) 0 p).
Used by 5 declarations in 1 file
forall {R : realType} [d k : nat] (xs : 'I_k -> 'cV_d) (a : 'rV_(d * d)) (j : 'I_k), (a *m goe_form_mx xs) 0 j = mxdot (xs j) (goe_mx a *m xs j)
Statement as written in the source
Lemma goe_form_mxE k (xs : 'I_k -> 'cV[R]_d) (a : 'rV[R]_(d * d)) j : (a *m goe_form_mx xs) 0 j = mxdot (xs j) (goe_mx a *m xs j).
Used by 1 declaration in 1 file
- this file: goe_lambda_max_mean
forall {R : realType} [d k : nat] (xs : 'I_k -> 'cV_d) (j l : 'I_k), ((goe_form_mx xs)^T *m goe_form_mx xs) j l = 2 / d%:R * mxdot (xs j) (xs l) ^+ 2
Statement as written in the source
Lemma goe_form_cov k (xs : 'I_k -> 'cV[R]_d) j l : ((goe_form_mx xs)^T *m goe_form_mx xs) j l = 2 / d%:R * mxdot (xs j) (xs l) ^+ 2.
Used by 1 declaration in 1 file
- this file: goe_form_incr_var
forall {R : realType} [d k : nat], ('I_k -> 'cV_d) -> 'M_(d, k)Definition goe_lin_mx k (xs : 'I_k -> 'cV[R]_d) : 'M[R]_(d, k) := (2 / Num.sqrt d%:R) *: fam_mx xs.
Used by 3 declarations in 1 file
- this file: goe_lin_cov, goe_form_incr_var, goe_form_max_mean
forall {R : realType} [d k : nat] (xs : 'I_k -> 'cV_d) (j l : 'I_k), ((goe_lin_mx xs)^T *m goe_lin_mx xs) j l = 4 / d%:R * mxdot (xs j) (xs l)
Statement as written in the source
Lemma goe_lin_cov k (xs : 'I_k -> 'cV[R]_d) j l : ((goe_lin_mx xs)^T *m goe_lin_mx xs) j l = 4 / d%:R * mxdot (xs j) (xs l).
Used by 1 declaration in 1 file
- this file: goe_form_incr_var
forall {R : realType} [d k : nat] [xs : 'I_k -> 'cV_d] (j l : 'I_k), (forall j0 : 'I_k, mxdot (xs j0) (xs j0) = 1) -> incr_var (goe_form_mx xs) j l <= incr_var (goe_lin_mx xs) j l
For unit x_j, the increments of x_j^T W x_j have smaller variances than those of (2 / sqrt d) <g, x_j>: (4 / d) (1 - r^2) <= (8 / d) (1 - r).
Statement as written in the source
Lemma goe_form_incr_var k (xs : 'I_k -> 'cV[R]_d) j l : (forall j, mxdot (xs j) (xs j) = 1) -> incr_var (goe_form_mx xs) j l <= incr_var (goe_lin_mx xs) j l.
Used by 1 declaration in 1 file
- this file: goe_form_max_mean
forall {R : realType} [d k : nat] [xs : 'I_k.+1 -> 'cV_d], (0 < d)%N -> (forall j : 'I_k.+1, frobenius (xs j) = 1) -> \int[gauss (d * d)]_a rmax (a *m goe_form_mx xs) <= 2
The largest of the x_j^T W x_j over a finite family of unit columns has mean at most 2.
Stated in the README together with goe_lambda_max_mean.
Statement as written in the source
Lemma goe_form_max_mean k (xs : 'I_k.+1 -> 'cV[R]_d) : (0 < d)%N -> (forall j, frobenius (xs j) = 1) -> \int[gauss (d * d)]_a rmax (a *m goe_form_mx xs) <= 2.
Used by 1 declaration in 1 file
- this file: goe_lambda_max_mean
Context {R : realType}.
forall {R : realType} [n : nat] (A : 'M_n) [k : nat] [xs : 'I_k.+1 -> 'cV_n] [eps : R], (0 < n)%N -> (forall t : 'I_k.+1, frobenius (xs t) = 1) -> (forall y : 'cV_n, frobenius y = 1 -> exists t : 'I_k.+1, frobenius (y - xs t) <= eps) -> lambda_max A <= rmax (\row_t mxdot (xs t) (A *m xs t)) + 2 * eps * opnorm A
On an eps-net of the unit sphere, the largest value of the quadratic form is within 2 eps opnorm A of lambda_max A.
For a square matrix A of size n > 0 and unit columns x_j such that every unit column lies within eps of some x_j: lambda_max A <= max_j x_j^T A x_j + 2 eps opnorm A.
Statement as written in the source
Used by 1 declaration in 1 file
- this file: goe_lambda_max_mean
Context {R : realType} (d : nat). Local Notation gauss := (@gauss R).
forall {R : realType} [d : nat] (a b : 'rV_(d * d)), `|lambda_max (goe_mx a) - lambda_max (goe_mx b)| <= Num.ExtraDef.sqrtr (2 / d%:R) * frobenius (a - b)
Stated in the README together with goe_lambda_max_tail.
Statement as written in the source
Lemma goe_lambda_max_lipschitz (a b : 'rV[R]_(d * d)) : `|lambda_max (goe_mx a) - lambda_max (goe_mx b)| <= Num.sqrt (2 / d%:R) * frobenius (a - b).
Used by 4 declarations in 1 file
forall {R : realType} [d : nat] (a b : 'rV_(d * d)), `|lambda_max (- goe_mx a) - lambda_max (- goe_mx b)| <= Num.ExtraDef.sqrtr (2 / d%:R) * frobenius (a - b)
Stated in the README together with goe_lambda_max_tail.
Statement as written in the source
Lemma goe_lambda_maxN_lipschitz (a b : 'rV[R]_(d * d)) : `|lambda_max (- goe_mx a) - lambda_max (- goe_mx b)| <= Num.sqrt (2 / d%:R) * frobenius (a - b).
Used by 3 declarations in 1 file
forall {R : realType} [d : nat], measurable_fun [set: 'rV_(d * d)] (fun a : 'rV_(d * d) => lambda_max (goe_mx a))
Stated in the README together with goe_lambda_max_tail.
Statement as written in the source
Lemma measurable_goe_lambda_max : measurable_fun [set: 'rV[R]_(d * d)] (fun a => lambda_max (goe_mx a)).
Used by 3 declarations in 2 files
- this file: goe_lambda_max_tail, goe_opnorm_edge_tail
- GaussianApplications.GoeEdgeTheorem: goe_edge_theorem
forall {R : realType} [d : nat], measurable_fun [set: 'rV_(d * d)] (fun a : 'rV_(d * d) => lambda_max (- goe_mx a))
Stated in the README together with goe_lambda_max_tail.
Statement as written in the source
Lemma measurable_goe_lambda_maxN : measurable_fun [set: 'rV[R]_(d * d)] (fun a => lambda_max (- goe_mx a)).
Used by 2 declarations in 1 file
- this file: goe_lambda_maxN_tail, goe_opnorm_edge_tail
forall {R : realType} (d : nat), (gauss (d * d)).-integrable [set: 'rV_(d * d)] (EFin \o (fun a : 'rV_(d * d) => lambda_max (goe_mx a)))
Stated in the README together with goe_lambda_max_tail.
Statement as written in the source
Lemma integrable_goe_lambda_max : (gauss (d * d)).-integrable [set: 'rV[R]_(d * d)] (EFin \o (fun a => lambda_max (goe_mx a))).
Used by 3 declarations in 2 files
- this file: goe_lambda_max_mean, goe_lambda_maxN_mean
- GaussianApplications.GoeEdgeTheorem: goe_edge_theorem
forall {R : realType} (d : nat), (gauss (d * d)).-integrable [set: 'rV_(d * d)] (EFin \o (fun a : 'rV_(d * d) => lambda_max (- goe_mx a)))
Stated in the README together with goe_lambda_max_tail.
Statement as written in the source
Lemma integrable_goe_lambda_maxN : (gauss (d * d)).-integrable [set: 'rV[R]_(d * d)] (EFin \o (fun a => lambda_max (- goe_mx a))).
forall {R : realType} [d : nat], (0 < d)%N -> \int[gauss (d * d)]_a lambda_max (goe_mx a) <= 2
E lambda_max W <= 2.
For d >= 1, a of law gauss (d * d) and the GOE matrix W = goe_mx a: E lambda_max W <= 2 and E lambda_max (- W) <= 2. For every finite family of unit columns x_j, E max_j x_j^T W x_j <= 2, by the Sudakov-Fernique inequality against (2 / sqrt d) <g, x_j> for g of law gauss d, whose increments have larger variances; a net of the unit sphere passes to lambda_max. A Rocq formalization of the credited argument of family 227 of the OpenAI math collection (see the header).
Statement as written in the source
Theorem goe_lambda_max_mean : (0 < d)%N -> \int[gauss (d * d)]_a lambda_max (goe_mx a) <= 2.
Used by 3 declarations in 2 files
- this file: goe_lambda_maxN_mean, goe_lambda_max_tail
- GaussianApplications.GoeEdgeTheorem: goe_edge_theorem
forall {R : realType} [d : nat], (0 < d)%N -> \int[gauss (d * d)]_a lambda_max (- goe_mx a) <= 2
E lambda_max (- W) <= 2: - W = goe_mx (- a) has the law of W.
Stated in the README together with goe_lambda_max_mean.
Statement as written in the source
Theorem goe_lambda_maxN_mean : (0 < d)%N -> \int[gauss (d * d)]_a lambda_max (- goe_mx a) <= 2.
Used by 1 declaration in 1 file
- this file: goe_lambda_maxN_tail
forall {R : realType} [d : nat] (t : R),
(0 < d)%N -> - t ^+ 2 / (2 * Num.ExtraDef.sqrtr (2 / d%:R) ^+ 2) = - (d%:R * t ^+ 2 / 4)Statement as written in the source
Lemma goe_edge_exponent (t : R) : (0 < d)%N -> - t ^+ 2 / (2 * Num.sqrt (2 / d%:R) ^+ 2) = - (d%:R * t ^+ 2 / 4).
Used by 2 declarations in 1 file
- this file: goe_lambda_max_tail, goe_lambda_maxN_tail
forall {R : realType} [d : nat] [t : R], (0 < d)%N -> 0 <= t -> (gauss (d * d) [set a | (2 + t <= lambda_max (goe_mx a))%R] <= (expR (- (d%:R * t ^+ 2 / 4)))%:E)%E
P(lambda_max W >= 2 + t) <= exp (- d t^2 / 4).
For d >= 1 and t >= 0: P(lambda_max W >= 2 + t) <= exp (- d t^2 / 4), the same for - W, and P(opnorm W >= 2 + t) <= 2 exp (- d t^2 / 4). The maps a |-> lambda_max W and a |-> lambda_max (- W) are sqrt (2 / d)-Lipschitz for every d, hence measurable and integrable, and Gaussian concentration with the sharp constant gives the tails.
Statement as written in the source
Theorem goe_lambda_max_tail (t : R) : (0 < d)%N -> 0 <= t -> (gauss (d * d) [set a | 2 + t <= lambda_max (goe_mx a)]%R <= (expR (- (d%:R * t ^+ 2 / 4)))%:E)%E.
Used by 2 declarations in 2 files
- this file: goe_opnorm_edge_tail
- GaussianApplications.GoeEdgeTheorem: goe_edge_theorem
forall {R : realType} [d : nat] [t : R], (0 < d)%N -> 0 <= t -> (gauss (d * d) [set a | (2 + t <= lambda_max (- goe_mx a))%R] <= (expR (- (d%:R * t ^+ 2 / 4)))%:E)%E
P(lambda_max (- W) >= 2 + t) <= exp (- d t^2 / 4).
Stated in the README together with goe_lambda_max_tail.
Statement as written in the source
Theorem goe_lambda_maxN_tail (t : R) : (0 < d)%N -> 0 <= t -> (gauss (d * d) [set a | 2 + t <= lambda_max (- goe_mx a)]%R <= (expR (- (d%:R * t ^+ 2 / 4)))%:E)%E.
Used by 2 declarations in 2 files
- this file: goe_opnorm_edge_tail
- GaussianApplications.GoeEdgeTheorem: goe_edge_theorem
forall {R : realType} [d : nat] [t : R], (0 < d)%N -> 0 <= t -> (gauss (d * d) [set a | (2 + t <= opnorm (goe_mx a))%R] <= (2 * expR (- (d%:R * t ^+ 2 / 4)))%:E)%E
P(opnorm W >= 2 + t) <= 2 exp (- d t^2 / 4).
Stated in the README together with goe_lambda_max_tail.
Statement as written in the source
Used by 2 declarations in 2 files
- GaussianApplications.GoeEdgeTheorem: goe_edge_theorem
- GaussianApplications.SKGap.Disorder: sk_good_disorder_prob