# F5-conf-03 — Sums of normally distributed random variables ## Question Are the following true? (A) If X and Y are each normal, X + Y is normal (constants count as degenerate normals). (B) If X and Y are independent and each normal, X + Y is normal. For a false proposition, give a concrete counterexample and a simulated sample from it (seed and n from `data/design.csv`). ## Data and exclusions Inputs: `data/propositions.csv` (2 rows) and `data/design.csv` (2 rows: seed = 20261029, n = 100000) — `n_input_rows`, `random_seed`, `n_analysed`. No missing values, duplicates or anomalies were found (`data_issues` is empty). Nothing was excluded (`out/exclusions.csv`: 2 → 2). SHA-256 hashes are in `out/state/data_audit.md`. ## Method The verdicts come from mathematical arguments, written out in `out/argument.md`. The simulation only illustrates them. - **A (counterexample):** X ~ N(0,1), S an independent random sign (±1 with probability ½ each), Y = S·X. Y is N(0,1) because the standard normal is symmetric. X + Y = (1+S)X has law ½δ₀ + ½N(0,4). That law has an atom of mass ½ at 0, so it is neither a non-degenerate normal nor a constant. I chose this construction over Y = −X because Y = −X gives a constant sum, which the proposition counts as normal. - **B (proof):** the characteristic functions of independent variables multiply, exp(iμ₁t−σ₁²t²/2)·exp(iμ₂t−σ₂²t²/2) is the characteristic function of N(μ₁+μ₂, σ₁²+σ₂²), and the uniqueness theorem then gives normality of X + Y. - **Simulation:** `numpy.random.default_rng(20261029)` draws n = 100000 values of X and then of S. The sample is written to `out/counterexample.csv`. The script computes sample means and sds (ddof = 1) and the KS distance between x+y and the normal with the sample mean and sd of x+y. As a baseline, the same RNG stream continues to draw independent normals X′, Y′, and the same KS rule is applied to X′+Y′. ## Results - Proposition A is **false** (`statement_true` = false), and a concrete counterexample is provided (`counterexample_provided` = true; `counterexample_values.construction`). - Proposition B is **true** (`statement_b_true` = true). - Marginals in the sample: mean_x = −0.0033, sd_x = 0.9982, mean_y = −0.0002, sd_y = 0.9982 (`counterexample_values.*`). KS distances to N(0,1) are 0.0028 for x and 0.0016 for y (`counterexample_diagnostics.ks_x_vs_std_normal`, `ks_y_vs_std_normal`). Both are below the approximate 5% critical value of 0.0043 (`counterexample_diagnostics.ks_95pct_critical_value_approx`), so they are consistent with N(0,1). - Sum: mean_sum = −0.0036, sd_sum = 1.4059 (`counterexample_values.mean_sum`, `sd_sum`). 50.05% of the sums are exactly 0 (`counterexample_diagnostics.frac_sum_exactly_zero`; theory: 50%). KS distance to the fitted normal: `counterexample_values.ks_sum_vs_normal` = 0.2508. The population value is 0.25 (`counterexample_diagnostics.population_ks_sum_vs_N02`). - Baseline (independent case, B): KS = 0.0020 (`baseline_b_ks_sum_vs_normal`), sd = 1.4124 (`baseline_b_sd_sum`). This is consistent with normality, as B predicts. - Sample correlation of x and y: −0.008 (`counterexample_diagnostics.corr_xy`; theoretical covariance 0). X and Y are uncorrelated normals but not jointly normal. ## Uncertainty The verdicts are mathematical and carry no sampling uncertainty. For the illustration, KS sampling noise at n = 100000 is about 1.36/√n ≈ 0.0043 (`counterexample_diagnostics.ks_95pct_critical_value_approx`). The observed sum KS of 0.2508 is about 58 times larger. The marginal KS distances and the baseline KS are all below that noise level. I computed no formal p-values. Also, a KS test against a normal whose parameters are estimated from the same sample is not exactly calibrated (Lilliefors), which makes the stated critical value approximate. ## Limitations and open issues - **What the simulation shows:** a sample from the stated construction looks normal in each marginal and looks very non-normal in the sum, with an atom at 0 of mass ≈ ½. It also confirms that the code implements the construction. - **What it does not show:** a finite sample cannot prove that the marginals are exactly normal, or that any proposition is true or false. That rests on the arguments in `out/argument.md`. In the same way, the baseline KS for B is a consistency check, not a proof of B. - The population KS of 0.25 was evaluated numerically on a fine grid. Analytically it equals the jump size ½ at 0 minus ¼ on each side. - No open data issues.