Roughly sixty model versions were built to predict a national lottery, across three games and two and a half years. Each generation looked better than the last. None of them worked. This is the complete record — every architecture, every bug, every honest win, every illusion that had to be dismantled — and the one measurable signal that survived, which was never in the draws at all.
01 · A laboratory where you know the answer in advance
A mechanical lottery draw is about the closest you get to a process whose null hypothesis you can assume before you start: the machine is built and audited to be fair, and the balls have no memory. That is an assumption about the equipment, not something the data can prove — but it is the strongest prior available anywhere, which makes this the rare case where you roughly know the right answer in advance. Normally that is a reason to leave the problem alone. Here it became the reason to take it up.
A pipeline that reports an edge on a domain with this strong a fairness prior has not discovered anything about lotteries. It has discovered something about itself. Every false positive it produces is a defect in the method — one that would have passed unnoticed on messier data where the truth is unknown. So the project was run to its natural end: build a genuinely serious modelling stack, point it at a process that should contain nothing, and record honestly what it claims.
The subject was the Romanian national lottery — Loto 6/49, Loto 5/40 and Joker (5 of 45 plus a Joker ball of 20). The 6/49 history runs to 2,565 validated draws going back to 1993; Joker to 398; 5/40, a newer game, to 61. Every record was eventually reconciled against the official operator archive and cross-checked against independent secondary sources — but, as section 06 records, several integrity failures surfaced only months in, after they had already shaped results.
What follows is written the way a laboratory notebook should be: the failures at the same resolution as the results.
02 · The complete version history
It began in January 2024 with a set of TensorFlow specifications and a spreadsheet of 102 draws. It ended on 8 August 2026 with a seventy-test randomness audit and a decision to stop. Note that the file timestamps do not show this: archiving into DEPLETED reset them, so nothing on disk appears older than March 2026. The working record kept in conversations/ covers the final five months in detail; the two years before that are the neural-network era, which survives as designs and results rather than as dated files. Seven distinct eras, each ending because the era's core assumption broke.
NO MODEL PASSED and refused to ship. A seventy-test randomness audit then answered the prior question directly and closed number prediction as an avenue. The remaining question — what a win pays — turned out to have a real, validated, exactly computable answer.03 · The compute wall that turned out not to matter
The project's original ambition was limited by hardware, and several source files carried that limitation in their names. The specifications were sized for machines that were never available. Estimated requirements, as assessed at the time of the port:
| Design | Original specification | Est. VRAM | Realistic hardware |
|---|---|---|---|
| ALG 7 | 1,000 layers × 2,048 neurons | ~16 TB | Impossible as designed — over 4 billion parameters |
| ALG 3 | 10 layers, ~85M neurons/layer | 32 GB+ | A100 80 GB |
| ALG 10–12 | 3D interconnected, 13,884 units | ~3–4 GB | RTX 3060+ |
| ALG 22 | LSTM + hyperparameter search | 2–4 GB | RTX 3060+ |
| ALG 6 | 50 layers × 1,024 neurons | ~2 GB | GTX 1660+ |
| ALG 5 | 4 layers × 10,000 neurons | ~1.5 GB | Any modern GPU |
| ALG 9 | 2 layers × 13,878 neurons | ~1.5 GB | GTX 1660+ |
| ALG 20 | Conv1D + 2,056-unit ensemble | ~1 GB | Any modern GPU |
Every one of these was ported down to a CPU-sized scikit-learn equivalent, and the ported versions ran in about two minutes on a laptop. Then came the finding that retired the entire complaint: an architecture search across the ported family selected the smallest network in the set — two hidden layers of 32 units — as the best performer. With roughly 100 training rows, the small network generalised and the large ones memorised.
The binding constraint was never compute. It was data, and the data was intrinsically uninformative. An A100 would have reached the same conclusion faster and at greater expense. This is worth stating plainly because “if only I had more GPU” is one of the most common and most comfortable explanations for a null result, and here it was measurably false.
04 · What actually worked
Very little, and none of it in the way it was expected to. These are the ideas that survived contact with an honest backtest — several of them survived by being useful engineering rather than useful prediction.
05 · What did not work
Each of these was implemented, measured, and rejected on its own evidence. Several had been reported as successes first.
06 · The bug museum
These are not incidental defects. Each one produced a number that was believed, acted on, and in several cases carried forward across multiple sessions before it was caught. The pattern is worth more than the individual entries: every single one inflated the result rather than deflating it.
- The headline that was two windows. “V23 average 0.825” was quoted as the project's best result for weeks. It was the mean of the last two walk-forward windows out of five. The honest five-window figure was 0.610 — below the version it supposedly beat.
- The 4-of-5 blind hit that was a stale row. A blind prediction scored 4 of 5 plus the Joker. The database had been supplied with an off-by-one final row, so the “future” draw being predicted was already in the training data. Corrected, the same predictions scored 0–1 of 5.
- Frozen random seeds. Seeds 42, 123 and 77 were hard-coded. Every database update produced identical predictions, which read as impressive stability and was actually a dead pipeline. Caught only because the user noticed the same numbers returning.
- Edge-number bias. Numbers 1 and 45 appeared in nearly every backtest prediction. They sit at the ends of the range, so they have neighbours on one side only and escaped a dispersion penalty that applied to everything else.
- Sticky numbers. Six numbers — 5, 37, 29, 10, 12, 28 — occupied the top fifteen at every one of twenty tested states, regardless of what had been drawn. Frequency and recency together were overwhelming every conditional signal.
- The self-flattering backtest. One version tuned and reported on the same short recent slice, compared itself against a remembered figure for the previous version rather than re-running it, blended the Joker into the average as +0.5, and described 19 predictions as 20.
- Silent exception swallowing. The 5/40 walk-forward caught every predictor exception and recorded it as zero hits. A completely broken model would have scored as a merely bad one, and model selection would never have noticed.
- An evaluation loop that never ran. A variable named
tin the rolling-origin evaluator shadowed the loop index, so the function returned empty every time. The metrics printed anyway. - Two versions that were one version. V13 and V14 emitted identical tickets — Platt calibration is a monotone transform and cannot change a ranking. Separately, V15 turned out to be V12 under a new filename.
- Statistical hygiene defects. A Platt calibrator fitted on its own training fold; a Brier score divided by five; a Joker distribution normalised to sum 5 instead of 1; blend weights of 0.3/0.7 in backtest against 0.1/0.9 in production.
- Data-integrity incidents. A database believed to span three years actually covered one. Pre-2024 Joker balls ranged to 45, not 20, silently corrupting 478 rows. A draw was dropped when its successor was appended. An Easter supplementary draw was recorded as a regular one. A
to_excelround-trip destroyed a multi-sheet workbook. A search summary reported a drawn number that two official sources contradicted. - The sweep that was 1,712 hypotheses. A binomial parameter sweep ranked 1,712 configurations on exactly the outcomes it then reported as its test result — and every top configuration emitted the same live ticket, which was a property of the recent window rather than a tunable edge.
- The bin mismatch, found by an external reviewer after publication. In the draw-sum test, observed counts were bucketed with
[lo, hi)while the expected probabilities used(lo, hi]. On integer sums, boundary draws landed in different bins on the two sides of the comparison. Correcting it moved that test to p = 0.0312. Entry thirteen in a list written to argue that this kind of thing is never finished.
07 · The wins, honestly counted
There were real hits. Every ticket below was fixed before its draw. They are recorded here in full, best and worst together, because a results table that only contains the good draws is exactly the failure mode this project exists to document.
| Draw | Game | Ticket | Actual | Hits | Source |
|---|---|---|---|---|---|
| 2026-06-03 | 6/49 | 8-18-19-39-40-46 | 2-6-18-32-39-40 | 3 / 6 | matrix_binomes_ge3 |
| 2026-06-03 | 6/49 | 7-14-18-20-39-46 | 2-6-18-32-39-40 | 2 / 6 | consensus_selector |
| 2026-04-10 | Joker | 5-14-18-28-38 | 5-25-34-38-40 | 2 / 5 | V19.1 |
| 2026-03-08 | Joker | 14-18-23-38-41 + J13 | 16-18-20-24-41 + J10 | 2 / 5 | StatCons v2 (W350 S3) |
| 2026-03-08 | Joker | 7-13-29-37-44 + J10 | 16-18-20-24-41 + J10 | Joker hit | V4 rebalanced |
| 2026-08-06 | 6/49 | 6-18-19-25-39-46 | 5-6-16-25-41-42 | 2 / 6 | external chat |
| 2026-03-21 | Joker | 5-15-18-24-37 + J15 | 8-9-22-33-40 + J15 | 0 / 5, Joker hit | V9 |
| 2026-06-06 | 6/49 | 22-30-39-43-45-46 | 5-14-21-34-40-43 | 1 / 6 | matrix_binomes_ge3 |
| 2026-05-31 | Joker | 7-10-18-28-37 + J15 | 1-9-26-36-43 + J14 | 0 / 5 | V31 A + V19.2 joker |
| 2026-05-27 | all three | 3 tickets | — | 0, 0, 0 | best-by-backtest each |
| 2026-07-12 | 6/49 | 29-32-35-46-47-49 | 9-20-23-24-36-43 | 0 / 6 | evidence-gated fallback |
| 2026-08-02 | 6/49 | 3-33-36-37-43-46 | 12-13-30-32-48-49 | 0 / 6 | evidence-gated fallback |
The 3-of-6 is the best live result the project ever produced, and it came from the simplest model in the repository — strict pair-binomials over three-draw matrices, no frequency term, no machine learning, no tuning. At the time it was taken as validation. Its own backtest reported a ≥3 rate of 4.11%, and the exact probability of 3 or more matches on a random 6/49 ticket is 1.86%. One event at roughly 1-in-50 odds, drawn from dozens of tickets across three games, is precisely what chance looks like.
Two hits happen 13.24% of the time by pure chance. Across the whole ledger the average sits where the mathematics says it must: around 0.735 hits per 6/49 ticket, 0.735 being exactly 36/49.
08 · How the edge was manufactured
An independent audit of the 6/49 stack found that the chronology was clean — no target draw was ever fed to a predictor meant to forecast it. The leakage sat one level up, in model selection, and it was systematic. This is the failure that matters, because it requires no carelessness about time ordering, which is the one everybody is trained to look for.
None of this needed bad intent or sloppy code. It only needed a large model space, a short evaluation window, and the entirely natural habit of reporting the winner without paying for the search.
09 · The honest comparison
Every model was re-run strictly causally over the full history — 2,561 predictions — against the exact hypergeometric expectation of 36/49 = 0.734694 matches per ticket.
| Model | Avg hits | ≥3 rate | Observed ≥3 | Expected | p |
|---|---|---|---|---|---|
| product | 0.7528 | 1.76% | 45 | 47.7 | 0.682 |
| markov | 0.7419 | 1.99% | 51 | 47.7 | 0.343 |
| decade | 0.7376 | 1.87% | 48 | 47.7 | 0.513 |
| binom | 0.7329 | 1.68% | 43 | 47.7 | 0.778 |
| random | 0.7161 | 1.64% | 42 | 47.7 | 0.819 |
The binomial model — the one with the most favourable recent window, the most development effort behind it, and the project's single best live result — scores below chance across the full history. The spread of the whole table is consistent with noise around 0.735.
An evidence-gated selector was then written to make the standard explicit rather than optional: declare a small model family in advance; evaluate strictly causally over 2,365 targets; compare against the exact hypergeometric distribution; Holm-correct across the entire family; require significance on both the full run and the most recent 400 draws, plus improvement in four of five chronological blocks. Its verdict on all nine declared models was Holm p = 1.0000 — NO MODEL PASSED — and it fell back automatically rather than shipping a number it could not defend.
10 · Advanced mathematics, and what it returned
Before accepting a null, it was worth bringing the strongest available structure-detection tools to bear. If instruments this powerful find nothing, the finding is close to definitive. Each was run against a shuffled control of the same data.
| Method | What it would detect | Real | Shuffled |
|---|---|---|---|
| Takens embedding | A low-dimensional dynamical attractor | 2.29 | 2.35 |
| Persistent homology | Topological features above noise | 2.525 | 2.496 |
| Spectral gap | Slow mixing, i.e. memory of prior state | 0.911 | ≈ max |
| Lag-1 recurrence | Overlap beyond the hypergeometric law | 0.611 | 0.556 |
The correlation dimension of the real series is indistinguishable from that of its own shuffle — there is no attractor, the draws fill the space uniformly. Topological feature lifetimes give a real-to-shuffled ratio of 1.011. The transition matrix has eigenvalues λ₁ = 1.0 and λ₂ = 0.089, a spectral gap of 0.911: the system forgets its previous state almost immediately, where a structured process would sit below 0.3. An FFT did surface a periodic component near 2.4 draws with a signal-to-noise ratio of 6.67, which on inspection is the natural oscillation of draw sums — high sum, low sum, high sum — and carries no information about which numbers appear.
Two research programmes were investigated at the suggestion that deep modern mathematics might apply. The Langlands programme — automorphic forms, Galois representations, Shimura varieties — concerns hidden symmetry in arithmetic structures. A lottery draw has no number field, no Galois extension and no L-function to analyse; the connection is philosophical, not technical. Floer homology and gauge theory operate on continuous 3- and 4-manifolds, where a lottery is a finite discrete space with no non-trivial topology. The one genuinely transferable descendant of that world was topological data analysis, which was implemented, run, and returned the null above.
The instructive part
A genetic algorithm given free control over the ten exotic modules drove four of their weights to exactly zero — persistent homology, symbolic dynamics, Tsallis weighting and analogue matching. The optimiser was reporting the same null the diagnostics found, months earlier, in a form nobody read. When a search assigns zero weight to a feature family, that is a measurement, not a tuning artefact.
11 · Asking the prior question
Backtesting a predictor asks a weak and multiplicity-prone question. The prior question is stronger and has one answer: is this draw process distinguishable from a fair 6-of-49 sampler at all?
Seventy heterogeneous tests were run and corrected as a single Holm family — marginal frequency χ² on the full history and on the 2024+ era, per-position uniformity for all six drawn positions, lag-1/2/3 overlap against the hypergeometric law, 49 Wald–Wolfowitz runs tests, gap and waiting-time against the geometric law, draw-sum against an exact enumeration of all C(49,6) subsets, odd-count and low-count against hypergeometric, pair co-occurrence dispersion, first-half against second-half frequencies, and pooled autocorrelation at lags 1, 2, 3 and 7.
Fewer raw hits than chance alone would produce. The borderline KS statistic was checked for direction, because a two-sided p near 0.05 is exactly the kind of result this project had learned to over-read. The deviation runs toward large p-values (one-sided p = 0.027), the signature of conservatism from discreteness and cell pooling. The direction that would indicate real structure gives p = 0.77.
Calibrating the audit against simulated fair histories
External review made the point that the p-values above are analytic, and that several of these statistics cannot have the null distribution the formula assumes — gap observations, pair counts and the 49 per-number indicator series are all mutually dependent inside a draw, and the global KS test inherits that dependence. So the battery was calibrated empirically: 400 complete fair 6-of-49 histories of the same length, each pushed through the identical code. Same review also found a real defect in the draw-sum test, where observed counts were bucketed left-inclusive while the expected probabilities were right-inclusive; that is fixed, and the corrected test moved to p = 0.0312, taking the raw count below 0.05 from two to three of seventy.
The calibration rewrites the interpretation, and not in the direction that flatters the original write-up. On genuinely fair data this battery fires far more often than its nominal level: the median fair history produces nine raw p < 0.05 out of seventy, not the 3.5 the nominal level implies, and more than half of all fair histories contain at least one test that survives Holm correction outright. Measured against that null, the observed history is not merely unremarkable — it is quieter than chance. The borderline KS statistic that needed a directional argument to explain away is simply ordinary: empirical p = 0.177. The verdict stands and stands harder. What does not stand is the precision the original analytic p-values implied.
12 · The signal was never in the draws
The balls are random. The players are not — and in a pari-mutuel game the players are half of the outcome. Categories I, II and III split a fixed pool among everyone holding the winning combination, so what a win pays depends on how many other people chose the same numbers.
That makes the official winner counts a revealed-preference measurement of human number choice, published draw after draw for years, entirely free of the randomness that defeats prediction. The count of category IV winners is high precisely when the drawn numbers happen to be ones players favour.
A harvester was written against the operator's public results archive and recovered 845 draws, 2018-01-04 to 2026-08-06, with per-category winner counts and prize values. Ticket sales were proxied by the category III pool and the proxy was verified against the data: cat3_winners × cat3_value equals exactly one third of the category I contribution on every draw checked, so both are fixed shares of sales and neither is disturbed by a rolled-over jackpot.
Fitted by ridge-penalised Poisson maximum likelihood, coefficients centred for identifiability, sales entering as a log offset. Each βᵢ is the log-scale popularity of number i.
13 · Three independent validations
After sixty versions of being fooled by a flexible model on a flat surface, the burden of proof here was set deliberately high. Three checks, each answering a different objection, each capable of killing the result on its own.
| Check | Objection it answers | Result |
|---|---|---|
| Rolling-origin CV, held-out Poisson deviance | Does it generalise out of sample? | 1,080,301 → 659,282 (−38.97%) |
| Permutation test, numbers shuffled against counts | Is it signal, or just model flexibility? | p ≤ 0.002 (500 shuffles; null mean −15.4%) |
| Temporal split, 2018–2022 vs 2022–2026 | Is it stable enough to act on? | r = 0.890 · 7/10 overlap in least-popular top ten |
| Bootstrap, 400 resamples | How much of this is one lucky sample? | 34 of 49 coefficients exclude zero |
The permutation result matters most. When the association between numbers and counts is destroyed, the fit collapses to well below the null — the improvement is not the model bending to accommodate noise, which is exactly what every earlier “win” in this project turned out to be. The temporal result is what makes the effect usable: an eight-year-stable human habit rather than a moving target.
| Over-picked | β | Under-picked | β |
|---|---|---|---|
| 13 | +0.250 | 46 | −0.183 |
| 27 | +0.242 | 42 | −0.179 |
| 7 | +0.218 | 49 | −0.172 |
| 9 | +0.177 | 43 | −0.166 |
| 10 | +0.158 | 32 | −0.164 |
| 5 | +0.146 | 39 | −0.158 |
A textbook birthday effect: everything above 40 avoided, low numbers and lucky seven crowded. It independently reproduces published findings on the Israeli and UK lotteries — with one local inversion. Here 13 is the single most over-picked number, the opposite of the Western superstition, and a useful reminder that a preference model estimated in another country does not transfer without being re-measured.
What changed when these were made executable
Every figure in the table above is new. The original three validations were reported from a working session; only the cross-validation existed in code, and it used random folds despite being named for blocked CV. Written properly as L649_ev_validation.py — rolling-origin folds that only ever predict forward, 500 permutations, an explicit temporal split, 400 bootstrap resamples, and the ridge penalty selected by CV rather than fixed at 25 by hand — the effect survives, and three of the four published numbers move. Held-out improvement falls from 48.68% to 38.97%: random folds were letting the model peek at its own future, worth about ten points. Temporal correlation falls from 0.924 to 0.890 and the least-popular overlap from 8/10 to 7/10. The permutation test, previously three loose percentages, is now a proper empirical p at the floor of what 500 shuffles can report: the observed 38.97% sits far outside a null whose mean is −15.4% and whose best case is −6.9%.
The bootstrap adds something the original never checked, and it is the most important line here. The direction is solid — 34 of 49 coefficients have intervals excluding zero, and 13, 27 and 7 are unambiguously over-picked. The specific ticket is not: the exact six-number anti-crowd core reappeared in 1 of 400 resamples, with 237 distinct cores across the run. So the strategy replicates and the recommendation does not. Any single ticket presented as optimal is one draw from a very wide distribution of near-equivalent tickets.
14 · Exact combinatorics, not simulation
Under the fitted model a combination is chosen with probability proportional to the product of its numbers' weights. Normalising that over all C(49,6) combinations is the elementary symmetric polynomial e₆(w), computed exactly by the standard dynamic-programming recurrence rather than sampled. Expected rival winners in each category then follow:
Categories I, II and III are evaluated by enumerating every draw consistent with 6, 5 and 4 matches — 1, 258 and 13,545 draws respectively. The inner polynomials over the 43 non-drawn numbers reduce to power sums, so each draw costs constant time. Two unit checks anchor the implementation: the dynamic program matches brute-force enumeration on a reduced pool to thirteen significant figures, and e₆(1,…,1) returns exactly 13,983,816. Category IV pays a fixed amount and is immune to sharing.
15 · What the measurable effect is worth
| Ticket | cat I | cat II | cat III | cat IV | Total EV | vs birthday |
|---|---|---|---|---|---|---|
| 32-39-41-43-46-49 | 3.544 | 0.851 | 0.642 | 0.883 | 5.919 | +20.2% |
| 10-32-38-39-42-43 | 3.527 | 0.659 | 0.553 | 0.883 | 5.621 | +14.2% |
| 03-07-11-17-22-28 | 3.402 | 0.294 | 0.344 | 0.883 | 4.922 | 0.0% |
Stated limits of the preference model:
- It does not improve the probability of winning. Only the conditional value of a win.
- The product form assumes players choose numbers independently. The combination-level penalty for consecutive runs, arithmetic ladders and calendar clustering is literature-derived, not fitted.
- β is estimated from 3-of-6 matches, so its transfer to exact six-number popularity is an extrapolation.
- An all-high ticket is itself a known anti-crowd strategy. The model observes average behaviour and cannot see sophisticated players crowding the same idea.
- The effect is measured on one operator's game in one country. The inverted position of 13 is direct evidence that these coefficients do not travel.
- Ticket volume is estimated from a single draw’s category-IV winner count divided by P(exactly 3 of 6). But the whole preference model says that count depends on which numbers were drawn — so the sales estimate is confounded with the very effect being measured, and rests on one draw. It should come from published sales or the statutory pool split.
- The enumeration is exact; the expected value is not. It inherits estimated popularity coefficients with no reported intervals, an independence assumption between numbers, an unfitted pattern penalty, a Poisson approximation for rival winners, and the ticket-volume estimate above.
- The recommended ticket is not stable. Under 400 bootstrap resamples the exact six-number core reappeared once. Treat any single published combination as an illustration of the strategy, not as the output of it.
- Ticket volume swings between roughly 615,000 and 1,480,000 across the last ten draws when estimated from the category-III pool, so any expected value quoted for one draw inherits that spread.
16 · Why the negative result was the point
The transferable output of this project is not a ticket. It is a calibrated set of practices, each one earned by a specific, documented failure observed on a surface where the right answer was known in advance:
This matters directly to the rest of the KORT-X programme. A framework such as Projective Correlation Theory lives or dies on whether its confirmations survive the same scrutiny, and cosmological data does not come with a known answer at the back of the book. A pipeline that cannot resist manufacturing an edge on a lottery cannot be trusted to report an honest null on anything harder. Every practice above now applies to that work.
17 · Algorithm sources
Every number on this page is derived from the archived code and the validated draw databases, but strict independent reproduction is not yet packaged — see the end of this section for exactly what is missing, with the exceptions named in section 13. The working tree holds forty-one Python modules across the three games, plus superseded versions kept for provenance. Grouped by track:
| Track | Modules | Role |
|---|---|---|
| Randomness audit & EV | L649_randomness_audit.py · L649_harvest_prize_data.py · L649_ev_optimizer.py · L649_evidence_guarded_selector.py | The terminal stage. Seventy-test Holm-corrected audit, the 845-draw prize harvester, the exact expected-value optimiser, and the gate that refuses to ship an unsupported model. |
| 6/49 binomial family | L649_matrix_binomes_ge3_single.py · binom_ge3_sweep.py · L649_matrix_binomes_sumfilter.py · L649_decade_balanced_binom.py · L649_shrunk_binom_v2.py · L649_binom_recalibrated.py · L649_anchor_binom_ticket.py · build_l649_binom_databases.py | Pair binomials over three-draw matrices. Produced the project's best live result and, on full history, scores below chance. |
| 6/49 general & ensemble | l649_model_compare_predict.py · L649_predictor_v2.py · L649_ge3_hunter_v3.py · consensus_selector_649.py · L649_markov_conditional.py · L649_binom_markov_product.py · L649_ensemble_debiased.py · L649_adaptive_companion.py · L649_postmiss_rebalanced.py · compare_all_backtest.py · v6_hybrid 649.py · run_v8_correct.py · run_v8_clean.py · v8_prediction.py | Model comparison, Markov conditioning, weighted-vote consensus and the honest full-history head-to-head that ended the line. |
| Joker — production | JokerPredictor_V19.2.py · V28 · V29 · V29_2 · V30 · V31 · JokerPredictor_SingleTicket.py · JokerPredictor_PairMemory.py · JokerPredictor_DecadeBalanced.py · JokerPredictor_Recalibrated.py | The surviving Joker line: hybrid ML/heuristic scoring, chaos diagnostics, pair memory, and multi-ticket portfolio search. |
| Joker — archive | V16_1 · V18_hybrid · V19 · V19.1 · V20 · V21 · V22 · V23 · V24 · V25 · V27 (Depleted_code/) | Retained deliberately. The filter-first V24 that failed, the ten novelty modules of V23, and the genetic-search checkpoints — kept so the failures stay auditable. |
| Loto 5/40 | FiveDin40Predictor.py · _V2.py · _V3_experiments.py · _V4_calibrated.py | Built on a database that did not exist: 38 draws read directly out of a screenshot. Strict walk-forward with exceptions re-raised after the silent-swallow defect was found. |
| Non-statistical controls | L649_world_state_hash_oracle.py · L649_lunar_world_experiment.py | Deterministic SHA-256 tickets seeded on moon phase, asteroid-mission headlines and world news. Built as a deliberate absurdity; retained because a reproducible arbitrary ticket is a legitimate anti-crowd device and an honest control. |
Alongside the code sit twelve dated session records under conversations/ — the primary source for everything above, including the post-mortems that were wrong at the time. The draw databases are validated on every write: row counts reconciled across CSV and workbook, every row six distinct in-range values, dates ascending, Joker balls in 1–20, and a canonical SHA-256 fingerprint recorded in the prediction ledger. What is still missing before anyone should call this reproducible in the strict sense: a README, a dependency lock, a licence, a tagged release with a DOI, and one command that regenerates every table on this page.
18 · Sources and bibliography
Published literature
- Polin, B. A., Ben Isaac, E., & Aharon, I. (2021). Patterns in manually selected numbers in the Israeli lottery. Judgment and Decision Making, 16(4). — Over 800 million manually selected numbers across 118 draws; establishes that 7 is universally popular and 37 consistently unpopular, and that selection becomes more uniform as the jackpot grows.
- Baker, R. D., & McHale, I. G. (2009). Modelling the probability distribution of prize winnings in the UK National Lottery: consequences of conscious selection. Journal of the Royal Statistical Society Series A, 172(4), 813–834. — The methodological anchor for this work: conscious selection introduces massive overdispersion in winner counts, and players can raise expected return by choosing unpopular combinations.
- D'Hondt, C., Roger, P., Hoffmann, A. O. I., & Plotkina, D. (2024). Is there a gender gap in the birthday-number effect? The case of lotto players and the role of sequential choice. Journal of Gambling Studies, 40(3), 1439–1463. — Recent evidence on the birthday-number effect and how quickly it decays across successive tickets.
- Economics Letters (2025). DOI 10.1016/j.econlet.2025.112519 — consulted on the birthday-number effect in lottery number choice.
Primary data sources
- Official results archive, Loto 6/49 & Noroc — loto.ro
- Official results archive, Joker & Noroc Plus — loto.ro
- Official results archive, Loto 5/40 & Super Noroc — loto.ro
- Official per-draw results PDFs and the published draw schedule — loto.ro — used to resolve a dropped draw and to identify a supplementary Easter draw that had been recorded as a regular one.
- Independent secondary cross-checks — alba24.ro, oficiuldestiri.ro. Every disputed draw was resolved by two independent sources against the search summary, not by the summary.
Methods reviewed and not adopted
- LottoExpert — MCMC over transition matrices. Same family as the Markov models already implemented here; no reported edge over baseline.
- Callam7 / LottoPipeline — github.com/Callam7/LottoPipeline — clustering, decay weighting and Monte Carlo, combined as an ensemble. Structurally identical to the stack already built.
- “Bayes always wins the lottery in Monte Carlo” — theoretical, on Monte Carlo estimation rather than lottery draws; reviewed and found not applicable.
- Pure mathematics consulted and ruled out — the Langlands programme (automorphic forms, Galois representations, Shimura varieties) and Floer homology / gauge theory. Neither has an object to act on in a finite discrete uniform draw; the transferable descendant, topological data analysis, was implemented and returned a null.
A broader literature survey conducted during the project found no published method that statistically beats the random baseline on real lottery draws. The most-cited recent frameworks combine decay-weighted frequency, transition matrices, clustering and Monte Carlo into a single ensemble — precisely the architecture this project had already built and measured. That absence of a positive result in the literature is itself corroborating evidence, and it was available from the start.
19 · Acknowledgements
This was not solo work, and the most useful contributions were almost always the ones that removed a result rather than added one.
Research, AI and responsible-play disclosure
This page documents a statistical case study whose primary result is negative. It is not a betting system, a prediction service, or encouragement to gamble. Lottery draws are random; nothing described here increases the probability of winning, and the expected return on every ticket analysed remains negative. Play only with money you are comfortable losing.
AI assistance was used throughout the analysis and in preparing this write-up, and AI-generated output can contain errors — several are documented above. Figures should be verified against the archived scripts and source databases. Research and correction enquiries: contact@kort-x.com.