Stat.Nonparametric.Moment­Problems

Moment-problem substrate for nonparametric statistics: raw-moment algebra, L² projection residuals, constrained score programs, and sharp bounded-outcome residual envelopes.

Residual­Quadratic 24 core · 18 supporting · 3 submodules Residual-quadratic moment problems: moment-coordinate formulas, measure-level L² projection residuals, and projection residual orthogonality identities. Bounded­Outcome­Envelope 14 core · 26 supporting · 5 submodules Sharp bounded-outcome residual envelopes: quartic root selection, admissible laws, upper bounds, and extremal three-point attainment. Score­Program 4 core · 3 supporting · 1 submodule Dual score-program tools for moment problems: projection residual functions, feasible score directions, quadratic objectives, and minimum-norm identities.
Cumulant 3 core · 0 supporting This module provides the general moment-to-cumulant coordinates used throughout the moment-problem layer: the joint cumulant of a pair of real random variables at a given bidegree (defined by the set-partition Möbius for

Cumulants of real random variables, and the Gaussian-law predicate

This module provides the general moment-to-cumulant coordinates used throughout the moment-problem layer: the joint cumulant of a pair of real random variables at a given bidegree (defined by the set-partition Möbius formula on mixed moments), the univariate cumulant of a single real random variable obtained by specializing it, and the predicate "this law on the real line is a Gaussian law".

These are the plain textbook objects: the second cumulant is the variance, the third is the centered third moment, the fourth is the excess kurtosis, and a Gaussian law is exactly a law whose cumulants above order two all vanish. The Gaussian predicate here is the distributional one — being some gaussianReal with a mean and a variance, degenerate Diracs included — and is the form in which non-Gaussianity assumptions (as in linear non-Gaussian causal discovery) are stated.

def IsGaussianLaw reviewed
Causalean.Stat.MomentProblems

A probability law on the real line is a Gaussian law when it is a normal distribution: there is a mean and a (possibly zero) variance whose normal distribution is exactly this law. Allowing zero variance means the point masses (Diracs) count as degenerate Gaussians, so the negation "not a Gaussian law" is the strongest possible non-Gaussianity requirement.

Definition (Lean source)
def IsGaussianLaw (ν : Measure ℝ) : Prop := ∃ (mean : ℝ) (v : ℝ≥0), ν = gaussianReal mean v
Causalean.Stat.MomentProblems.IsGaussianLaw · Causalean/Stat/Nonparametric/MomentProblems/Cumulant.lean:34
def jointCumulant reviewed
Causalean.Stat.MomentProblems

The joint cumulant of two real random variables at bidegree (p, q): the cumulant of the first variable taken p times together with the second taken q times. It is obtained from the mixed moments by the classical set-partition (Möbius) inversion — sum over all partitions of the p + q slots of a signed factorial weight times the product, over the blocks of the partition, of the mixed moment matching how many first-variable and second-variable slots that block contains.

Definition (Lean source)
noncomputable def jointCumulant (μ : Measure Ω) (X Y : Ω → ℝ) (p q : ℕ) : ℝ := ∑ π : Finpartition (Finset.univ : Finset (Fin (p + q))), (-1 : ℝ) ^ (π.parts.card - 1) * (factorial (π.parts.card - 1) : ℝ) * ∏ B ∈ π.parts, ∫ ω, (X ω) ^ (B.filter (fun i => i.val < p)).card * (Y ω) ^ (B.filter (fun i => p ≤ i.val)).card ∂μ
Causalean.Stat.MomentProblems.jointCumulant · Causalean/Stat/Nonparametric/MomentProblems/Cumulant.lean:41
def sourceCumulant reviewed
Causalean.Stat.MomentProblems

The cumulant of order r of a single real random variable: the joint cumulant of the variable with itself in which every slot is filled by that one variable. Order two is the variance, order three the centered third moment, order four the excess kurtosis.

Definition (Lean source)
noncomputable def sourceCumulant (μ : Measure Ω) (S : Ω → ℝ) (r : ℕ) : ℝ := jointCumulant μ S S r 0
Causalean.Stat.MomentProblems.sourceCumulant · Causalean/Stat/Nonparametric/MomentProblems/Cumulant.lean:56
Moment­Cumulant­Inversion 6 core · 8 supporting Cumulants are polynomials in the moments, and the polynomial of order r involves the moment of order r linearly (with coefficient one) plus a remainder built only from strictly lower moments. ★ sourceCumulant_eq_cumFromMom★ cumFromMom_momFromCum★ continuous_momFromCum

The triangular moment ↔ cumulant change of coordinates

Cumulants are polynomials in the moments, and the polynomial of order r involves the moment of order r linearly (with coefficient one) plus a remainder built only from strictly lower moments. That triangularity means the change of coordinates inverts: prescribing a cumulant sequence determines a moment sequence, recursively and uniquely, among sequences normalized to have total mass one and mean zero.

This module sets up both directions on abstract sequences of reals — no measure is needed to state them — and connects the forward direction to the measure-theoretic cumulant of a real random variable. It also records the two structural facts the inversion is used for downstream: each reconstructed moment depends only on the prescribed cumulants up to the same order (locality), and depends continuously on them.

def cumFromMom reviewed
Causalean.Stat.MomentProblems

The order-r cumulant read off from a moment sequence: the set-partition (Möbius) formula that expresses the r-th cumulant as a signed, factorial-weighted sum over partitions of r slots of products of moments, one moment per block, at the block's size.

Definition (Lean source)
noncomputable def cumFromMom (r : ℕ) (m : ℕ → ℝ) : ℝ := ∑ π : Finpartition (Finset.univ : Finset (Fin r)), (-1 : ℝ) ^ (π.parts.card - 1) * (factorial (π.parts.card - 1) : ℝ) * ∏ B ∈ π.parts, m B.card
def restFromMom reviewed
Causalean.Stat.MomentProblems

The lower-order remainder of the order-r cumulant formula: the same sum with the single one-block partition removed. Because every block of a multi-block partition is a proper subset, this depends only on moments of order strictly below r.

Definition (Lean source)
noncomputable def restFromMom (r : ℕ) (m : ℕ → ℝ) : ℝ := ∑ π ∈ Finset.univ.filter (fun π : Finpartition (Finset.univ : Finset (Fin r)) => π.parts.card ≠ 1), (-1 : ℝ) ^ (π.parts.card - 1) * (factorial (π.parts.card - 1) : ℝ) * ∏ B ∈ π.parts, m B.card
theorem sourceCumulant_eq_cumFromMom reviewed
Causalean.Stat.MomentProblems

For a real random variable with law ν and any order r, the order-r cumulant of ν equals the abstract combinatorial cumulant formula evaluated at ν's own raw-moment sequence: the measure-theoretic and combinatorial definitions agree.

Formal statement
ν :
r :
sourceCumulant ν (id : ℝ → ℝ) r = cumFromMom r (fun k => ∫ t, t ^ k ∂ν)
Proof (Lean source)
theorem sourceCumulant_eq_cumFromMom (ν : Measure ℝ) (r : ℕ) : sourceCumulant ν (id : ℝ → ℝ) r = cumFromMom r (fun k => ∫ t, t ^ k ∂ν) := by unfold sourceCumulant jointCumulant cumFromMom apply Finset.sum_congr rfl intro π _ congr 1 apply Finset.prod_congr rfl intro B hB have hfirst : B.filter (fun i => i.val < r) = B := Finset.filter_true_of_mem (fun i _ => i.isLt) have hsecond : B.filter (fun i => r ≤ i.val) = ∅ := Finset.filter_false_of_mem (fun i _ hi => (not_le_of_gt i.isLt) hi) rw [hsecond] simp
Causalean.Stat.MomentProblems.sourceCumulant_eq_cumFromMom · Causalean/Stat/Nonparametric/MomentProblems/MomentCumulantInversion.lean:79 · uses cumFromMom , sourceCumulant
def momFromCum reviewed
Causalean.Stat.MomentProblems

The moment sequence reconstructed from a prescribed cumulant sequence, by inverting the triangular formula: total mass one, mean zero, and at each order at least two the moment is the prescribed cumulant minus the remainder assembled from the already-reconstructed lower moments.

Definition (Lean source)
noncomputable def momFromCum (c : ℕ → ℝ) : ℕ → ℝ | 0 => 1 | 1 => 0 | succ (succ r) => c (r + 2) - restFromMom (r + 2) (fun k => if _h : k < r + 2 then momFromCum c k else 0) termination_by n => n decreasing_by omega
theorem cumFromMom_momFromCum reviewed
Causalean.Stat.MomentProblems

Correctness of the inversion. Reading the cumulants back off the reconstructed moment sequence returns the prescribed cumulants, at every order r at least two.

Formal statement
c :
ℕ → ℝ
r :
hr :
2 ≤ r
Proof (Lean source)
theorem cumFromMom_momFromCum (c : ℕ → ℝ) (r : ℕ) (hr : 2 ≤ r) : cumFromMom r (momFromCum c) = c r := by rw [cumFromMom_eq r (by omega), momFromCum_succ c r hr] ring
theorem continuous_momFromCum reviewed
Causalean.Stat.MomentProblems

Continuity of the inversion. At any fixed order r, the reconstructed moment of that order is a continuous function of the prescribed cumulant sequence, so small perturbations of the target cumulants move the moments only slightly — the key to the openness arguments that use this inversion.

Formal statement
r :
Continuous (fun c : ℕ → ℝ => momFromCum c r)
Proof (Lean source)
theorem continuous_momFromCum (r : ℕ) : Continuous (fun c : ℕ → ℝ => momFromCum c r) := by induction r using Nat.strong_induction_on with | h r ih => by_cases hr : 2 ≤ r · simp_rw [momFromCum_succ _ r hr] apply (continuous_apply r).sub unfold restFromMom apply continuous_finset_sum intro π _ apply continuous_const.mul apply continuous_finset_prod intro B hB exact ih B.card (block_card_lt_of_card_ne_one π ((Finset.mem_filter.mp ‹π ∈ Finset.univ.filter _›).2) hB) · interval_cases r · simpa only [momFromCum_zero] using (continuous_const : Continuous (fun _ : ℕ → ℝ => (1 : ℝ))) · simpa only [momFromCum_one] using (continuous_const : Continuous (fun _ : ℕ → ℝ => (0 : ℝ)))
Causalean.Stat.MomentProblems.continuous_momFromCum · Causalean/Stat/Nonparametric/MomentProblems/MomentCumulantInversion.lean:215 · uses momFromCum
8 supporting declarations (lemmas, instances)
Atomic­Law 4 core · 4 supporting This module builds the finitely supported probability laws used as explicit witnesses in truncated moment problems: a finite list of distinct real atom locations carrying a matching list of weights. ★ isProbabilityMeasure_atomicLaw★ not_isGaussianLaw_atomicLaw

Finite atomic laws on the real line

This module builds the finitely supported probability laws used as explicit witnesses in truncated moment problems: a finite list of distinct real atom locations carrying a matching list of weights. It records how such a law integrates an arbitrary function (a weighted sum over the atoms), when it is a probability measure, how much mass it puts on each atom, that all of its moments are finite (the support is bounded), and that it is never Gaussian as soon as two atoms carry strictly positive mass.

The last fact is what makes finite atomic laws usable as non-Gaussian witnesses: a nondegenerate normal law has no atoms at all, and a degenerate one is a single point mass, so two distinct atoms of positive mass rule out both cases.

def atomicWeight reviewed
Causalean.Stat.MomentProblems

The total weight that an indexed list of atoms places on a given point of the real line: the sum of the weights of all indices whose location is that point.

Definition (Lean source)
noncomputable def atomicWeight (n : ℕ) (x : Fin n → ℝ) (p : Fin n → ℝ) : ℝ → ℝ := fun t ↦ ∑ i : Fin n, if x i = t then p i else 0
Causalean.Stat.MomentProblems.atomicWeight · Causalean/Stat/Nonparametric/MomentProblems/AtomicLaw.lean:30
def atomicLaw reviewed
Causalean.Stat.MomentProblems

The finite atomic law determined by a list of real locations and a matching list of weights: the measure that puts each weight as a point mass at its own location.

Definition (Lean source)
noncomputable def atomicLaw (n : ℕ) (x : Fin n → ℝ) (p : Fin n → ℝ) : Measure ℝ := discreteMeasure (image x univ) (atomicWeight n x p)
Causalean.Stat.MomentProblems.atomicLaw · Causalean/Stat/Nonparametric/MomentProblems/AtomicLaw.lean:35
theorem isProbabilityMeasure_atomicLaw reviewed
Causalean.Stat.MomentProblems

A finite atomic law on the real line, built from n pairwise distinct atom locations carrying nonnegative weights that sum to one, is a probability measure.

Formal statement
n :
Fin n → ℝ
Fin n → ℝ
hx :
hp :
∀ i, 0 ≤ p i
hsum :
∑ i, p i = 1
Proof (Lean source)
theorem isProbabilityMeasure_atomicLaw {n : ℕ} {x : Fin n → ℝ} {p : Fin n → ℝ} (hx : Injective x) (hp : ∀ i, 0 ≤ p i) (hsum : ∑ i, p i = 1) : IsProbabilityMeasure (atomicLaw n x p) := by classical apply isProbabilityMeasure_discreteMeasure · intro t ht obtain ⟨i, hi, rfl⟩ := Finset.mem_image.mp ht rw [atomicWeight_apply hx] exact hp i · rw [Finset.sum_image hx.injOn] simpa only [atomicWeight_apply hx] using hsum
Causalean.Stat.MomentProblems.isProbabilityMeasure_atomicLaw · Causalean/Stat/Nonparametric/MomentProblems/AtomicLaw.lean:66 · uses atomicLaw
theorem not_isGaussianLaw_atomicLaw reviewed
Causalean.Stat.MomentProblems

A finite atomic probability law with at least two locations that are pairwise distinct and each carry strictly positive mass is not a Gaussian law: a normal law with positive variance has no point masses at all, and one with zero variance is a single point mass.

Formal statement
n :
Fin n → ℝ
Fin n → ℝ
hx :
hp :
∀ i, 0 < p i
hn :
2 ≤ n
Proof (Lean source)
theorem not_isGaussianLaw_atomicLaw {n : ℕ} {x : Fin n → ℝ} {p : Fin n → ℝ} (hx : Injective x) (hp : ∀ i, 0 < p i) (hn : 2 ≤ n) : ¬ IsGaussianLaw (atomicLaw n x p) := by classical intro hgauss obtain ⟨mean, v, hv⟩ := hgauss let i₀ : Fin n := ⟨0, by omega⟩ let i₁ : Fin n := ⟨1, by omega⟩ have hi₀₁ : i₀ ≠ i₁ := by intro h have := congrArg val h simp [i₀, i₁] at this have hx₀₁ : x i₀ ≠ x i₁ := fun h ↦ hi₀₁ (hx h) have hpnonneg : ∀ i, 0 ≤ p i := fun i ↦ (hp i).le by_cases hvzero : v = 0 · have hdirac : atomicLaw n x p = Measure.dirac mean := by rw [hv, hvzero, gaussianReal_zero_var] have hmass₀ := atomicLaw_singleton hx hpnonneg i₀ have hmass₁ := atomicLaw_singleton hx hpnonneg i₁ rw [hdirac] at hmass₀ hmass₁ have hmean₀ : mean = x i₀ := by by_contra hne have hzero : Measure.dirac mean {x i₀} = 0 := by simp [Measure.dirac_apply' mean (MeasurableSet.singleton (x i₀)), hne] exact ENNReal.ofReal_ne_zero_iff.mpr (hp i₀) (hmass₀.symm.trans hzero) have hmean₁ : mean = x i₁ := by by_contra hne have hzero : Measure.dirac mean {x i₁} = 0 := by simp [Measure.dirac_apply' mean (MeasurableSet.singleton (x i₁)), hne] exact ENNReal.ofReal_ne_zero_iff.mpr (hp i₁) (hmass₁.symm.trans hzero) exact hx₀₁ (hmean₀.symm.trans hmean₁) · have hnoatoms : NullSingletonClass (atomicLaw n x p) := by rw [hv] exact nullSingletonClass_gaussianReal hvzero have hzero : atomicLaw n x p {x i₀} = 0 := hnoatoms.measure_singleton (x i₀) rw [atomicLaw_singleton hx hpnonneg i₀] at hzero exact ENNReal.ofReal_ne_zero_iff.mpr (hp i₀) hzero
Causalean.Stat.MomentProblems.not_isGaussianLaw_atomicLaw · Causalean/Stat/Nonparametric/MomentProblems/AtomicLaw.lean:113 · uses IsGaussianLaw , atomicLaw
4 supporting declarations (lemmas, instances)
Symmetric­Atom­Solve 11 core · 15 supporting Fix L + 1 equally spaced atoms placed symmetrically about the origin. ★ continuous_cumulantToWeights★ cumulantToWeights_uniformCumulantPoint

Solving for atom weights that match a prescribed cumulant target

Fix L + 1 equally spaced atoms placed symmetrically about the origin. Matching the raw moments of orders 0, 1, …, L of a weight vector supported on those atoms to a prescribed moment target is a square linear system whose matrix is a transposed Vandermonde matrix in the atom locations. The atoms being distinct, that matrix is invertible, so the weights are recovered from the moment target by a linear — in particular continuous — solve.

Composing this solve with the triangular moment↔cumulant inversion gives the map this module exports: prescribed truncated cumulants ↦ atom weights, which is continuous, and which sends the cumulants of the uniform-weight law back to the uniform weights. That is exactly what is needed to conclude, by openness of the strict-positivity constraint, that a whole neighborhood of cumulant targets is matched by genuine (positive-weight) probability laws.

Nothing here yet asserts positivity of the solved weights: it is a pure linear-algebra and continuity layer. The realizability conclusion is drawn in TruncatedCumulantInterior.

def symmetricAtoms reviewed
Causalean.Stat.MomentProblems

The L + 1 equally spaced symmetric atoms −L, −L + 2, …, L − 2, L: the i-th atom sits at twice i minus L. They are symmetric about the origin and pairwise distinct.

Definition (Lean source)
noncomputable def symmetricAtoms (L : ℕ) : Fin (L + 1) → ℝ := fun i => 2 * (i.val : ℝ) - (L : ℝ)
Causalean.Stat.MomentProblems.symmetricAtoms · Causalean/Stat/Nonparametric/MomentProblems/SymmetricAtomSolve.lean:34
def uniformWeights reviewed
Causalean.Stat.MomentProblems

The uniform weight vector on the L + 1 atoms: each atom carries mass 1 / (L + 1).

Definition (Lean source)
noncomputable def uniformWeights (L : ℕ) : Fin (L + 1) → ℝ := fun _ => 1 / (L + 1 : ℝ)
Causalean.Stat.MomentProblems.uniformWeights · Causalean/Stat/Nonparametric/MomentProblems/SymmetricAtomSolve.lean:65
def uniformMoments reviewed
Causalean.Stat.MomentProblems

The raw-moment sequence of the uniform-weight law on the symmetric atoms.

Definition (Lean source)
noncomputable def uniformMoments (L : ℕ) : ℕ → ℝ := fun k => ∑ i, uniformWeights L i * symmetricAtoms L i ^ k
Causalean.Stat.MomentProblems.uniformMoments · Causalean/Stat/Nonparametric/MomentProblems/SymmetricAtomSolve.lean:87
def uniformCumulants reviewed
Causalean.Stat.MomentProblems

The cumulant sequence of the uniform-weight law on the symmetric atoms — the base point around which the truncated cumulant range is shown to have interior.

Definition (Lean source)
noncomputable def uniformCumulants (L : ℕ) : ℕ → ℝ := fun r => cumFromMom r (uniformMoments L)
Causalean.Stat.MomentProblems.uniformCumulants · Causalean/Stat/Nonparametric/MomentProblems/SymmetricAtomSolve.lean:99
def atomVandermonde reviewed
Causalean.Stat.MomentProblems

The Vandermonde matrix of the symmetric atoms: row i lists the powers of the i-th atom.

Definition (Lean source)
noncomputable def atomVandermonde (L : ℕ) : Matrix (Fin (L + 1)) (Fin (L + 1)) ℝ := Matrix.vandermonde (symmetricAtoms L)
Causalean.Stat.MomentProblems.atomVandermonde · Causalean/Stat/Nonparametric/MomentProblems/SymmetricAtomSolve.lean:114
def atomSolve reviewed
Causalean.Stat.MomentProblems

The weight vector solving the moment-matching system: given a target for the raw moments of orders 0 through L, the unique weights on the symmetric atoms reproducing them.

Definition (Lean source)
noncomputable def atomSolve (L : ℕ) (b : Fin (L + 1) → ℝ) : Fin (L + 1) → ℝ := (atomVandermonde L).transpose⁻¹.mulVec b
def padCumulants reviewed
Causalean.Stat.MomentProblems

Extending a finite cumulant target of orders 0, …, L to a full sequence by zeros beyond order L.

Definition (Lean source)
noncomputable def padCumulants (L : ℕ) (y : Fin (L + 1) → ℝ) : ℕ → ℝ := fun k => if h : k < L + 1 then y ⟨k, h⟩ else 0
def cumulantToWeights reviewed
Causalean.Stat.MomentProblems

The cumulant-to-weights map: from a prescribed truncated cumulant target, invert the triangular moment↔cumulant relation to get the target moments, then solve the Vandermonde system for the weights on the symmetric atoms.

Definition (Lean source)
noncomputable def cumulantToWeights (L : ℕ) (y : Fin (L + 1) → ℝ) : Fin (L + 1) → ℝ := atomSolve L (fun k => momFromCum (padCumulants L y) k.val)
Causalean.Stat.MomentProblems.cumulantToWeights · Causalean/Stat/Nonparametric/MomentProblems/SymmetricAtomSolve.lean:193
theorem continuous_cumulantToWeights reviewed
Causalean.Stat.MomentProblems

The cumulant-to-weights map is continuous. For any truncation order L, the map sending a truncated cumulant target to the recovered symmetric-atom weights is continuous, since both the moment↔cumulant inversion and the Vandermonde solve it composes are continuous.

Formal statement
L :
Proof (Lean source)
Causalean.Stat.MomentProblems.continuous_cumulantToWeights · Causalean/Stat/Nonparametric/MomentProblems/SymmetricAtomSolve.lean:200 · uses cumulantToWeights
def uniformCumulantPoint reviewed
Causalean.Stat.MomentProblems

The base cumulant target: the cumulants, of orders 0 through L, of the uniform-weight law on the symmetric atoms.

Definition (Lean source)
noncomputable def uniformCumulantPoint (L : ℕ) : Fin (L + 1) → ℝ := fun k => uniformCumulants L k.val
Causalean.Stat.MomentProblems.uniformCumulantPoint · Causalean/Stat/Nonparametric/MomentProblems/SymmetricAtomSolve.lean:209
theorem cumulantToWeights_uniformCumulantPoint reviewed
Causalean.Stat.MomentProblems

The base point maps to the uniform weights. For any truncation order L, feeding the cumulants of the uniform-weight law on the symmetric atoms into the cumulant-to-weights map returns exactly the uniform weights — all strictly positive, hence strictly inside the positivity constraints.

Formal statement
L :
cumulantToWeights L (uniformCumulantPoint L) = uniformWeights L
Proof (Lean source)
theorem cumulantToWeights_uniformCumulantPoint (L : ℕ) : cumulantToWeights L (uniformCumulantPoint L) = uniformWeights L := by calc cumulantToWeights L (uniformCumulantPoint L) = atomSolve L (fun k => momFromCum (padCumulants L (uniformCumulantPoint L)) k.val) := rfl _ = atomSolve L (fun k => uniformMoments L k.val) := by congr 1 funext k exact momFromCum_padCumulants_uniform L k _ = uniformWeights L := atomSolve_uniformMoments L
15 supporting declarations (lemmas, instances)
Truncated­Cumulant­Interior 2 core · 0 supporting The main result of this module says that the truncated cumulant sequences of orders two through L attainable by *centered, non-Gaussian* probability laws on the real line with finite L-th moment fill up a set with nonemp ★ truncatedMomentInterior

The truncated cumulant range has nonempty interior

The main result of this module says that the truncated cumulant sequences of orders two through L attainable by centered, non-Gaussian probability laws on the real line with finite L-th moment fill up a set with nonempty interior: there is one attainable cumulant vector all of whose sufficiently small perturbations are again attainable by such a law.

The proof is constructive rather than an appeal to the general (truncated Hamburger) moment problem. Put L + 1 distinct equally spaced symmetric atoms on the line. Matching the first L + 1 raw moments of a weight vector to a target is then a linear system with a transposed Vandermonde matrix, hence invertible, and the moment target itself is obtained from the cumulant target by the triangular moment↔cumulant inversion — so weights depend continuously on the prescribed cumulants (SymmetricAtomSolve). At the uniform weight vector all weights are strictly positive, and positivity is an open condition, so every nearby cumulant target still solves to strictly positive weights, i.e. to a genuine probability law. That law is centered (the atoms are symmetric and the first-moment equation is part of the solved system), has all moments finite (finite support), and is non-Gaussian (at least two atoms carry positive mass).

The order L = 0 case is degenerate — a single atom would be a point mass, i.e. a degenerate Gaussian — and is handled separately by an explicit fair two-point law on ±1.

References: Akhiezer (1965), The Classical Moment Problem; Curto–Fialkow (1991) on truncated moment problems and flat extensions; Schmüdgen (2017), The Moment Problem, Theorem 10.7.

def TruncatedMomentInterior reviewed
Causalean.Stat.MomentProblems

Interior of the truncated cumulant range at order L. There is a cumulant target and a strictly positive radius such that every cumulant sequence within that radius of the target, in orders two through L, is realized by a probability law on the real line that is centered, is not a Gaussian law, and has finite L-th moment.

Definition (Lean source)
def TruncatedMomentInterior (L : ℕ) : Prop := ∃ (c : ℕ → ℝ) (ε : ℝ), 0 < ε ∧ ∀ c' : ℕ → ℝ, (∀ r, 2 ≤ r → r ≤ L → |c' r - c r| < ε) → ∃ ν : Measure ℝ, IsProbabilityMeasure ν ∧ (∫ x, x ∂ν = 0) ∧ ¬ IsGaussianLaw ν ∧ MemLp (id : ℝ → ℝ) (L : ℝ≥0∞) ν ∧ ∀ r, 2 ≤ r → r ≤ L → sourceCumulant ν id r = c' r
Causalean.Stat.MomentProblems.TruncatedMomentInterior · Causalean/Stat/Nonparametric/MomentProblems/TruncatedCumulantInterior.lean:40
theorem truncatedMomentInterior reviewed
Causalean.Stat.MomentProblems

The truncated cumulant range has nonempty interior. For every truncation order L, there is a cumulant vector, of orders two through L, together with a strictly positive radius, such that every cumulant vector within that radius is the truncated cumulant vector of some centered, non-Gaussian probability law on the real line with finite L-th moment.

Formal statement
L :
Proof (Lean source)
theorem truncatedMomentInterior (L : ℕ) : TruncatedMomentInterior L := by by_cases hL : L = 0 · simpa [hL] using truncatedMomentInterior_zero have hLpos : 1 ≤ L := by omega let radius : ℝ := 1 / (L + 1 : ℝ) have hradius : 0 < radius := by dsimp [radius]; positivity obtain ⟨ε, hε, hcont⟩ := Metric.continuousAt_iff.mp (continuous_cumulantToWeights L).continuousAt radius hradius refine ⟨uniformCumulants L, ε, hε, ?_⟩ intro c' hc' let y : Fin (L + 1) → ℝ := fun k => if 2 ≤ k.val then c' k.val else uniformCumulants L k.val have hy : dist y (uniformCumulantPoint L) < ε := by rw [dist_pi_lt_iff hε] intro k by_cases hk : 2 ≤ k.val · simpa [y, uniformCumulantPoint, hk, Real.dist_eq] using hc' k.val hk (by omega) · simpa [y, uniformCumulantPoint, hk] using hε have hphiDist : dist (cumulantToWeights L y) (cumulantToWeights L (uniformCumulantPoint L)) < radius := hcont hy have hp : ∀ i, 0 < cumulantToWeights L y i := by intro i have hi := (dist_pi_lt_iff hradius).mp hphiDist i rw [cumulantToWeights_uniformCumulantPoint L] at hi simp only [Real.dist_eq, uniformWeights, radius] at hi linarith [abs_lt.mp hi] have hpad : ∀ k, 2 ≤ k → k ≤ L → padCumulants L y k = c' k := by intro k hk hkL simp [padCumulants, y, hk, show k < L + 1 by omega] have hmom : ∀ k, k ≤ L → momFromCum (padCumulants L y) k = momFromCum c' k := by intro k hk apply momFromCum_congr intro j hj hjk exact hpad j hj (hjk.trans hk) have hsolve : ∀ k, k ≤ L → ∑ i, cumulantToWeights L y i * symmetricAtoms L i ^ k = momFromCum c' k := by intro k hk let kf : Fin (L + 1) := ⟨k, by omega⟩ simpa [cumulantToWeights, kf, hmom k hk] using atomSolve_spec L (fun j => momFromCum (padCumulants L y) j.val) kf have hsum : ∑ i, cumulantToWeights L y i = 1 := by simpa using hsolve 0 (by omega) have hmean : ∑ i, cumulantToWeights L y i * symmetricAtoms L i = 0 := by simpa using hsolve 1 hLpos let ν := atomicLaw (L + 1) (symmetricAtoms L) (cumulantToWeights L y) have hpnonneg : ∀ i, 0 ≤ cumulantToWeights L y i := fun i => (hp i).le refine ⟨ν, isProbabilityMeasure_atomicLaw (symmetricAtoms_injective L) hpnonneg hsum, ?_, not_isGaussianLaw_atomicLaw (symmetricAtoms_injective L) hp (by omega), memLp_id_atomicLaw (symmetricAtoms_injective L) hpnonneg hsum (L : ℝ≥0∞), ?_⟩ · simpa [ν] using (integral_atomicLaw (symmetricAtoms_injective L) hpnonneg id).trans hmean · intro r hr hrL rw [sourceCumulant_eq_cumFromMom] calc cumFromMom r (fun k => ∫ t, t ^ k ∂ν) = cumFromMom r (momFromCum c') := by apply cumFromMom_congr intro k hk hkR rw [integral_atomicLaw (symmetricAtoms_injective L) hpnonneg] exact hsolve k (hkR.trans hrL) _ = c' r := cumFromMom_momFromCum c' r hr