# F5-conf-03 — Sums of normally distributed random variables ## Question Proposition A: if X and Y are each normal, X + Y is normal (constants count as normal). Proposition B: if X and Y are independent and each normal, X + Y is normal. Decide each, with a proof sketch or an explicit counterexample, and illustrate any counterexample numerically with the design seed and n. ## Data and exclusions Inputs: `data/propositions.csv` (2 rows) and `data/design.csv` (2 rows) (`n_input_rows`); SHA-256 hashes match `bundle.json` (see `out/state/data_audit.md`). Design: seed 20261029 (`random_seed`), n = 100000 (`n_analysed`). No data issues were found (`data_issues` = []). No exclusions: the simulated sample is kept in full (`out/exclusions.csv`, 0 removed). ## Method The verdicts rest on mathematical arguments given in full in `out/argument.md`: - B: characteristic functions multiply under independence, and the product of two normal characteristic functions is a normal characteristic function; uniqueness then gives the result. - A: counterexample X ~ N(0,1), S an independent random sign (±1 with probability 1/2 each), Y = S·X. Y ~ N(0,1) by symmetry, but X + Y = (1+S)X has an atom of mass 1/2 at 0 and variance 2. So it is neither a continuous normal nor a constant (`counterexample_values.construction`). Y = −X would *not* work, because the constant sum it gives counts as normal under A. Numerical illustration (`out/analysis.py`): n pairs drawn with `numpy.random.default_rng(seed)` and written to `out/counterexample.csv`. For x, y and x+y we report sample means and SDs (ddof = 1) and the Kolmogorov–Smirnov distance between x+y and the normal with the sample mean and SD of x+y. As a baseline under the same rule, an independent pair X, Y ~ N(0,1) was simulated (separate stream `default_rng([seed, 1])`). ## Results - Proposition A is **false** (`statement_true` = false), and a concrete counterexample is given (`counterexample_provided` = true). - Proposition B is **true** (`statement_b_true` = true). - Simulated counterexample (n = 100000, `counterexample_values.n`): mean_x = −0.0033, sd_x = 0.9982, mean_y = −0.0002, sd_y = 0.9982 (`counterexample_values.mean_x/sd_x/mean_y/sd_y`). Both are consistent with N(0,1). Marginal KS distances to fitted normals are 0.0021 and 0.0020 (`diagnostic_ks_x_vs_normal`, `diagnostic_ks_y_vs_normal`). - Sum: mean_sum = −0.0036 and sd_sum = 1.4059 (theory: 0 and √2 ≈ 1.414) (`counterexample_values.mean_sum/sd_sum`). The KS distance to its fitted normal is 0.2508 (`counterexample_values.ks_sum_vs_normal`), matching the theoretical value 0.25. The fraction of sums exactly equal to 0 is 0.5005 (`diagnostic_frac_sum_exactly_zero`). - Baseline: for independent normals, the KS distance of the sum is 0.0017 (`baseline_independent_ks_sum_vs_normal`). That is about 150 times smaller than for the counterexample, and below the rough 5% scale 1.358/√n = 0.0043 (`diagnostic_ks_critical_value_alpha_0.05`). ## Uncertainty The verdicts are deductive and carry no statistical uncertainty. The simulated summaries vary with the sample. Their sampling SD at n = 1e5 is about 0.003 for means and about 0.002 for SDs. A KS distance under a correct normal null is O(1/√n) ≈ 0.004. The observed 0.25 is therefore about 60 times that scale, and the departure from normality is unambiguous. The 1.358/√n scale assumes a fully specified null. Because the mean and SD are estimated (Lilliefors setting), the true critical value is smaller, so that scale is conservative and used only as a rough guide. ## Limitations and open issues - **What the simulation does and does not establish.** It shows that the construction behaves as the proof predicts: normal-looking marginals, a sum with an atom of about 1/2 at 0, and a KS distance of about 0.25. It does **not** prove that the marginals are exactly normal or that B holds in general. Finite samples cannot do that; the proofs in `out/argument.md` do. - The marginal KS checks for x and y are diagnostics only. Exact normality of Y follows from the symmetry argument. - The additional `diagnostic_*` and `baseline_*` keys in `out/results.json` go beyond the required set. They are included for transparency. - No other open issues.