import RNLAPhaseB.B3Base import RNLAPhaseB.Complexity open MeasureTheory open scoped Matrix open scoped Matrix.Norms.L2Operator open scoped BigOperators open scoped ENNReal namespace RNLAPhaseB.MT2020RrfSrtt /-- Unitary DFT, entries n^{-1/2} exp(-2Ο€i jk/n) (complex field only). -/ noncomputable def dftMatrix (π•œ : Type*) [RCLike π•œ] (n : β„•) : Matrix (Fin n) (Fin n) π•œ := Matrix.of fun j k => ((Real.cos (2 * Real.pi * ((j : β„•) : ℝ) * ((k : β„•) : ℝ) / n) : π•œ) - RCLike.I * (Real.sin (2 * Real.pi * ((j : β„•) : ℝ) * ((k : β„•) : ℝ) / n) : π•œ)) / (Real.sqrt n : π•œ) /-- Orthonormal DCT-II. -/ noncomputable def dct2Matrix (π•œ : Type*) [RCLike π•œ] (n : β„•) : Matrix (Fin n) (Fin n) π•œ := Matrix.of fun j k => ((Real.sqrt (2 / n) * (if (j : β„•) = 0 then 1 / Real.sqrt 2 else 1) * Real.cos (Real.pi * (2 * ((k : β„•) : ℝ) + 1) * ((j : β„•) : ℝ) / (2 * n)) : ℝ) : π•œ) /-- Unitary discrete Hartley transform, entries n^{-1/2} cas(2Ο€ jk/n). -/ noncomputable def dhtMatrix (π•œ : Type*) [RCLike π•œ] (n : β„•) : Matrix (Fin n) (Fin n) π•œ := Matrix.of fun j k => (((Real.cos (2 * Real.pi * ((j : β„•) : ℝ) * ((k : β„•) : ℝ) / n) + Real.sin (2 * Real.pi * ((j : β„•) : ℝ) * ((k : β„•) : ℝ) / n)) / Real.sqrt n : ℝ) : π•œ) /-- Unitary Walsh–Hadamard transform for n = 2^p: entries (-1)^{⟨j,k⟩}/√n, with ⟨j,k⟩ the number of common one-bits among the p binary digits. -/ noncomputable def whtMatrix (π•œ : Type*) [RCLike π•œ] (n p : β„•) : Matrix (Fin n) (Fin n) π•œ := Matrix.of fun j k => ((((-1 : ℝ) ^ ((Finset.range p).filter (fun z => ((j : β„•).testBit z && (k : β„•).testBit z) = true)).card) / Real.sqrt n : ℝ) : π•œ) /-- The source's unitary trigonometric transforms F (DFT in the complex case; DCT2, DHT; WHT when n is a power of two). -/ def IsUnitaryTrigTransform {π•œ : Type*} [RCLike π•œ] {n : β„•} (F : Matrix (Fin n) (Fin n) π•œ) : Prop := ((RCLike.I : π•œ) β‰  0 ∧ F = dftMatrix π•œ n) ∨ F = dct2Matrix π•œ n ∨ F = dhtMatrix π•œ n ∨ βˆƒ p : β„•, n = 2 ^ p ∧ F = whtMatrix π•œ n p /-- Random restriction R ∈ F^{β„“Γ—n}: for β„“ ≀ n row i selects coordinate ΞΉ i (ΞΉ a uniformly random injection, see `SRTTLaw`); for β„“ > n, the source's extension R_{ij} = 1 iff i = j. -/ def restrictionMatrix {π•œ : Type*} [RCLike π•œ] {β„“ n : β„•} (ΞΉ : Fin β„“ β†’ Fin n) : Matrix (Fin β„“) (Fin n) π•œ := Matrix.of fun i j => if β„“ ≀ n then (if j = ΞΉ i then 1 else 0) else (if (i : β„•) = (j : β„•) then 1 else 0) /-- Permutation matrix of Οƒ. -/ def permutationMatrix {π•œ : Type*} [RCLike π•œ] {n : β„•} (Οƒ : Equiv.Perm (Fin n)) : Matrix (Fin n) (Fin n) π•œ := Matrix.of fun i j => if Οƒ i = j then 1 else 0 /-- SRTT embedding S = sqrt(n/β„“) R F E Ξ  ∈ F^{β„“Γ—n}. -/ noncomputable def srttEmbedding {π•œ : Type*} [RCLike π•œ] {β„“ n : β„•} (F : Matrix (Fin n) (Fin n) π•œ) (ΞΉ : Fin β„“ β†’ Fin n) (Οƒ : Equiv.Perm (Fin n)) (e : Fin n β†’ π•œ) : Matrix (Fin β„“) (Fin n) π•œ := let R : Matrix (Fin β„“) (Fin n) π•œ := restrictionMatrix (π•œ := π•œ) ΞΉ let RF : Matrix (Fin β„“) (Fin n) π•œ := R * F let RFE : Matrix (Fin β„“) (Fin n) π•œ := RF * Matrix.diagonal e let RFEP : Matrix (Fin β„“) (Fin n) π•œ := RFE * permutationMatrix (π•œ := π•œ) Οƒ (Real.sqrt ((n : ℝ) / β„“) : π•œ) β€’ RFEP /-- SRTT test matrix Ξ© = S^* ∈ F^{nΓ—β„“}. -/ noncomputable def srttTestMatrix {π•œ : Type*} [RCLike π•œ] {β„“ n : β„•} (F : Matrix (Fin n) (Fin n) π•œ) (ΞΉ : Fin β„“ β†’ Fin n) (Οƒ : Equiv.Perm (Fin n)) (e : Fin n β†’ π•œ) : Matrix (Fin n) (Fin β„“) π•œ := (srttEmbedding F ΞΉ Οƒ e)α΄΄ open Classical in /-- Law of the SRTT randomness: E is a random sign flip (iid entries uniform on {z ∈ F : |z| = 1}, expressed as unit modulus plus invariance under every unit multiplier), Ξ  a uniform permutation, the restriction a uniform injection (when β„“ ≀ n), and the three factors independent. -/ structure SRTTLaw {π•œ : Type*} [RCLike π•œ] [MeasurableSpace π•œ] {Ξ© : Type*} [MeasurableSpace Ξ©] {β„“ n : β„•} (P : Measure Ξ©) (ΞΉ : Ξ© β†’ Fin β„“ β†’ Fin n) (Ο€ : Ξ© β†’ Equiv.Perm (Fin n)) (e : Ξ© β†’ Fin n β†’ π•œ) : Prop where isProbabilityMeasure : IsProbabilityMeasure P sign_measurable : βˆ€ i, Measurable (fun Ο‰ => e Ο‰ i) sign_unit : βˆ€ i, βˆ€α΅ Ο‰ βˆ‚P, β€–e Ο‰ iβ€– = 1 sign_uniform : βˆ€ i (u : π•œ), β€–uβ€– = 1 β†’ P.map (fun Ο‰ => u * e Ο‰ i) = P.map (fun Ο‰ => e Ο‰ i) sign_iIndep : ProbabilityTheory.iIndepFun (fun i Ο‰ => e Ο‰ i) P joint : βˆ€ (f : Fin β„“ β†’ Fin n) (Οƒ : Equiv.Perm (Fin n)) (A : Set (Fin n β†’ π•œ)), MeasurableSet A β†’ P {Ο‰ | (β„“ ≀ n β†’ ΞΉ Ο‰ = f) ∧ Ο€ Ο‰ = Οƒ ∧ e Ο‰ ∈ A} = (if β„“ ≀ n then (if Function.Injective f then ((n.descFactorial β„“ : ℝβ‰₯0∞))⁻¹ else 0) else 1) * (((n.factorial : ℝβ‰₯0∞))⁻¹ * P {Ο‰ | e Ο‰ ∈ A}) /-- Οƒ_j(B) (1-based): the j-th largest square root of the eigenvalues of B^*B, and 0 for j > n (sSup βˆ… = 0). -/ noncomputable def singularValue {π•œ : Type*} [RCLike π•œ] {m n : β„•} (B : Matrix (Fin m) (Fin n) π•œ) (j : β„•) : ℝ := sSup {t : ℝ | j ≀ (Finset.univ.filter (fun i : Fin n => t ≀ Real.sqrt ((Matrix.isHermitian_conjTranspose_mul_self B).eigenvalues i))).card} /-- mt2020 thm:rrf-srtt. For B ∈ F^{mΓ—n}, natural k, SRTT test matrix Ξ© ∈ F^{nΓ—β„“} with β„“ β‰₯ 8(k + 8 log(kn)) log k and Y = BΞ©: β€–(I - P_Y)Bβ€– ≀ (1 + 3√(n/β„“)) Οƒ_{k+1}, failure probability O(k^{-1}) with one constant C uniform over all inputs (k = 0 makes the bound ⊀). log = natural log. -/ theorem rrf_srtt {π•œ : Type*} [RCLike π•œ] [MeasurableSpace π•œ] [BorelSpace π•œ] : βˆƒ C : ℝ, 0 < C ∧ βˆ€ (m n k β„“ : β„•) (B : Matrix (Fin m) (Fin n) π•œ) (F : Matrix (Fin n) (Fin n) π•œ), IsUnitaryTrigTransform F β†’ (β„“ : ℝ) β‰₯ 8 * ((k : ℝ) + 8 * Real.log ((k : ℝ) * (n : ℝ))) * Real.log (k : ℝ) β†’ βˆ€ {Ξ© : Type} [MeasurableSpace Ξ©] (P : Measure Ξ©) (ΞΉ : Ξ© β†’ Fin β„“ β†’ Fin n) (Ο€ : Ξ© β†’ Equiv.Perm (Fin n)) (e : Ξ© β†’ Fin n β†’ π•œ), SRTTLaw P ΞΉ Ο€ e β†’ P {Ο‰ | (1 + 3 * Real.sqrt ((n : ℝ) / β„“)) * singularValue B (k + 1) < β€–(1 - orthogonalProjector (B * srttTestMatrix F (ΞΉ Ο‰) (Ο€ Ο‰) (e Ο‰))) * Bβ€–} ≀ ENNReal.ofReal C * ((k : ℝβ‰₯0∞))⁻¹ := by sorry end RNLAPhaseB.MT2020RrfSrtt