1# Report — F5-conf-03: sums of normally distributed random variables23## Question4Two propositions (data/propositions.csv): **A** — if X and Y are each normal, X + Y is normal (a constant counts as normal); **B** — if X and Y are independent and each normal, X + Y is normal. For each we decide true/false by mathematical argument (full argument in `out/argument.md`), and for a false proposition we give a concrete counterexample with a simulated sample.56## Data and exclusions7Inputs: `data/propositions.csv` (2 rows) and `data/design.csv` (2 rows: seed 20261029, n 100000) (`n_input_rows`, `random_seed`). SHA-256 hashes match the bundle manifest (out/state/data_audit.md). No missing values, duplicates or anomalies (`data_issues` = []). No rows excluded (out/exclusions.csv: 2 − 0 = 2).89## Method10- B: characteristic-function proof (product of normal CFs is a normal CF; uniqueness theorem).11- A: counterexample X ~ N(0,1), S an independent fair random sign, Y = S·X (`counterexample_values.construction`). Y ~ N(0,1) by symmetry; X + Y = (1+S)X equals 0 with probability 1/2 and is N(0,4) otherwise, a law with an atom that is not a point mass, so it is neither a non-degenerate nor a degenerate normal. Y = −X was rejected because its sum is the constant 0, which the statement counts as normal.12- Numerical illustration: `out/analysis.py` draws X then S from `numpy.random.default_rng(20261029)`, n = 100000, writes `out/counterexample.csv`, and computes sample means/SDs (ddof = 1) and the one-sample Kolmogorov–Smirnov distance between each variable and a normal with its own sample mean and SD. Baseline with the same KS rule: X plus a further independent N(0,1) draw (the setting of proposition B).1314## Results15- Proposition A is **false** (`statement_true` = false); a concrete counterexample is provided (`counterexample_provided` = true).16- Proposition B is **true** (`statement_b_true` = true).17- Simulated counterexample (n = 100000, `n_analysed`): 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`), as expected for N(0,1) marginals. Marginal KS distances are 0.0021 and 0.0020 (`ks_x_vs_normal`, `ks_y_vs_normal`).18- Sum: mean_sum = −0.0036, sd_sum = 1.4059 (`counterexample_values.mean_sum`, `.sd_sum`; theory: 0 and √2 ≈ 1.414). The fraction of exactly-zero sums is 0.50047 (`frac_sum_exactly_zero`; theory 1/2). The KS distance of the sum from its fitted normal is 0.2508 (`counterexample_values.ks_sum_vs_normal`; population value 0.25).19- Baseline: for an independent sum the same KS distance is 0.0018 (`baseline_ks_sum_independent`), which matches B.20- For scale, the nominal 1% KS critical value 1.628/√n is 0.0051 (`ks_critical_value_alpha_0_01`). The sum's KS distance is about 50 times that value. The marginal and baseline distances fall below it.2122## Uncertainty23The verdicts come from proofs and carry no sampling uncertainty. The numbers in the simulation do: sample means and SDs differ from their theoretical values by roughly 1/√n ≈ 0.003. The nominal KS critical value treats the normal's parameters as known. Here they are estimated (a Lilliefors setting), so the nominal value is conservative. That does not change any conclusion, because 0.25 vs 0.005 is far outside any plausible critical value. All results come from one seed. The run is deterministic and reproduces exactly (out/state/checks.md).2425## Limitations and open issues26- **What the illustration establishes:** for this seed and n, the sample from the stated construction looks like it has N(0,1) marginals. Its sum has an atom at 0 of about half the mass and sits far from any normal fit. The simulation agrees with the theory: SD ≈ √2, zero-fraction ≈ 1/2, KS ≈ 1/4.27- **What it does not establish:** a finite sample cannot prove that the marginals are exactly normal, and it cannot prove that A or B is true or false. Both verdicts rest only on the arguments in `out/argument.md`. A small marginal KS distance only shows consistency with normality.28- No open issues. The task is complete (`feasibility` = "complete").29