Exclusion
Two electrons cannot occupy exactly the same state.
T1 forbids self-transitions mod 3: a state cannot copy itself onto itself. The only allowed doubling is the spin involution, hence the factor 2.
PT chemistry / executable derivation
First robust demonstration
In PT, the table of elements is not an empirical catalogue: its shape follows from a short chain. Spin gives the factor 2, orientations give 1, 3, 5, 7, and capacities become 2, 6, 10, 14. From there, the blocks, periods, and several configuration anomalies fall into place together.
Two electrons cannot occupy exactly the same state.
T1 forbids self-transitions mod 3: a state cannot copy itself onto itself. The only allowed doubling is the spin involution, hence the factor 2.
Each orbital family has a determined number of directions.
For an orbital index ℓ, magnetic values run from -ℓ to +ℓ. This gives 2ℓ+1 discrete positions: 1, 3, 5, 7 for s, p, d, f.
Directions are multiplied by the two spin states.
Each position can host two opposite spins. The capacity is therefore Cap(ℓ)=2(2ℓ+1), directly producing 2, 6, 10, 14.
The table stops at s, p, d, f for an arithmetic reason.
Depth D=2 gives four orbital types, the V4 group. The next step would require 9 or p=11, but 9 is composite and p=11 remains in echo.
The periodic table is familiar, visual, and highly constrained. That is exactly what a theory needs for an early test: PT cannot freely choose the blocks, capacities, or period lengths.
The strength of this page is therefore rigidity: the numbers
2, 6, 10, 14 come from
2(2ℓ+1), the periods
2, 8, 8, 18, 18, 32, 32 come from
L(k)=2⌈k/2⌉², and then
d5/d10 anomalies and the absence of a
g block become secondary tests.
| Step | What is forced | Chemical result |
|---|---|---|
| Orientations | 2ℓ+1 = 1,3,5,7 | s, p, d, f blocks |
| Spin | 2(2ℓ+1) | capacities 2, 6, 10, 14 |
| Depth | s → p → d → f | periods 2, 8, 18, 32 |
| Stabilities | d5 and d10 | Cr, Cu, Pd, Ag, Au... |
This page does not introduce a new nomenclature to memorize. It starts from the usual objects of quantum chemistry and shows how PT turns empirical rules into structural consequences.
| Chemical object | Usual formulation | PT reading |
|---|---|---|
| Pauli | A quantum principle imposed on electrons. | Exclusion derived from T1: the spin involution gives the factor 2. |
| Capacities | Subshells contain 2, 6, 10, or 14 electrons. | Capacity forced by 2(2ℓ+1), with 2ℓ+1 = 1, 3, 5, 7. |
| Madelung | Empirical n+l rule, then n. | Filling order motivated by the decreasing master function of the sieve. |
| Cr, Cu, Pd, Au | Anomalous configurations memorized as exceptions. | d5/d10 informational stabilities of the Z/10Z pentagon. |
| Lanthanides / actinides | Rows separated below the table for readability. | Buried f channel: s -> f -> d -> p when P3 = 7 opens. |
| No g block | Observed absence beyond the known stable domain. | 9 = 3^2 is composite and p=11 remains in echo below threshold. |
The drawing is not a picture of an orbital in space. It is a discrete map of the PT channel: the circle marks the channel, each vertex represents an available orientation, and spin doubles each vertex.
Technical reading: the channels live on the circles
Z/(2P_l)Z. The active primes
3, 5, 7 give the triangle, pentagon, and
heptagon; the s case is the minimal channel,
one orientation doubled by spin.
1 orientation x 2 spins = 2
3 orientations x 2 spins = 6
5 orientations x 2 spins = 10
7 orientations x 2 spins = 14
In the d channel, five orientations form the
Z/10Z pentagon after spin doubling. The
d5 and d10 configurations then become
two special positions: half filling and closure. That is why
Cr, Cu, Mo, Pd, Ag, or Au are not merely exceptions to memorize.
The length of period number $k$ is given by $L(k) = 2\lceil k/2\rceil^2$. It directly produces the observed sequence up to 118 elements.
chapters_fr/ch22_chemistry.tex,
period-length section. PTC implements it in
period(Z) as cap = 2 * k * k with
k = per // 2 + 1.
Blue marks the s opening of each period; green marks the p closure; orange and violet mark the internal d and f channels once the period becomes deep enough.
Periods 2-3 only have the s -> p pattern.
In periods 4-5, depth permits the pentagonal
d channel: capacity 2 x 5 = 10, with
d5 and d10 stabilities driving the
Madelung promotions. In periods 6-7, the heptagonal
f channel is inserted before the return to
d: s -> f -> d -> p, namely
2 + 14 + 10 + 6 = 32.
This buried internal layer is precisely what makes lanthanides
and actinides structurally natural in PT: they are not an
appendix to the table, but the opening of the last active prime
P3 = 7. The next step would require a
g channel, but 2ℓ+1 = 9 is composite
and p = 11 remains an echo prime
(gamma_11 < 1/2).
The same derivation can be read as a succession of closure
configurations: s2, then
s2 p6, then s2 d10 p6, then
s2 f14 d10 p6.
The minimal shell closes only the spin-orbital s channel.
First complete chemical motif: s opening, p closure.
The d pentagon appears between the s opening and the p closure.
The f channel is buried before the d return, then the p closure.
One orientation, two possible spin states.
spin involution derived from T1. The capacity is therefore 2 x 1 = 2.
Three spatial directions, filled by spin pairs.
first active prime P1 = 3. The capacity is therefore 2 x 3 = 6.
Five positions, with half-filled and closed-shell stabilities.
first active prime P2 = 5. The capacity is therefore 2 x 5 = 10.
Seven positions, the last active channel in PT geometry.
first active prime P3 = 7. The capacity is therefore 2 x 7 = 14.
The $s \to d$ promotions appear at the stability points of the pentagon: half filling $d^5$ and closure $d^10$. PTC keeps two readings separate: radial Aufbau filling for shielding, and informational Madelung filling for fine structure.
ptc/periodic.py, _n_fill_aufbau()
remains radial, while n_fill() applies
_MADELUNG_PROMOTIONS. This separation matters:
it prevents spatial geometry and informational stability from
being conflated.
| Element | Aufbau | PT / Madelung | Cause |
|---|---|---|---|
| Cr Z=24 | d4s2 | d5s1 | half filling |
| Cu Z=29 | d9s2 | d10s1 | closure |
| Nb Z=41 | d3s2 | d4s1 | near half filling |
| Mo Z=42 | d4s2 | d5s1 | half filling |
| Ru Z=44 | d6s2 | d7s1 | post half filling |
| Rh Z=45 | d7s2 | d8s1 | post half filling |
| Pd Z=46 | d8s2 | d10s0 | double closure |
| Ag Z=47 | d9s2 | d10s1 | closure |
| Pt Z=78 | d8s2 | d9s1 | near closure |
| Au Z=79 | d9s2 | d10s1 | closure |
| Rg Z=111 | d9s2 | d10s1 | relativistic closure |
The calculator follows the logic of periodic.py:
it converts an atomic number into period, block, capacity,
radial Aufbau filling, and PT/Madelung filling.
Useful example: enter Z=79. Gold moves from
d9s2 to d10s1 because closure of the
d channel compensates the cost of the s -> d promotion.
recovers the period from L(k) = 2 ceil(k/2)^2
PT_PROJECTS/PTC/ptc/periodic.py:13
assigns the s, p, d, or f block from the position in the period
PT_PROJECTS/PTC/ptc/periodic.py:31
returns 2, 6, 10, or 14 from 2(2ℓ+1)
PT_PROJECTS/PTC/ptc/periodic.py:115
adds the d5/d10 informational promotions
PT_PROJECTS/PTC/ptc/periodic.py:75
cd PT_PROJECTS/PTC
PYTHONPATH=. python -m pytest ptc/tests/test_periodic.py -v The assertions cover period boundaries, s/p/d/f blocks, capacities 2/6/10/14, Aufbau fillings, and the Cr, Cu, Mo, Pd, Ag, and Au promotions.
periodic.py public/scripts-source/ptc/periodic.py · 185 lines · copy bundled with the site and embedded into the HTML at build time.
This file is the operational translation of the derivation:
periods by 2k², s/p/d/f blocks,
capacities 2, 6, 10, 14, and an explicit separation
between radial Aufbau filling and informational Madelung promotions.
The raw copy is also served as a static file at
/scripts-source/ptc/periodic.py.
"""
Periodic table structure functions.
Derived from PT first principles: period boundaries follow 2k² shells
where k = per // 2 + 1 (prime-indexed shells P1=3, P2=5, P3=7).
Zero adjustable parameters.
"""
from ptc.constants import P1, P2, P3
_BLOCK_MAP = {0: 's', 1: 'p', 2: 'd', 3: 'f'}
_CAP_MAP = {0: 2, 1: 2 * P1, 2: 2 * P2, 3: 2 * P3} # 2, 6, 10, 14
def period(Z: int) -> int:
"""Return the period number for atomic number Z."""
cumul, per = 0, 1
while True:
k = per // 2 + 1
cap = 2 * k * k
if Z <= cumul + cap:
return per
cumul += cap
per += 1
def period_start(per: int) -> int:
"""Return the first Z of period per."""
z0 = 1
for p in range(1, per):
k = p // 2 + 1
z0 += 2 * k * k
return z0
def l_of(Z: int) -> int:
"""Angular momentum of the valence sub-shell: s=0, p=1, d=2, f=3."""
per = period(Z)
z0 = period_start(per)
pos = Z - z0
if pos < 2:
return 0
if per <= 3:
return 1
if per <= 5:
return 2 if pos < 12 else 1
if pos == 2:
return 2
if pos < 16:
return 3
if pos < 26:
return 2
return 1
def _n_fill_aufbau(Z: int) -> int:
"""Number of electrons in the valence sub-shell (Aufbau, no promotions).
This is the RADIAL filling — used for screening (geometric γ₅ decay).
The screening is a spatial phenomenon and follows the standard Aufbau
ordering regardless of Madelung promotions.
"""
per = period(Z)
z0 = period_start(per)
pos = Z - z0
l = l_of(Z)
if l == 0:
return min(pos + 1, 2)
cap = 2 * (per // 2 + 1) ** 2
if l == 1:
return Z - (z0 + cap - 6) + 1
if l == 2:
nd = max(0, pos + 1 - 2)
if per >= 6:
nd = max(0, nd - 14)
return min(nd, 2 * P2)
if l == 3:
return min(max(0, pos + 1 - 2), 2 * P3)
return 1
# ── Madelung anomalies: PT predictions from the pentagon ──────────────
# d5 = half-fill = D_KL maximum on Z/10Z (persistence peak)
# d10 = closure = H minimum on Z/10Z (entropy floor)
# These are INFORMATIONAL, not radial — the polygon structure demands them.
# Z → (nd_madelung, ns_madelung) for elements with s→d promotions
_MADELUNG_PROMOTIONS: dict[int, tuple[int, int]] = {
24: (5, 1), # Cr: d4s2 → d5s1 (half-fill)
29: (10, 1), # Cu: d9s2 → d10s1 (closure)
41: (4, 1), # Nb: d3s2 → d4s1 (quasi-half)
42: (5, 1), # Mo: d4s2 → d5s1 (half-fill)
44: (7, 1), # Ru: d6s2 → d7s1 (post-half)
45: (8, 1), # Rh: d7s2 → d8s1 (post-half)
46: (10, 0), # Pd: d8s2 → d10s0 (double closure)
47: (10, 1), # Ag: d9s2 → d10s1 (closure)
78: (9, 1), # Pt: d8s2 → d9s1 (quasi-closure)
79: (10, 1), # Au: d9s2 → d10s1 (closure)
111: (10, 1), # Rg: d9s2 → d10s1 (closure, relativistic)
}
def n_fill(Z: int) -> int:
"""Number of electrons in the valence sub-shell (Madelung).
Returns the INFORMATIONAL filling — includes d5/d10 promotions
predicted by the pentagon Z/(2×5)Z structure. Used for polygon
construction (structure fine = harmonique).
For screening (radial, geometric), use _n_fill_aufbau().
"""
if Z in _MADELUNG_PROMOTIONS and l_of(Z) == 2:
return _MADELUNG_PROMOTIONS[Z][0]
return _n_fill_aufbau(Z)
def ns_config(Z: int) -> int:
"""Number of s-electrons, detecting s→d promotions.
In PT: promotion occurs when Hund half-filling stability or d-shell
closure exceeds the s→d promotion cost (gap decreases with period).
Uses _n_fill_aufbau for the detection logic (avoids recursion with
the Madelung n_fill).
"""
if Z in _MADELUNG_PROMOTIONS and l_of(Z) == 2:
return _MADELUNG_PROMOTIONS[Z][1]
l = l_of(Z)
if l == 0:
return min(_n_fill_aufbau(Z), 2)
if l != 2:
return 2
return 2
def block_of(Z: int) -> str:
"""Return the block letter ('s', 'p', 'd', or 'f') for element Z."""
return _BLOCK_MAP[l_of(Z)]
def capacity(Z: int) -> int:
"""Return the capacity (2(2l+1)) of the valence sub-shell for element Z."""
return _CAP_MAP[l_of(Z)]
def _np_of(Z: int) -> int:
"""Number of p-electrons for element Z.
Returns the valence p-electron count:
s-block (l=0): 0 — no p-electrons
p-block (l=1): n_fill(Z) — the p sub-shell filling
d-block (l=2): 0 — d-block bonds through s+d, not p
f-block (l=3): 0 — same logic
"""
l = l_of(Z)
if l == 1:
return min(n_fill(Z), _CAP_MAP[1])
return 0
def _nd_of(Z: int) -> int:
"""Number of d-electrons for element Z.
Returns the d sub-shell filling only for d-block (l=2).
s-block, p-block, and f-block return 0.
"""
if l_of(Z) != 2:
return 0
return min(n_fill(Z), 2 * P2)
def _valence_electrons(Z: int) -> int:
"""Total valence electrons."""
return n_fill(Z) + ns_config(Z)
def _lp_pairs(Z: int, bo: float) -> int:
"""Lone pairs available for bonding."""
l = l_of(Z)
if l == 0:
return 0
np_val = _np_of(Z)
P1 = 3
if np_val <= P1:
return 0
return max(0, np_val - P1 - int(bo - 1))
Exclusion, subshell capacities, four blocks, and absence of a g shell.
Period lengths and Aufbau order from the master function.
PTC implementation and unit tests for the periodic functions.
Structure beyond Z=118 without a g block, to be checked against future data.
| Level | Claim | Remaining checks |
|---|---|---|
| derived | s/p/d/f blocks, capacities 2/6/10/14, lengths 2/8/8/18/18/32/32. | Recheck the C1/table proof and no-g status in the monograph. |
| code | PTC implementation in periodic.py and associated unit tests. | Keep the public copy synchronized with the PTC engine. |
| chemistry | d5/d10 promotions as informational stabilities of the d channel. | Quantify promotion costs and relativistic effects element by element. |
| frontier | No active g block: 9 is composite and p=11 remains in echo. | Compare with superheavy models and future data beyond 118. |
Local sources: PT_MONOGRAPHY/chapters_fr/ch22_chemistry.tex,
PT_PROJECTS/PTC/ptc/periodic.py,
PT_PROJECTS/PTC/ptc/tests/test_periodic.py.