Roger Mendoza

Academic Theory · working paper

Take the Theorem, Test the Claim

Findings, falsifications and corrections from a LoRa mesh carrier layer, a three-coil field experiment and a stock-squeeze scanner — written up as a working paper.

Abstract

Hobby-scale engineering attracts unusual ideas — 3-6-9 numerology, vortex mathematics, Rodin coils, golden ratios, "smart money" options flow. This paper reports what happened when such ideas were treated as hypotheses rather than dismissed or believed, across three of my projects. The method is a verdict ladder (ADOPT, QUEUE, NULL, FIXED) where every verdict needs a committed script or a hardware run. Several results survived and became design: nine symbols placed on a sphere instead of a circle gain 4.55 dB at no cost; a tilt of arccos(1/√3) makes a three-coil fixture isotropic; the golden angle gives a closed-form constellation for any size, with an advantage that grows without bound; and a LoRa carrier that reports its effective rather than nominal rate predicted twelve of twelve real round-trip times. Several did not: nine is not mathematically special (every prime square shares its structure), the vortex doubling map cannot be a rotation of any spherical constellation, mod-9 residues leak at most 2.58 bits of a discrete logarithm, and correct elementary number theory does not support the physical claims attached to it. In the market work, a thin baseline edge (profit factor 1.11 over 2,633 trades) survived, two intuitive filters did not, and an 80% "lab" win rate turned out to be produced by an outcome-defined label and peak-price exits. An audit of the process itself found that 74% of 113 research findings had been promoted and none of the 44 ADOPTs had changed code — the most useful finding of all.

Keywords: research method, falsification, LoRa, Reticulum, sphere packing, Tammes problem, modular arithmetic, vortex mathematics, backtesting, look-ahead bias

Introduction

Three projects sit behind this paper. Dictyon-net began as a decentralized LoRa mesh stack and became a carrier layer for the Reticulum network stack: it models the physical media Reticulum does not — legally enforced airtime budgets, media that must be dialled before they exist, media that can only listen — and reports honest arithmetic for all of them. Ternary-Six9 is a bench experiment: three phase-driven coils, a three-axis magnetometer and a hierarchical 3/6/9/12 addressing concept. The 3WT squeeze scanner ranks small- and mid-cap stocks by volatility compression and feeds the GammaJuice signals product.

All three attracted ideas from outside the engineering mainstream: the significance of 3, 6 and 9; vortex-math digital roots; the Rodin coil; golden-ratio spirals; options-flow "smart money". The usual responses are to ignore such ideas or to adopt them on enthusiasm. Both waste the one thing they are good for — a precise, testable question. This paper records what happened when each idea was given exactly one honest test.

The organising principle came out of the work itself and is worth stating up front:

Rigorous mathematics often arrives in mystical packaging. Take the theorem; test the claim.

Method

Every lead was placed on a verdict ladder and kept in a public research ledger, including — especially — the dead ones.

VerdictMeaning
ADOPTChanged the project. Measured, and the change was made.
QUEUEReal, but deferred, with the reason written down.
NULLTested and does not apply, with the reason. A NULL is a deliverable, not a failure.
FIXEDA live defect found and closed, with regression tests.

Leads climb rungs: from "named" through "mechanism stated" and "computed" to "run on hardware" or "reproduced by a committed script". A verdict at rung 5 or above must cite a script or a log that anyone can re-run. Three further rules did most of the work:

  1. State the claim so it can fail. "Three-phase geometry is better" cannot be tested; "nine symbols on this fixture have a larger minimum distance than eight on a dial" can.
  2. Change one thing at a time against a recorded baseline. Alternate A/B runs so slow drift cannot masquerade as an effect.
  3. Corrections are owed in both directions. When a later finding showed an earlier one had misread a source, the correction was recorded with the same prominence as the original claim.

What survived

The nine was never the problem — the circle was

The Ternary-Six9 brief proposed mapping two trits (nine states) to phase angles 40° apart — a nine-point dial. On a circle that is a poor trade: 9-PSK buys 5.7% more bits than 8-PSK for 0.98 dB, which under a duty cycle costs 1.31× the airtime, a net loss of 19%.

Airtime needed to recover lost link budget1.0 dB lost1.32×1.9 dB lost1.69×3.0 dB lost2.3×10 dB lost16×
One LoRa spreading-factor step buys ~2.5 dB and costs exactly 2× the airtime, so airtime = 2^(dB / 2.5). Insertion loss is the first number to ask any RF part for. Source: finding 110.

But the fixture is not a circle. Three independently driven coils read by a three-axis magnetometer produce a three-dimensional vector. The right question is therefore the Tammes problem: where do N points go on a sphere to maximise their minimum separation?

Minimum separation between N symbols: circle vs sphere4 symbols90.0°109.5°8 symbols45.0°74.9°9 symbols40.0°70.5°12 symbols30.0°63.4°
on a circle (phase dial)on a sphere (Tammes optimum)
Same symbols, same hardware, same power. Nine points on a sphere sit 70.5° apart versus 40° on a circle: a +4.55 dB gain in minimum distance. Source: dictyon-net finding 116.
Efficiency relative to 8-PSK8-PSK baseline8-PSK (circle)1.00×9-PSK (circle)0.81×12-PSK (circle)0.44×9 symbols on a sphere2.84×
On a circle, nine states lose 19% to eight once the airtime to recover the lost margin is paid. On a sphere the same nine are 2.84× as efficient. Source: finding 116.

The same nine symbols, on the same hardware, at the same power, gain +4.55 dB in minimum distance — about 1.8 LoRa spreading-factor steps, the largest single gain recorded anywhere in the project. Against 8-PSK, efficiency moves from 0.81× to 2.84×. ADOPT

One angle makes the coil sphere isotropic

The printed spherical fixture placed its three coil planes at a tilt of 33.434°, giving magnetic axes 57° apart. Their singular values (1.445, 0.675, 0.675) mean the fixture is 3.42 dB weak in its worst direction — three quarters of the sphere's gain handed back to geometry. Axis separation becomes 90° when cos t = 1/√3:

plane_tilt = 54.735610317   # arccos(1/sqrt 3): the tetrahedral / NMR "magic angle"
singular values -> (1, 1, 1)   # mutually orthogonal, perfectly isotropic
Worst-direction gain vs coil-plane tilt33.43° (as printed)1.13 dB45.00°3.30 dB54.74° (magic angle)4.55 dB70.00°0.00 dB
At the printed tilt the coil axes are 57° apart and the fixture keeps only 1.13 dB in its weakest direction. At arccos(1/√3) the axes are orthogonal and keeps all 4.55. Source: finding 117.

Crucially, the brief itself separated geometry from electrical phase, so the 0/123/246° drive schedule under test is untouched; the orthogonal sphere is simply a cleaner instrument. The flat three-coil PVC baseline, by contrast, is rank-2 — one direction is unreachable at any current — so it cannot do vector work at all. ADOPT for the magic angle; NULL for the flat fixture.

The golden angle is the closed form, and the advantage is unbounded

Tammes optima are tabulated only to about N = 14 and require an optimiser per N. A phyllotaxis paper in the project's reading pile supplied what firmware actually needs: the golden angle, 137.5077°, places N points near-optimally on a sphere by formula, about 1 dB below optimal at N = 9 (62.0° vs 70.5°) but defined for every N.

Sphere advantage grows with constellation sizeN = 93.56 dBN = 328.89 dBN = 12814.91 dB
A circle's spacing falls as 1/N; a sphere's as 1/√N, so the gap is unbounded. Nine was the smallest interesting case, not the best one. Source: finding 121.

The general law behind the single +4.55 dB number: a circle's spacing falls as 1/N, a sphere's as 1/√N. Nine symbols was the smallest interesting case, not the best one. ADOPT

The same brief warned against collapsing a (3, 6, 9, 12)-weighted tuple

Distinct values from 81 four-trit tuples81 = no collisionspositional 27·a + 9·b + 3·c + d81weighted 3a + 6b + 9c + 12d21equal a + b + c + d9
Every weight in (3, 6, 9, 12) is a multiple of 3, so every sum is too: 60 of 81 tuples collide. The brief's warning was fully right. Source: finding 121.

to the sum 3a + 6b + 9c + 12d. That warning was fully right: every weight is a multiple of 3, so 81 tuples map to only 21 distinct sums (60 collisions); positional weights 27, 9, 3, 1 give 81 distinct values.

Honest arithmetic: report the effective rate, not the label

A LoRa link at SF12/125 kHz has a nominal bitrate of 183 bps. Once the preamble is paid for, the rate actually delivered is 115 bps — 37% lower. An interface that reports the nominal figure makes the stack above it pace the slowest link in the world as if it were half again faster.

Nominal vs effective LoRa bitrateSF12 / 125 kHz183 bps115 bps
nominal (what interfaces report)effective (preamble paid)
The slowest link in the world is 37% slower than its label. A stack pacing on the nominal figure overruns it. Source: dictyon-net README.

Dictyon-net's carriers report exact airtime (Semtech AN1200.22) and enforce duty cycle with a token bucket that refuses transmission rather than trusting the operator. On real hardware — two Heltec V3 boards running RNode firmware at 914.875 MHz — Reticulum adopted the carrier's limits: MTU 222 (not its own 500) and 10.19 kbps effective against 10.94 nominal.

The first real-air run also measured something the airtime formula does not contain

Airtime vs measured overhead per frameANNOUNCE, 214 B169 ms149 mshandshake init, 86 B77 ms127 mshandshake resp, 88 B77 ms116 ms
airtime (formula)USB + firmware + host overhead (measured)
A USB-attached RNode adds about 117 ms per frame that the airtime formula doesn't contain — more than the airtime itself at SF7. Source: finding 125.

: a USB-attached RNode adds 117 ms per frame — 1.5× the airtime itself at SF7. With that one number, the round trip for a signed probe was predicted before the run: airtime(131 B) + airtime(83 B) + 2 × 117 ms = 416 ms, range 374–480.

Round-trip times: predicted vs observedpredicted 416 ms374480observed mean 437 ms
Twelve signed Reticulum probes over two Heltec V3 radios (dots) against a range predicted from airtime plus measured per-frame overhead (shaded) before the run. 12 of 12 landed inside. Source: dictyon-net finding 127.

Observed: mean 437 ms, sd 17, n = 12, 12 of 12 inside the predicted range, with byte counters mirroring exactly in both directions. Nothing was fitted. ADOPT

A bug that would have been found as a phone bill

Route ranking compared paths by (hops, −quality, −last_seen). That is correct while every carrier is free. Once a demand-dialled telephone carrier existed, a one-hop phone route beat a two-hop LoRa route — so a node with a phone line would have dialled rather than use a free relay. The bug passes every test: it produces a working network that makes calls it did not need to make.

The fix ranks a route class ahead of hop count

Cost of dialling per message vs batchingV.34, cold568×V.92, warm337×V.32bis, poor line298×
27.0 s of dial, ring, training and teardown versus 47.6 ms appended to a call already up. Batching is arithmetic, not policy. Source: finding 123.

(local direct → local mesh → IP → demand-dial → long-haul → store-and-wait). The arithmetic that makes it matter: a 200-byte message alone in its own V.34 call costs 27.0 s of dial, train and teardown; appended to a call already up, 47.6 ms — a factor of 568×. Batching is therefore forced by arithmetic, not a policy preference, and the dial trigger must be a deadline (oldest message age), never a queue depth. FIXED

What did not survive

Each of the following was tested once, honestly, and retired with its reason.

ClaimTestVerdict
Nine is mathematically distinguishedThe mirror law, period law and Latin-square property hold for every modulus; the "three tiers" belong to every prime squareNULL
The vortex doubling map (1→2→4→8→7→5) is a physical rotation of nine pointsIts cycle type (6, 2, 1) would put three points on a rotation axis; a line meets a sphere in twoNULL, proven
{3, 6, 9} is a physically distinguished set in oscillationA square-wave transmitter emits odd harmonics 1, 3, 5, 7, 9 … — 6 is not among themNULL, falsified
Mod-9 residues crack discrete logarithmsThey reveal x mod ord(N): at most 2.58 bits; the instinct is Pohlig–Hellman, which safe primes defeatNULL
The recurrence of 3 in the codebase is meaningfulA dozen unrelated constants, each with its own documented reason — a selection effectNULL
Schumann resonance (7.83 Hz) as a carrierReal physics; the antenna length and data rate are infeasibleNULL
Fibonacci (Zeckendorf) varints resynchronise betterLEB128 already self-synchronises; Zeckendorf resyncs worse (p95 5.62 B vs 4.75 B) for 16% more bitsNULL
Golden-ratio / low-discrepancy jitter spreads rebroadcastsA shared step freezes relative phase, so an unlucky pair collides forever: 26× more starvationNULL
Fountain codes make announces cheaper11× more transmissions than deduplicated flooding on a duty-cycled linkNULL

Nine is not special; p² is

Long-cycle length of the doubling map, mod p²mod 9 (3²)6mod 25 (5²)20mod 121 (11²)110
9 → [6, 2, 1], 25 → [20, 4, 1], 121 → [110, 10, 1]. The famous three tiers (long cycle, short cycle, fixed point) appear for every prime square, not just nine. Source: finding 119.

The Rodin-torus arithmetic in R. P. Blake's appendix checks out exhaustively — and Blake himself notes that "decimal parity" is the modulo operator in different clothing. Every observation is a standard fact about the integers mod n. The celebrated structure of nine (a long cycle, a short cycle, a fixed point under doubling) is what any prime square does: 25 gives [20, 4, 1] and 121 gives [110, 10, 1]. Nine is unremarkable in its family and is reachable at all only because we write numbers in base ten.

Bits of a secret exponent revealed by Nˣ mod mmod 9, N = 71.58 bitsmod 9, N = 22.58 bitsmod 25, N = 24.32 bitsmod 121, N = 26.78 bits
Knowing Nˣ mod m reveals x mod ord(N): a few bits. A 2048-bit discrete log needs about 2048. The instinct is Pohlig–Hellman, which safe primes defeat. Source: finding 120.

The same package carries a claim that a correctly built coil would produce energy without fuel. Nothing in the arithmetic supports it, Blake's paper does not make it, and the package itself states that "the effects of a really well constructed Rodin Coil remain untested." The finding is not that the mathematics is wrong — it is careful and correct — but that correct elementary number theory is being carried as evidence for a physical claim it does not touch.

A correction owed

An earlier draft framed "nine is not special, p² is" as a correction to the owner's own vortex-math workbook. It was not: that 54-sheet workbook already pairs every base b with mod (b − 1) and tabulates base = p² + 1 for 36 primes. The workbook had generalised past nine first. The argument stands against material that presents nine as distinguished, and the record was corrected — getting this the wrong way round is exactly the failure mode a ledger exists to prevent.

Markets: the squeeze scanner

The 3WT scanner looks for "three-week-tight" consolidation and Bollinger-inside-Keltner squeezes across roughly 3,700 small, mid and micro-cap tickers, then attaches LEAP and short-dated options candidates. The research question was simple: is there an edge, and do the filters that sound smart improve it?

A thin baseline edge

Over 2,633 historical signals with a 10% stop, 20% target and 14-day maximum hold, the stock-level backtest produced a 44.8% win rate, +0.44% average per trade and a profit factor of 1.11. That is a small edge before costs, and costs were not verified as modelled. It is worth exactly what it says and no more. QUEUE pending out-of-sample and cost-inclusive runs.

How 2,633 baseline trades endedmax hold (14 days)1,243stop loss (−10%)926take profit (+20%)363end of data101
Most trades simply timed out. Only 14% reached the profit target. Source: 3wt-scanner backtest results.

Filters that sounded smart

Profit factor by filter (stock-level backtests)break-even (1.0)Baseline, 2,633 trades1.11Without bullish flow, 1,4971.29With bullish flow, 1111.16No options data, 1,0250.91MTF filter + 3% stop, 1120.65
Adding the options-flow filter did not improve on trades without it, and the multi-timeframe filter with a tight stop lost money outright. Source: 3wt-scanner result files.
  • Bullish options flow. Trades with two or more bullish flow signals (n = 111) returned a profit factor of 1.15; trades without (n = 1,497) returned 1.29. The "smart money" filter did not add edge here. The clearest split was elsewhere: tickers with no options data at all (n = 1,025) lost money (PF 0.91) — a liquidity effect, not a flow effect. NULL for flow as a filter; the liquidity split is the lead worth keeping.
  • Multi-timeframe confirmation with a 3% stop. 112 trades, 22% win rate, profit factor 0.65; 83 of 112 exits were the stop. On small caps a 3% stop is inside ordinary daily noise. NULL

The 80% win rate that wasn't

A separate "lab" dataset behind a dashboard reported an 80% win rate and a +1,609% return for signals labelled as squeezes with momentum, and 79% for the squeeze label alone. Reading the code that generated it found two problems, either of which is sufficient:

  1. The label was defined by the outcome. A trade counted as a "squeeze" if the price later broke out or rose at least 20%. Splitting results by that label and observing that the squeeze group won is circular.
  2. Held trades were credited at their peak. The options model used the maximum high reached during the 60-day window as the gain for any trade not stopped out — a price no one could have known to sell at. Time decay was charged at 0.003 percentage points per day, which is effectively zero for a LEAP.
Win rate: lab options model vs stock-level backtestLab: squeeze label ✓79.3%Lab: all signals55.6%Stock backtest: all trades44.8%
The lab's 'squeeze' group was labelled using the outcome itself, and held trades were credited at their peak price. The honest stock-level number is the bottom bar.

The honest number is the stock-level 44.8%. The lab figure measures the backtest, not the market. This is the classic shape of backtest overfitting described by Bailey et al. [7]: the more freedom a simulation has to choose its labels and exits after the fact, the better it looks and the less it means. NULL for the lab figure; the dashboard number should not be quoted.

The "academic overlay"

The live scanner now blends its raw score with cross-sectional momentum (12-1 and 6-3 month), short-term reversal and an SPY market-regime term, weighted 0.55 / 0.30 / 0.15 plus a regime modifier. It is implemented and principled; it is not yet validated against the baseline above. QUEUE

Nothing in this section is investment advice. It is a record of how a backtest can mislead its own author.

Auditing the process itself

The most useful finding was about the research, not the radios. After a burst in which many findings landed in two days, the whole corpus of 113 findings was audited against its own rules.

Verdicts across 113 research findingsADOPT44QUEUE40NULL21OPEN2unparsed6
74% promoted, 19% killed, and not one lead died at the first two rungs. The audit then found the 44 ADOPTs had changed zero lines of code. Source: finding 115.
  • The filter did not run. 74% of leads were promoted and 19% killed; not one died at rung 1 or 2. A ladder on which nothing falls off the bottom rungs is not a ladder.
  • 44 ADOPTs changed zero lines of code. git diff over the burst touched only research and measurement folders. By the ledger's own definition — ADOPT means "changed the project" — the correct count was zero.
  • 40 of 101 measurement scripts did not run in a clean checkout: 34 imported an optional library unguarded and 4 contained absolute paths from the machine that wrote them. A number nobody else can regenerate is an assertion with a filename attached.
  • Fourteen findings re-derived earlier ones, several saying so themselves.

The audit's corrections were applied, and the fourteen re-derivations were reclassified as NULL as independent results. The audit itself is the one ADOPT from that burst that unambiguously changed how the project works.

Discussion

Three patterns repeat across all three projects.

The packaging is not the content. Tammes packing, the magic angle, the golden-angle spiral and Pohlig–Hellman are all rigorous, well-known results. Each arrived here inside a claim that was much larger than the mathematics could carry. Taking the theorem and dropping the claim produced the largest engineering gains in the project.

Honest arithmetic compounds. Reporting effective rather than nominal rate, measuring the 117 ms nobody had counted, and pricing a phone call per session rather than per byte each looked pedantic in isolation. Together they produced a carrier whose behaviour could be predicted before it was measured.

The method needs auditing too. Volume of findings is not evidence of progress. The audit that found 44 ADOPTs with no code behind them was worth more than any individual ADOPT.

Limitations

  • Radio results come from two boards about 30 cm apart on one host. Range, loss and multi-hop behaviour on real RF are not yet measured.
  • The sphere-constellation gains are geometric (minimum distance). Noise, coupling and drive imperfections in the physical fixture will reduce them; the coil experiments are at the fixture stage.
  • Market backtests cover small/mid/micro caps over a limited window. Transaction costs, slippage and survivorship in the ticker universe were not verified as modelled.
  • Many findings remain simulations; the ledger marks which are which.

Reproducibility

Dictyon-net findings are numbered and each cites its measurement script and, for hardware runs, the raw log: sphere constellation (116), coil axis conditioning (117), mod-9 controller (118), Rodin/Blake audit (119), vortex workbook (120), golden-angle constellation (121), demand-dial batching (123), route-class bug (124), first packet across real air (125), Reticulum over a dictyon carrier (126), two Reticulum nodes (127) and the research audit (115). Scanner results come from the repository's backtest result files. The charts on this page are drawn directly from those numbers.

References

  1. P. M. L. Tammes, "On the origin of number and arrangement of the places of exit on the surface of pollen-grains," Recueil des Travaux Botaniques Néerlandais, 27, 1930.
  2. Semtech Corporation, AN1200.22 — LoRa Modulation Basics, application note.
  3. S. Pohlig and M. Hellman, "An improved algorithm for computing logarithms over GF(p) and its cryptographic significance," IEEE Transactions on Information Theory, 24(1), 1978.
  4. H. Vogel, "A better way to construct the sunflower head," Mathematical Biosciences, 44(3–4), 1979.
  5. M. Bor, U. Roedig, T. Voigt and J. Alonso, "Do LoRa Low-Power Wide-Area Networks Scale?" Proc. ACM MSWiM, 2016.
  6. M. Qvist, Reticulum Network Stack and Reticulum Manual.
  7. D. H. Bailey, J. M. Borwein, M. López de Prado and Q. J. Zhu, "Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance," Notices of the AMS, 61(5), 2014.
  8. R. P. Blake, Rodin-coil mathematics appendix, in an endorsements and papers compilation (author's own statement of limits quoted above).