Documentation

LeanPool.SNumbers.BasicResults.SVD

Singular value decomposition of a Hilbert-space operator #

A non-negative real Οƒ is a singular value of S : H₁ β†’L[π•œ] Hβ‚‚ if there is a singular vector pair (u, v): unit vectors u ∈ H₁, v ∈ Hβ‚‚ with S u = Οƒ β€’ v and S* v = Οƒ β€’ u.

This file develops the SVD of a compact operator via the singular-value iteration (peeling off the top singular pair given by norm_isSingularValue), and the scalar factorisation for general operators.

Main results #

Orthonormal-or-zero families #

The SVD below is indexed by β„•, but a genuinely β„•-indexed Orthonormal family cannot exist in a finite-dimensional space. We therefore index the SVD by the finite-dimension-compatible relaxation OrthonormalOrZero: each vector is a unit vector or zero, and distinct vectors are orthogonal. In a finite-dimensional space all but finitely many vectors are zero (those with singular value 0), so the family genuinely exists; Orthonormal is the special case with no zeros.

def SVD.OrthonormalOrZero (π•œ : Type u_1) [RCLike π•œ] {H : Type u_2} [NormedAddCommGroup H] [InnerProductSpace π•œ H] {ΞΉ : Type u_3} (u : ΞΉ β†’ H) :

OrthonormalOrZero π•œ u: each u i is a unit vector or zero, and distinct vectors are orthogonal.

Equations
Instances For
    theorem Orthonormal.orthonormalOrZero {π•œ : Type u} [RCLike π•œ] {H : Type u_1} [NormedAddCommGroup H] [InnerProductSpace π•œ H] {ΞΉ : Type u_2} {u : ΞΉ β†’ H} (hu : Orthonormal π•œ u) :

    Orthonormal families are OrthonormalOrZero.

    theorem SVD.OrthonormalOrZero.inner_eq {π•œ : Type u} [RCLike π•œ] {H : Type u_1} [NormedAddCommGroup H] [InnerProductSpace π•œ H] {ΞΉ : Type u_2} [DecidableEq ΞΉ] {u : ΞΉ β†’ H} (h : OrthonormalOrZero π•œ u) (i j : ΞΉ) :
    inner π•œ (u i) (u j) = if i = j then ↑‖u iβ€– ^ 2 else 0

    Inner products of an orthonormal-or-zero family: βŸͺuα΅’, uⱼ⟫ = Ξ΄α΅’β±Ό β€–uα΅’β€–Β² (with β€–uα΅’β€–Β² ∈ {0, 1}).

    theorem SVD.OrthonormalOrZero.orthonormal_comp {π•œ : Type u} [RCLike π•œ] {H : Type u_1} [NormedAddCommGroup H] [InnerProductSpace π•œ H] {ΞΉ : Type u_2} {ΞΊ : Type u_3} {u : ΞΉ β†’ H} (h : OrthonormalOrZero π•œ u) {g : ΞΊ β†’ ΞΉ} (hg : Function.Injective g) (hn : βˆ€ (k : ΞΊ), β€–u (g k)β€– = 1) :
    Orthonormal π•œ fun (k : ΞΊ) => u (g k)

    Restricting away the zeros. An OrthonormalOrZero family, reindexed along an injective map that only hits unit vectors, is Orthonormal. This is how a finite subfamily of an SVD family β€” the indices with non-zero singular value β€” is recognised as an orthonormal basis of its span.

    theorem SVD.OrthonormalOrZero.norm_sum_smul_sq {π•œ : Type u} [RCLike π•œ] {H : Type u_1} [NormedAddCommGroup H] [InnerProductSpace π•œ H] {ΞΉ : Type u_2} {u : ΞΉ β†’ H} (h : OrthonormalOrZero π•œ u) (c : ΞΉ β†’ π•œ) (s : Finset ΞΉ) :
    β€–βˆ‘ k ∈ s, c k β€’ u kβ€– ^ 2 = βˆ‘ k ∈ s, β€–c kβ€– ^ 2 * β€–u kβ€– ^ 2

    Finite Pythagoras for an orthonormal-or-zero family: β€–βˆ‘ cβ‚– β€’ uβ‚–β€–Β² = βˆ‘ β€–cβ‚–β€–Β² β€–uβ‚–β€–Β² (zero vectors drop out).

    theorem SVD.OrthonormalOrZero.smul_inner_eq {π•œ : Type u} [RCLike π•œ] {H : Type u_1} [NormedAddCommGroup H] [InnerProductSpace π•œ H] {u : β„• β†’ H} (h : OrthonormalOrZero π•œ u) {Οƒ : β„• β†’ ℝ} (htie : βˆ€ (k : β„•), Οƒ k β‰  0 β†’ u k β‰  0) (j k : β„•) :
    ↑(Οƒ j) * inner π•œ (u j) (u k) = if j = k then ↑(Οƒ k) else 0

    The Οƒ-weighted inner product of an orthonormal-or-zero family collapses to a Kronecker delta: Οƒβ±ΌΒ·βŸͺuβ±Ό, uβ‚–βŸ« = Ξ΄β±Όβ‚–Β·Οƒβ‚–, given the tie uβ‚– = 0 ↔ Οƒβ‚– = 0 (so that a zero vector carries a zero weight, and a nonzero one is unit).

    theorem SVD.OrthonormalOrZero.norm_sum_smul_sq_of_support {π•œ : Type u} [RCLike π•œ] {H : Type u_1} [NormedAddCommGroup H] [InnerProductSpace π•œ H] {ΞΉ : Type u_2} {u : ΞΉ β†’ H} (h : OrthonormalOrZero π•œ u) (c : ΞΉ β†’ π•œ) (s : Finset ΞΉ) (hc : βˆ€ k ∈ s, u k = 0 β†’ c k = 0) :
    β€–βˆ‘ k ∈ s, c k β€’ u kβ€– ^ 2 = βˆ‘ k ∈ s, β€–c kβ€– ^ 2

    Finite Pythagoras, weighted form: if the coefficient vanishes wherever the vector does (uβ‚– = 0 β†’ cβ‚– = 0), the zero vectors drop and we recover the clean β€–βˆ‘ cβ‚– β€’ uβ‚–β€–Β² = βˆ‘ β€–cβ‚–β€–Β².

    theorem SVD.OrthonormalOrZero.comp {π•œ : Type u} [RCLike π•œ] {H : Type u_1} [NormedAddCommGroup H] [InnerProductSpace π•œ H] {ΞΉ : Type u_2} {ΞΊ : Type u_3} {u : ΞΉ β†’ H} (h : OrthonormalOrZero π•œ u) {f : ΞΊ β†’ ΞΉ} (hf : Function.Injective f) :
    OrthonormalOrZero π•œ (u ∘ f)

    Reindexing an orthonormal-or-zero family by an injection stays orthonormal-or-zero.

    theorem SVD.OrthonormalOrZero.sum_inner_products_le {π•œ : Type u} [RCLike π•œ] {H : Type u_1} [NormedAddCommGroup H] [InnerProductSpace π•œ H] {ΞΉ : Type u_2} {u : ΞΉ β†’ H} (h : OrthonormalOrZero π•œ u) (x : H) (s : Finset ΞΉ) :
    βˆ‘ k ∈ s, β€–inner π•œ (u k) xβ€– ^ 2 ≀ β€–xβ€– ^ 2

    Bessel's inequality for an orthonormal-or-zero family: βˆ‘ β€–βŸͺuβ‚–, xβŸ«β€–Β² ≀ β€–xβ€–Β². Proof via the partial projection p := βˆ‘ βŸͺuβ‚–,x⟫·uβ‚–: β€–pβ€–Β² = βˆ‘β€–βŸͺuβ‚–,xβŸ«β€–Β² = reβŸͺp, x⟫ ≀ β€–pβ€–Β·β€–xβ€–, hence β€–pβ€– ≀ β€–xβ€–.

    def SVD.IsSingularValue {π•œ : Type u} [RCLike π•œ] {H₁ Hβ‚‚ : Type u} [NormedAddCommGroup H₁] [InnerProductSpace π•œ H₁] [CompleteSpace H₁] [NormedAddCommGroup Hβ‚‚] [InnerProductSpace π•œ Hβ‚‚] [CompleteSpace Hβ‚‚] (S : H₁ β†’L[π•œ] Hβ‚‚) (Οƒ : ℝ) :

    A non-negative real Οƒ is a singular value of S if there exist unit vectors u ∈ H₁, v ∈ Hβ‚‚ with S u = Οƒ β€’ v and S* v = Οƒ β€’ u.

    Equations
    Instances For
      theorem SVD.IsCompactOperator.norm_isSingularValue {π•œ : Type u} [RCLike π•œ] {H₁ Hβ‚‚ : Type u} [NormedAddCommGroup H₁] [InnerProductSpace π•œ H₁] [CompleteSpace H₁] [NormedAddCommGroup Hβ‚‚] [InnerProductSpace π•œ Hβ‚‚] [CompleteSpace Hβ‚‚] [Nontrivial H₁] [Nontrivial Hβ‚‚] {S : H₁ β†’L[π•œ] Hβ‚‚} (hS : IsCompactOperator ⇑S) :

      Every compact operator between Hilbert spaces attains its norm as a singular value: there exist unit vectors u, v with S u = β€–Sβ€– β€’ v and S* v = β€–Sβ€– β€’ u.

      Proof sketch: take a maximising sequence xβ‚™ (unit, β€–S xβ‚™β€– β†’ β€–Sβ€–), extract a strongly convergent subsequence S xβ‚™β‚– β†’ y by compactness, let v := β€–S‖⁻¹ β€’ y and u' := S* v. Cauchy–Schwarz on ⟨u', xβ‚™β‚–βŸ© = ⟨v, S xβ‚™β‚–βŸ© β†’ β€–Sβ€– shows β€–u'β€– = β€–Sβ€–; equality in C–S forces xβ‚™β‚– β†’ β€–S‖⁻¹ β€’ u' =: u, so by continuity S u = y = β€–Sβ€– β€’ v.

      The Schmidt iteration #

      svdState S hS n carries the n-th deflated operator Sβ‚™ together with a proof it is still compact (Sβ‚€ = S; Sβ‚™β‚Šβ‚ = Sβ‚™ - βŸͺuβ‚™, ·⟫ (Οƒβ‚™ β€’ vβ‚™), where (uβ‚™, vβ‚™) attain Οƒβ‚™ = β€–Sβ‚™β€– as a singular value, norm_isSingularValue). The projections svdT/svdU/svdV read off Sβ‚™, uβ‚™, vβ‚™.

      Step properties of the iteration #

      Orthogonality (the variational step) #

      Telescoping and the full-operator relations #

      Orthogonality of the right singular vectors (the adjoint side) #

      The singular values tend to zero #

      theorem SVD.IsCompactOperator.schmidtRepresentation {π•œ : Type u} [RCLike π•œ] {H₁ Hβ‚‚ : Type u} [NormedAddCommGroup H₁] [InnerProductSpace π•œ H₁] [CompleteSpace H₁] [NormedAddCommGroup Hβ‚‚] [InnerProductSpace π•œ Hβ‚‚] [CompleteSpace Hβ‚‚] {S : H₁ β†’L[π•œ] Hβ‚‚} (hS : IsCompactOperator ⇑S) :
      βˆƒ (Οƒ : β„• β†’ ℝ) (u : β„• β†’ H₁) (v : β„• β†’ Hβ‚‚), (βˆ€ (k : β„•), 0 ≀ Οƒ k) ∧ Antitone Οƒ ∧ OrthonormalOrZero π•œ u ∧ OrthonormalOrZero π•œ v ∧ (βˆ€ (k : β„•), Οƒ k β‰  0 β†’ u k β‰  0) ∧ (βˆ€ (k : β„•), Οƒ k β‰  0 β†’ v k β‰  0) ∧ Filter.Tendsto Οƒ Filter.atTop (nhds 0) ∧ βˆ€ (x : H₁), HasSum (fun (k : β„•) => (↑(Οƒ k) * inner π•œ (u k) x) β€’ v k) (S x)

      Singular value decomposition / Schmidt representation. Every compact operator between Hilbert spaces has a Schmidt expansion

      S x = Ξ£ Οƒβ‚– ⟨uβ‚–, x⟩ vβ‚–,

      with orthonormal sequences (uβ‚–) βŠ† H₁, (vβ‚–) βŠ† Hβ‚‚ and singular values Οƒβ‚€ β‰₯ σ₁ β‰₯ β‹― β†’ 0.

      Proof outline (by iterating norm_isSingularValue):

      1. Iteration. Set Sβ‚€ := S. Given Sβ‚™ (compact), apply IsCompactOperator.norm_isSingularValue to obtain unit vectors uβ‚™, vβ‚™ with Sβ‚™ uβ‚™ = β€–Sβ‚™β€– β€’ vβ‚™ and Sβ‚™* vβ‚™ = β€–Sβ‚™β€– β€’ uβ‚™. Set Οƒβ‚™ := β€–Sβ‚™β€– and Sβ‚™β‚Šβ‚ := Sβ‚™ - Οƒβ‚™ β€’ rankOne π•œ vβ‚™ uβ‚™. The rank-one subtrahend is compact (its image is finite-dimensional), and IsCompactOperator is closed under subtraction (IsCompactOperator.sub), so the recursion stays inside the compact-operator class.

      2. Orthogonality. By construction Sβ‚™β‚Šβ‚ uβ‚™ = 0, so by induction Sβ‚˜ uβ‚™ = 0 for all m > n. The variational characterisation of uβ‚˜ (the maximiser of β€–Sβ‚˜ xβ€– on the unit sphere) then forces uβ‚˜ βŠ₯ uβ‚™: writing uβ‚˜ = Ξ± uβ‚™ + w with w βŠ₯ uβ‚™ and using β€–Sβ‚˜ uβ‚˜β€–Β² = β€–Sβ‚˜ wβ€–Β² ≀ β€–Sβ‚˜β€–Β² (1 - |Ξ±|Β²) = Οƒβ‚˜Β² (1 - |Ξ±|Β²) together with β€–Sβ‚˜ uβ‚˜β€– = Οƒβ‚˜ gives Ξ± = 0 (assuming Οƒβ‚˜ > 0). Symmetrically, vβ‚˜ βŠ₯ vβ‚™ (using Sβ‚™β‚Šβ‚* vβ‚™ = 0).

      3. Οƒβ‚™ β†’ 0. Since S uβ‚™ = Οƒβ‚™ vβ‚™ (using uβ‚™ βŠ₯ uβ‚˜ for m < n) and the vβ‚™ are orthonormal, β€–S uβ‚™ - S uβ‚˜β€–Β² = Οƒβ‚™Β² + Οƒβ‚˜Β². If Οƒβ‚™ stayed β‰₯ Ξ΅ > 0, the bounded sequence (uβ‚™) would map under S to a sequence with no Cauchy subsequence, contradicting compactness of S.

      4. Convergence. β€–S - Ξ£β‚–<n Οƒβ‚– β€’ rankOne π•œ vβ‚– uβ‚–β€– = β€–Sβ‚™β€– = Οƒβ‚™ β†’ 0, so the Schmidt partial sums converge to S in operator norm; the pointwise HasSum follows.

      Eckart–Young: singular values are the approximation numbers #

      The truncation Sβ‚™ := Ξ£_{k < n} Οƒβ‚– ⟨uβ‚–, ·⟩ vβ‚– is the best rank-n approximation, with residual β€–S - Sβ‚™β€– = Οƒβ‚™. Since the truncation has rank ≀ n, this is β‰₯ aβ‚™(S), and minimality gives equality: the k-th singular value equals the k-th approximation number, Οƒβ‚– = aβ‚–(S).

      theorem SVD.svd_apply_left {π•œ : Type u} [RCLike π•œ] {H₁ Hβ‚‚ : Type u} [NormedAddCommGroup H₁] [InnerProductSpace π•œ H₁] [NormedAddCommGroup Hβ‚‚] [InnerProductSpace π•œ Hβ‚‚] {S : H₁ β†’L[π•œ] Hβ‚‚} {Οƒ : β„• β†’ ℝ} {u : β„• β†’ H₁} {v : β„• β†’ Hβ‚‚} (hu : OrthonormalOrZero π•œ u) (htie : βˆ€ (k : β„•), Οƒ k β‰  0 β†’ u k β‰  0) (hsum : βˆ€ (x : H₁), HasSum (fun (k : β„•) => (↑(Οƒ k) * inner π•œ (u k) x) β€’ v k) (S x)) (k : β„•) :
      S (u k) = ↑(Οƒ k) β€’ v k

      From the SVD data, S uβ‚– = Οƒβ‚– vβ‚– (collapse the HasSum at uβ‚–).

      The truncated SVD #

      Both halves of Eckart–Young below use the truncation Lβ‚˜ = βˆ‘_{k<m} Οƒβ‚– βŸͺuβ‚–, ·⟫ vβ‚–, and need exactly two facts about it: its rank is at most m, and the residual S βˆ’ Lβ‚˜ has norm at most Οƒβ‚˜. Those are recorded once here.

      theorem SVD.svd_sigma_eq_approx {π•œ : Type u} [RCLike π•œ] {H₁ Hβ‚‚ : Type u} [NormedAddCommGroup H₁] [InnerProductSpace π•œ H₁] [NormedAddCommGroup Hβ‚‚] [InnerProductSpace π•œ Hβ‚‚] {S : H₁ β†’L[π•œ] Hβ‚‚} {Οƒ : β„• β†’ ℝ} {u : β„• β†’ H₁} {v : β„• β†’ Hβ‚‚} (hΟƒ0 : βˆ€ (k : β„•), 0 ≀ Οƒ k) (hΟƒanti : Antitone Οƒ) (hu : OrthonormalOrZero π•œ u) (hv : OrthonormalOrZero π•œ v) (hut : βˆ€ (k : β„•), Οƒ k β‰  0 β†’ u k β‰  0) (hvt : βˆ€ (k : β„•), Οƒ k β‰  0 β†’ v k β‰  0) (hsum : βˆ€ (x : H₁), HasSum (fun (k : β„•) => (↑(Οƒ k) * inner π•œ (u k) x) β€’ v k) (S x)) (m : β„•) :

      Eckart–Young. From any SVD of S (OrthonormalOrZero singular vectors with the nonzero-Οƒ tie, and the HasSum Schmidt expansion), the m-th singular value equals the m-th approximation number: Οƒ m = aβ‚˜(S).

      theorem SVD.IsCompactOperator.truncation_residual_eq_approxNumber {π•œ : Type u} [RCLike π•œ] {H₁ Hβ‚‚ : Type u} [NormedAddCommGroup H₁] [InnerProductSpace π•œ H₁] [CompleteSpace H₁] [NormedAddCommGroup Hβ‚‚] [InnerProductSpace π•œ Hβ‚‚] [CompleteSpace Hβ‚‚] {S : H₁ β†’L[π•œ] Hβ‚‚} (hS : IsCompactOperator ⇑S) (n : β„•) :
      βˆƒ (L : H₁ β†’L[π•œ] Hβ‚‚), L.rank ≀ ↑n ∧ β€–S - Lβ€– = SNumbers.approximationNumber S n

      Eckart–Young. Some rank-n operator L attains the approximation number: β€–S - Lβ€– = aβ‚™(S) (the truncated SVD). In particular the infimum defining aβ‚™(S) is attained on Hilbert spaces.

      Diagonal factorisation through ℓ₂ⁿ⁺¹ #

      B ∘ S ∘ A = diag(aβ‚€, …, aβ‚™), with A : ℓ₂ⁿ⁺¹ β†’ H₁ the isometric inclusion eβ‚– ↦ uβ‚– and B : Hβ‚‚ β†’ ℓ₂ⁿ⁺¹ the contraction y ↦ Ξ£_{k ≀ n} ⟨vβ‚–, y⟩ eβ‚–.

      This uses only the top n+1 singular pairs (uβ‚–, vβ‚–, Οƒβ‚–)_{k ≀ n} β€” a finite slice of the SVD obtained by n+1 iterations of norm_isSingularValue. It needs neither Οƒβ‚– β†’ 0 nor the HasSum convergence of the full SVD.

      theorem SVD.IsCompactOperator.diagonalFactorisation {π•œ : Type u} [RCLike π•œ] {H₁ Hβ‚‚ : Type u} [NormedAddCommGroup H₁] [InnerProductSpace π•œ H₁] [CompleteSpace H₁] [NormedAddCommGroup Hβ‚‚] [InnerProductSpace π•œ Hβ‚‚] [CompleteSpace Hβ‚‚] {S : H₁ β†’L[π•œ] Hβ‚‚} (hS : IsCompactOperator ⇑S) (n : β„•) :
      βˆƒ (A : EuclideanSpace π•œ (Fin (n + 1)) β†’L[π•œ] H₁) (B : Hβ‚‚ β†’L[π•œ] EuclideanSpace π•œ (Fin (n + 1))), β€–Aβ€– ≀ 1 ∧ β€–Bβ€– ≀ 1 ∧ βˆ€ (k : Fin (n + 1)), B (S (A (EuclideanSpace.single k 1))) = ↑(SNumbers.approximationNumber S ↑k) β€’ EuclideanSpace.single k 1

      Diagonal factorisation through ℓ₂ⁿ⁺¹. There is an isometric inclusion A : ℓ₂ⁿ⁺¹ β†’L[π•œ] H₁ with β€–Aβ€– ≀ 1 and a contraction B : Hβ‚‚ β†’L[π•œ] ℓ₂ⁿ⁺¹ with β€–Bβ€– ≀ 1 such that on each basis vector,

      (B ∘ S ∘ A)(eβ‚–) = aβ‚–(S) Β· eβ‚–,
      

      i.e. B ∘ S ∘ A = diag(aβ‚€(S), …, aβ‚™(S)). Built from the top n+1 singular pairs only.

      Scalar factorisation (general operators) #

      Whereas diagonalFactorisation pins the exact values aβ‚– (so needs S compact, see its note), the scalar factorisation asks only for B ∘ S ∘ A = c β€’ id with c < aβ‚™(S) strict. It therefore holds for an arbitrary bounded S: for c < aβ‚™(S) there is an (n+1)-dimensional subspace M βŠ† H₁ on which β€–S xβ€– β‰₯ c β€–xβ€– (the variational characterisation of aβ‚™, valid even when aβ‚™(S) is not attained β€” e.g. continuous spectrum); take A to embed ℓ₂ⁿ⁺¹ isometrically onto M, and B to be c times a left inverse of the bounded-below S|_M.

      This is the single input the uniqueness theorem for s-numbers (SNumbers.Uniqueness) consumes: chaining (S3) over B ∘ S ∘ A = c β€’ id with the (S5) normalisation sβ‚™(id) = 1 gives c ≀ sβ‚™(S) for every c < aβ‚™(S), hence aβ‚™(S) ≀ sβ‚™(S).

      theorem SVD.exists_scalar_factorisation {π•œ : Type u} [RCLike π•œ] {H₁ Hβ‚‚ : Type u} [NormedAddCommGroup H₁] [InnerProductSpace π•œ H₁] [CompleteSpace H₁] [NormedAddCommGroup Hβ‚‚] [InnerProductSpace π•œ Hβ‚‚] [CompleteSpace Hβ‚‚] (S : H₁ β†’L[π•œ] Hβ‚‚) (n : β„•) {c : ℝ} (hc0 : 0 ≀ c) (hc : c < SNumbers.approximationNumber S n) :
      βˆƒ (A : EuclideanSpace π•œ (Fin (n + 1)) β†’L[π•œ] H₁) (B : Hβ‚‚ β†’L[π•œ] EuclideanSpace π•œ (Fin (n + 1))), β€–Aβ€– ≀ 1 ∧ β€–Bβ€– ≀ 1 ∧ B ∘SL S ∘SL A = ↑c β€’ ContinuousLinearMap.id π•œ (EuclideanSpace π•œ (Fin (n + 1)))

      Scalar factorisation. For any bounded S : H₁ β†’L[π•œ] Hβ‚‚ between Hilbert spaces and any real c with 0 ≀ c < aβ‚™(S), there are contractions A : ℓ₂ⁿ⁺¹ β†’L[π•œ] H₁, B : Hβ‚‚ β†’L[π•œ] ℓ₂ⁿ⁺¹ with

      B ∘ S ∘ A = c β€’ id_{ℓ₂ⁿ⁺¹}.
      

      Proved from SpectralRepresentation.exists_lowerBound_subspace: take an orthonormal basis of the lower-bound subspace M for A, set T := S ∘ A (bounded below by c), and B := c · (T*T)⁻¹ ∘ T* (well-defined since T*T is a unit, via isUnit_of_forall_le_norm_inner_map). No compactness needed.

      The leading singular values of a product of Hilbert–Schmidt operators #

      For a compact operator T = Tβ‚‚T₁, the sum of the first n+1 singular values is bounded by the product of the Hilbert–Schmidt norms of the two factors,

        (n+1) Β· aβ‚™(T) ≀ βˆ‘_{k ≀ n} Οƒβ‚–(T) ≀ β€–T₁‖_HS Β· β€–Tβ‚‚β€–_HS ,
      

      the qualitative content of "the nuclear norm is at most the product of the Hilbert–Schmidt norms of the factors" (Pietsch, Eigenvalues and s-numbers, 2.11.23). No Schatten-class theory is needed: the singular values are read off the Schmidt decomposition above, where Οƒβ‚– = aβ‚–(T) by Eckart–Young (svd_sigma_eq_approx), and the estimate comes from

        Οƒβ‚– = re βŸͺvβ‚–, T uβ‚–βŸ« = re βŸͺTβ‚‚* vβ‚–, T₁ uβ‚–βŸ« ≀ β€–Tβ‚‚* vβ‚–β€– Β· β€–T₁ uβ‚–β€–
      

      by Cauchy–Schwarz over k ≀ n. The Hilbert–Schmidt property of the factors therefore enters only through the two hypotheses

        βˆ‘β‚– β€–T₁ uβ‚–β€–Β² ≀ aΒ² and βˆ‘β‚– β€–Tβ‚‚* vβ‚–β€–Β² ≀ bΒ²
      

      along arbitrary orthonormal-or-zero families. Those two hypotheses are in turn produced from row data by sum_norm_sq_apply_le_of_rows below, whose input is what BasicResults.LittleGrothendieck supplies for the inclusion ℓ₁ β†’ β„“_∞ in SNumbers.Examples.IdentityL1Linfty.

      theorem SVD.sum_norm_sq_apply_le_of_rows {π•œ : Type u} [RCLike π•œ] {H₁ Hβ‚‚ : Type u} [NormedAddCommGroup H₁] [InnerProductSpace π•œ H₁] [NormedAddCommGroup Hβ‚‚] [InnerProductSpace π•œ Hβ‚‚] {S : H₁ β†’L[π•œ] Hβ‚‚} {w : β„• β†’ H₁} {c : ℝ} (hS : βˆ€ (x : H₁), β€–S xβ€– ^ 2 = βˆ‘' (j : β„•), β€–inner π•œ (w j) xβ€– ^ 2) (hc : βˆ€ (J : Finset β„•), βˆ‘ j ∈ J, β€–w jβ€– ^ 2 ≀ c) {u : β„• β†’ H₁} (hu : OrthonormalOrZero π•œ u) (s : Finset β„•) :
      βˆ‘ k ∈ s, β€–S (u k)β€– ^ 2 ≀ c

      Bessel plus a row bound. Suppose the operator S is described by a family w of "rows", in the sense that β€–S xβ€–Β² = βˆ‘β±Ό |βŸͺwβ±Ό, x⟫|Β², and that the partial sums of β€–wβ±Όβ€–Β² are bounded by c. Then βˆ‘β‚– β€–S uβ‚–β€–Β² ≀ c along every orthonormal-or-zero family u.

      This is the Hilbert–Schmidt estimate that mul_approximationNumber_le_of_factorization needs for each of its two factors: interchange the two summations (hasSum_sum), apply Bessel's inequality (OrthonormalOrZero.sum_inner_products_le) for each fixed row, and finish with the row bound.

      theorem SVD.svd_sigma_le_mul_of_factorization {π•œ : Type u} [RCLike π•œ] {H₁ Hβ‚‚ : Type u} [NormedAddCommGroup H₁] [InnerProductSpace π•œ H₁] [NormedAddCommGroup Hβ‚‚] [InnerProductSpace π•œ Hβ‚‚] [CompleteSpace Hβ‚‚] {H₃ : Type u} [NormedAddCommGroup H₃] [InnerProductSpace π•œ H₃] [CompleteSpace H₃] {T : H₁ β†’L[π•œ] H₃} {T₁ : H₁ β†’L[π•œ] Hβ‚‚} {Tβ‚‚ : Hβ‚‚ β†’L[π•œ] H₃} (hfact : T = Tβ‚‚ ∘SL T₁) {Οƒ : β„• β†’ ℝ} {u : β„• β†’ H₁} {v : β„• β†’ H₃} (hu : OrthonormalOrZero π•œ u) (hv : OrthonormalOrZero π•œ v) (hut : βˆ€ (k : β„•), Οƒ k β‰  0 β†’ u k β‰  0) (hvt : βˆ€ (k : β„•), Οƒ k β‰  0 β†’ v k β‰  0) (hsum : βˆ€ (x : H₁), HasSum (fun (k : β„•) => (↑(Οƒ k) * inner π•œ (u k) x) β€’ v k) (T x)) (k : β„•) :

      A single singular value of a factored operator is bounded by the norms of the two factors evaluated at the corresponding singular vectors: Οƒβ‚– ≀ β€–Tβ‚‚* vβ‚–β€– Β· β€–T₁ uβ‚–β€–. Indeed T uβ‚– = Οƒβ‚– vβ‚– with β€–vβ‚–β€– = 1 (or Οƒβ‚– = 0), so Οƒβ‚– = re βŸͺvβ‚–, T uβ‚–βŸ« = re βŸͺTβ‚‚* vβ‚–, T₁ uβ‚–βŸ«.

      theorem SVD.mul_approximationNumber_le_of_factorization {π•œ : Type u} [RCLike π•œ] {H₁ Hβ‚‚ : Type u} [NormedAddCommGroup H₁] [InnerProductSpace π•œ H₁] [CompleteSpace H₁] [NormedAddCommGroup Hβ‚‚] [InnerProductSpace π•œ Hβ‚‚] [CompleteSpace Hβ‚‚] {H₃ : Type u} [NormedAddCommGroup H₃] [InnerProductSpace π•œ H₃] [CompleteSpace H₃] {T : H₁ β†’L[π•œ] H₃} (hT : IsCompactOperator ⇑T) {T₁ : H₁ β†’L[π•œ] Hβ‚‚} {Tβ‚‚ : Hβ‚‚ β†’L[π•œ] H₃} (hfact : T = Tβ‚‚ ∘SL T₁) {a b : ℝ} (ha : βˆ€ (u : β„• β†’ H₁), OrthonormalOrZero π•œ u β†’ βˆ€ (s : Finset β„•), βˆ‘ k ∈ s, β€–T₁ (u k)β€– ^ 2 ≀ a ^ 2) (hb : βˆ€ (v : β„• β†’ H₃), OrthonormalOrZero π•œ v β†’ βˆ€ (s : Finset β„•), βˆ‘ k ∈ s, β€–(ContinuousLinearMap.adjoint Tβ‚‚) (v k)β€– ^ 2 ≀ b ^ 2) (ha0 : 0 ≀ a) (hb0 : 0 ≀ b) (n : β„•) :

      (n+1)Β·aβ‚™(T) ≀ β€–T₁‖_HSΒ·β€–Tβ‚‚β€–_HS for a factored compact operator.

      Let T = Tβ‚‚T₁ be compact, and suppose that along every orthonormal-or-zero family the two factors satisfy the Hilbert–Schmidt bounds βˆ‘β‚– β€–T₁ uβ‚–β€–Β² ≀ aΒ² and βˆ‘β‚– β€–Tβ‚‚* vβ‚–β€–Β² ≀ bΒ². Then (n+1)Β·aβ‚™(T) ≀ βˆ‘_{k≀n} Οƒβ‚–(T) ≀ bΒ·a for every n.

      The first inequality is antitonicity of the singular values, the second is svd_sigma_le_mul_of_factorization followed by Cauchy–Schwarz and the two hypotheses.