# Positron emission
## Microsim
### Live player
<div class="microsim-player">
<iframe src="https://editor.p5js.org/sciencenibber/full/KkNndB-n5" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe>
</div>
<div class="microsim-fallback">
<img src="Microsims/thumbs/Positron_emission.png" alt="Positron_emission microsim poster" style="width:100%;border:1px solid #4445;border-radius:6px;">
<p><em>Live microsim (desktop) · <a href="https://editor.p5js.org/sciencenibber/sketches/KkNndB-n5">open sketch in the p5.js editor</a></em></p>
</div>
**Editor URL:** https://editor.p5js.org/sciencenibber/sketches/KkNndB-n5
**Description (100 words):**
This microsim shows beta-plus decay as a population of proton-rich parent nuclei (yellow-green dots) drawn over a dark cloud-chamber field. Pick an isotope from the dropdown — C-11, N-13, O-15, F-18, Ga-68, or Custom — and each parent runs an independent exponential clock with the matching [[Half-life|half-life]]. When a clock fires, the dot fades to a green daughter nucleus and a red positron streaks outward; after a brief drift it annihilates with a nearby electron, emitting two back-to-back yellow gamma rays. The right panel scrolls a measured N(t) curve over the theoretical N0 · exp(−λt), an activity gauge, and the live (Z, A) → (Z−1, A) line. Sliders below tune T_1/2, sim speed, and N0; reset re-seeds the field.
```js
// =======================================================================
// Positron_emission.js
// =======================================================================
// ARTICLE : Positron_emission
// PATTERN : Pattern E reskin -- Decay clocks and half-life (Nuclear)
// PURPOSE : Visualize beta-plus (positron) decay of a population of
// proton-rich nuclei. Each parent atom carries an independent
// exponential clock with half-life T_1/2; on decay, a positron
// is emitted, drifts a few millimetres, then annihilates with
// a nearby electron, producing two back-to-back 511 keV gamma
// rays. The chart of the nuclides shifts the daughter
// down-and-left (Z -> Z - 1, A unchanged).
//
// PARAMETERS:
// isotope -- presets for C-11, N-13, O-15, F-18, Ga-68, plus a
// free-choice slider for arbitrary half-lives.
// speedSlider -- simulation rate multiplier (sim seconds per real s).
// nSlider -- initial population N0 of parent nuclei (50..600).
//
// PHYSICS:
// Decay law: N(t) = N0 * exp(-lambda * t), lambda = ln 2 / T_1/2
// Per-frame prob: p_decay = 1 - exp(-lambda * dt_sim)
// (the linear lambda*dt approximation breaks for short
// half-lives -- see pitfalls.md, "Stochastic time
// stepping").
// Annihilation: e+ + e- -> gamma + gamma (each 511 keV, back-to-
// back in the e+ rest
// frame).
//
// HUD:
// top-left : title and en.wikitube.io URL
// top-right : control hints
// bottom-left : live readouts (N, A, gammas)
// bottom-right : canonical decay equation (ASCII transliteration --
// Unicode-in-string-literal pitfall, see pitfalls.md
// "Unicode in template literals breaks the editor").
// =======================================================================
const ARTICLE = "Positron_emission";
p5.disableFriendlyErrors = true;
// -- Nuclear palette (per P5_JS_EDITOR.md section 5) ---------------------
const BG = [ 8, 16, 28];
const FG = 240;
const FUEL = [180, 200, 80]; // proton-rich parent (unstable)
const NEUTRON = [240, 240, 255]; // (unused here; kept for parity)
const FISSION = [220, 110, 60]; // (unused here)
const DECAY = [255, 80, 80]; // positron (e+) tracer color
const STABLE = [ 80, 200, 140]; // daughter nucleus (post-decay)
const STRUCT = [120, 130, 150]; // gridlines / readouts
const GAMMA = [255, 230, 120]; // 511 keV annihilation photons
// -- Isotope presets (half-life in seconds) ------------------------------
// Choices are the workhorse PET tracers plus a custom slider option.
const ISOTOPES = [
{ name: "C-11", T12: 1224.0, dZ: 1, parent: "C-11", daughter: "B-11" },
{ name: "N-13", T12: 597.9, dZ: 1, parent: "N-13", daughter: "C-13" },
{ name: "O-15", T12: 122.24,dZ: 1, parent: "O-15", daughter: "N-15" },
{ name: "F-18", T12: 6586.2, dZ: 1, parent: "F-18", daughter: "O-18" },
{ name: "Ga-68", T12: 4062.6, dZ: 1, parent: "Ga-68", daughter: "Zn-68" },
{ name: "Custom", T12: 120.0, dZ: 1, parent: "X", daughter: "Y" }
];
// -- Simulation state ----------------------------------------------------
let nuclei = []; // {x, y, alive, decayedAt}
let positrons = []; // {x, y, vx, vy, t, alive}
let gammas = []; // {x, y, vx, vy, life}
let history = []; // N(t) samples for the strip-chart
let isotopeSelect, halfLifeSlider, speedSlider, nSlider, resetBtn;
let totalGammas = 0;
let simTime = 0;
// -- Layout constants ----------------------------------------------------
const PAD = 24; // outer padding
const PANEL_W = 320; // right diagnostic panel width
const CTRL_BAND = 110; // bottom band reserved for sliders+labels
let field; // {x, y, w, h} -- the cloud-chamber region
// =======================================================================
function setup() {
createCanvas(windowWidth, windowHeight);
textFont("monospace");
textAlign(LEFT, TOP);
layout();
// dropdown for the isotope preset
isotopeSelect = createSelect();
for (const iso of ISOTOPES) isotopeSelect.option(iso.name);
isotopeSelect.selected("F-18");
isotopeSelect.position(PAD, height - CTRL_BAND + 12);
isotopeSelect.size(120);
isotopeSelect.changed(onIsotopeChange);
// half-life slider (log-scaled in seed/loop) -- for the Custom preset
halfLifeSlider = createSlider(1, 10000, 6586, 1);
halfLifeSlider.position(PAD + 140, height - CTRL_BAND + 12);
halfLifeSlider.size(220);
// sim speed multiplier (so the reader doesn't wait minutes for F-18)
speedSlider = createSlider(1, 200, 60, 1);
speedSlider.position(PAD + 140, height - CTRL_BAND + 44);
speedSlider.size(220);
// initial population
nSlider = createSlider(50, 600, 240, 10);
nSlider.position(PAD + 140, height - CTRL_BAND + 76);
nSlider.size(220);
resetBtn = createButton("reset");
resetBtn.position(PAD + 380, height - CTRL_BAND + 12);
resetBtn.mousePressed(seed);
seed();
}
function layout() {
field = {
x: PAD,
y: PAD + 36,
w: max(200, width - PANEL_W - 3 * PAD),
h: max(200, height - CTRL_BAND - 2 * PAD - 36)
};
}
// -- Initial population layout: a Poisson-disc-ish jittered grid --------
function seed() {
const N0 = nSlider ? nSlider.value() : 240;
nuclei = [];
positrons = [];
gammas = [];
history = [];
totalGammas = 0;
simTime = 0;
for (let i = 0; i < N0; i++) {
nuclei.push({
x: random(field.x + 8, field.x + field.w - 8),
y: random(field.y + 8, field.y + field.h - 8),
alive: true,
decayedAt: -1
});
}
}
function onIsotopeChange() {
// when the user picks a preset, snap the half-life slider to it.
const iso = ISOTOPES.find(i => i.name === isotopeSelect.value());
if (iso && iso.name !== "Custom") {
halfLifeSlider.value(round(iso.T12));
}
seed();
}
// =======================================================================
function draw() {
// -- read parameters once at the top of draw() -----------------------
const isoName = isotopeSelect.value();
const iso = ISOTOPES.find(i => i.name === isoName) || ISOTOPES[5];
const T12 = iso.name === "Custom" ? halfLifeSlider.value() : iso.T12;
const speed = speedSlider.value(); // sim seconds per real s
const dtReal = min(deltaTime / 1000, 0.05); // cap real-time step
const dtSim = dtReal * speed; // simulation step
simTime += dtSim;
const lambda = log(2) / T12; // decay constant (1/s)
const pDecay = 1 - exp(-lambda * dtSim); // exponential, NOT linear
background(BG);
// -- decay sweep over parents ---------------------------------------
let decaysThisFrame = 0;
for (const n of nuclei) {
if (!n.alive) continue;
if (random() < pDecay) {
n.alive = false;
n.decayedAt = simTime;
decaysThisFrame++;
// emit a positron with random direction; positron drifts a short
// distance before annihilating with a nearby electron.
const ang = random(TWO_PI);
positrons.push({
x: n.x, y: n.y,
vx: cos(ang) * 35, vy: sin(ang) * 35,
t: 0, alive: true
});
}
}
// -- propagate positrons; on annihilation emit two back-to-back gammas
for (const p of positrons) {
if (!p.alive) continue;
p.x += p.vx * dtReal;
p.y += p.vy * dtReal;
p.t += dtReal;
if (p.t > 0.4) {
// annihilation event: two 511 keV gammas in opposite directions
p.alive = false;
const ang = random(TWO_PI);
const vx = cos(ang) * 280, vy = sin(ang) * 280;
gammas.push({ x: p.x, y: p.y, vx: vx, vy: vy, life: 1.0 });
gammas.push({ x: p.x, y: p.y, vx: -vx, vy: -vy, life: 1.0 });
totalGammas += 2;
}
}
// -- propagate gammas (decoration; they fade and are culled) --------
for (const g of gammas) {
g.x += g.vx * dtReal;
g.y += g.vy * dtReal;
g.life -= dtReal * 1.6;
}
// garbage collect every ~2 seconds to keep arrays bounded
if (frameCount % 120 === 0) {
positrons = positrons.filter(p => p.alive);
gammas = gammas.filter(g => g.life > 0);
}
// -- record N(t) sample (parents still alive) -----------------------
const aliveCount = nuclei.reduce((s, n) => s + (n.alive ? 1 : 0), 0);
history.push({ t: simTime, N: aliveCount });
if (history.length > 400) history.shift();
// -- draw cloud-chamber field background and frame ------------------
noStroke(); fill(20, 30, 40);
rect(field.x, field.y, field.w, field.h);
// parent / daughter dots
noStroke();
for (const n of nuclei) {
if (n.alive) {
fill(...FUEL, 220);
circle(n.x, n.y, 6);
} else {
// daughter: smaller, cooler color, a fading halo while "fresh"
const age = simTime - n.decayedAt;
const halo = constrain(1.0 - age * 0.6, 0, 1);
if (halo > 0) {
fill(...STABLE, 60 * halo);
circle(n.x, n.y, 14 - 8 * (1 - halo));
}
fill(...STABLE, 200);
circle(n.x, n.y, 4);
}
}
// positron tracers
for (const p of positrons) {
if (!p.alive) continue;
stroke(...DECAY, 220);
strokeWeight(1.5);
line(p.x - p.vx * 0.05, p.y - p.vy * 0.05, p.x, p.y);
noStroke();
fill(...DECAY, 240);
circle(p.x, p.y, 4);
}
// gamma rays as fading line segments
for (const g of gammas) {
if (g.life <= 0) continue;
const a = 255 * g.life;
stroke(...GAMMA, a);
strokeWeight(1.2);
line(g.x - g.vx * 0.02, g.y - g.vy * 0.02, g.x, g.y);
}
noStroke();
// -- right-side diagnostics panel -----------------------------------
drawPanel(iso, T12, lambda, aliveCount, decaysThisFrame, dtSim);
// -- HUD blocks -----------------------------------------------------
drawHud(iso, T12, lambda, aliveCount);
}
// -----------------------------------------------------------------------
function drawPanel(iso, T12, lambda, aliveCount, decaysThisFrame, dtSim) {
const px = width - PANEL_W - PAD;
const py = PAD + 36;
const pw = PANEL_W;
const ph = field.h;
noStroke();
fill(20, 30, 40); rect(px, py, pw, ph);
fill(...STRUCT, 80); rect(px, py, pw, 2);
// strip-chart: N(t) versus t
const chartX = px + 12, chartY = py + 28;
const chartW = pw - 24, chartH = 140;
noFill();
stroke(...STRUCT, 120);
strokeWeight(1);
rect(chartX, chartY, chartW, chartH);
// axis ticks: 0, N0
const N0 = nSlider.value();
textSize(10);
noStroke();
fill(...STRUCT);
text("N", chartX - 10, chartY - 2);
text("0", chartX - 10, chartY + chartH - 10);
text("N0", chartX - 14, chartY - 2);
// theoretical exponential overlay
if (history.length > 1) {
const tStart = history[0].t;
const tEnd = history[history.length - 1].t;
stroke(...FUEL, 100);
strokeWeight(1);
noFill();
beginShape();
for (let i = 0; i <= 80; i++) {
const t = lerp(tStart, tEnd, i / 80);
const Ntheor = N0 * exp(-lambda * (t - tStart));
const xx = chartX + (i / 80) * chartW;
const yy = chartY + chartH * (1 - Ntheor / N0);
vertex(xx, yy);
}
endShape();
// measured stochastic curve
stroke(...DECAY, 220);
strokeWeight(1.5);
noFill();
beginShape();
for (let i = 0; i < history.length; i++) {
const h = history[i];
const xx = chartX + ((h.t - tStart) / max(0.001, (tEnd - tStart))) * chartW;
const yy = chartY + chartH * (1 - h.N / N0);
vertex(xx, yy);
}
endShape();
}
noStroke();
fill(...DECAY); textSize(11);
text("measured N(t)", chartX, chartY + chartH + 6);
fill(...FUEL);
text("theoretical N0 * exp(-lambda*t)", chartX, chartY + chartH + 20);
// activity gauge
const gaugeY = chartY + chartH + 56;
fill(...STRUCT);
textSize(11);
text("activity (decays / s)", chartX, gaugeY);
// smoothed activity = decaysThisFrame / dtSim, clamped + log-ish display
const A = dtSim > 1e-6 ? decaysThisFrame / dtSim : 0;
const Amax = max(1, lambda * N0);
const frac = constrain(A / Amax, 0, 1);
fill(20, 30, 40);
rect(chartX, gaugeY + 16, chartW, 14);
fill(...DECAY, 220);
rect(chartX, gaugeY + 16, chartW * frac, 14);
fill(...STRUCT);
text("A = " + nf(A, 1, 1) + " ( max ~ " + nf(Amax, 1, 1) + " )",
chartX, gaugeY + 36);
// isotope info block
const infoY = gaugeY + 60;
fill(...FG);
textSize(13);
text("isotope: " + iso.name, chartX, infoY);
textSize(11);
fill(...STRUCT);
text("parent : " + iso.parent, chartX, infoY + 20);
text("daughter: " + iso.daughter + " ( Z -> Z - 1 )", chartX, infoY + 36);
text("T_1/2 : " + formatTime(T12), chartX, infoY + 52);
text("lambda : " + nf(lambda, 1, 4) + " s^-1", chartX, infoY + 68);
text("annihilation gammas: " + totalGammas, chartX, infoY + 88);
}
// -----------------------------------------------------------------------
function drawHud(iso, T12, lambda, aliveCount) {
// top-left title bar
noStroke();
fill(0, 200);
rect(8, 8, 420, 26);
fill(255);
textSize(13);
textAlign(LEFT, TOP);
text(ARTICLE + " - en.wikitube.io/wiki/" + ARTICLE, 16, 14);
// top-right control hints
const hintLines = [
"isotope: dropdown half-life: slider",
"speed: slider N0: slider [reset]"
];
textAlign(RIGHT, TOP);
fill(...STRUCT);
textSize(11);
for (let i = 0; i < hintLines.length; i++) {
text(hintLines[i], width - 16, 14 + i * 14);
}
// bottom-left live readouts (sit ABOVE the slider band)
textAlign(LEFT, TOP);
const rx = PAD;
const ry = height - CTRL_BAND - 56;
fill(...FG);
textSize(12);
text("N(t) = " + aliveCount + " / " + nSlider.value(), rx, ry);
text("sim t = " + formatTime(simTime), rx, ry + 16);
text("positrons in flight: " +
positrons.filter(p => p.alive).length, rx, ry + 32);
// labels for the slider rows themselves
textSize(11);
fill(...STRUCT);
text("isotope", rx, height - CTRL_BAND - 4);
text("T_1/2 (s)", rx + 140 - 100, height - CTRL_BAND + 14);
text("speed x", rx + 140 - 100, height - CTRL_BAND + 46);
text("N0", rx + 140 - 100, height - CTRL_BAND + 78);
// bottom-right canonical decay equation (ASCII transliteration)
textAlign(RIGHT, TOP);
const eqx = width - PAD;
const eqy = height - CTRL_BAND - 56;
fill(...FUEL);
textSize(12);
text("decay : (Z, A) X -> (Z-1, A) Y + e+ + nu_e", eqx, eqy);
fill(...DECAY);
text("annihl : e+ + e- -> gamma + gamma ( 2 x 511 keV )",
eqx, eqy + 16);
fill(...STRUCT);
text("law : N(t) = N0 * exp( - lambda * t ), lambda = ln 2 / T_1/2",
eqx, eqy + 32);
}
// -----------------------------------------------------------------------
function formatTime(seconds) {
// smart-formats half-lives in their natural unit.
if (seconds < 1e-9) return nf(seconds * 1e12, 1, 2) + " ps";
if (seconds < 1e-6) return nf(seconds * 1e9 , 1, 2) + " ns";
if (seconds < 1e-3) return nf(seconds * 1e6 , 1, 2) + " us";
if (seconds < 1) return nf(seconds * 1e3 , 1, 2) + " ms";
if (seconds < 60) return nf(seconds, 1, 2) + " s";
if (seconds < 3600) return nf(seconds / 60, 1, 2) + " min";
if (seconds < 86400) return nf(seconds / 3600, 1, 2) + " hr";
if (seconds < 86400 * 365.25) return nf(seconds / 86400, 1, 2) + " d";
return nf(seconds / (86400 * 365.25), 1, 2) + " yr";
}
// -----------------------------------------------------------------------
function windowResized() {
resizeCanvas(windowWidth, windowHeight);
layout();
// re-anchor controls to the resized window bottom
if (isotopeSelect) {
isotopeSelect.position(PAD, height - CTRL_BAND + 12);
halfLifeSlider.position(PAD + 140, height - CTRL_BAND + 12);
speedSlider.position (PAD + 140, height - CTRL_BAND + 44);
nSlider.position (PAD + 140, height - CTRL_BAND + 76);
resetBtn.position (PAD + 380, height - CTRL_BAND + 12);
}
}
```
## Links (Wikipedia order)
<!-- injected from _registry/childlinks/Positron_emission.json (2026-07-30T02:09:12Z) -->
`(n-p)_reaction` · `Aage_Bohr` · `Ab_initio_methods_(nuclear_physics)` · `Alexandru_Proca` · [[Alpha_decay]] · [[Alpha_particle]] · `Alpha_process` · `Aluminium-26` · `Atomic_nucleus` · `Atomic_number` · [[Beta_decay]] · `Beta_particle` · `Big_Bang_nucleosynthesis` · [[Boron]] · `Borromean_nucleus` · `Branching_fraction` · `CNO_cycle` · `Carbon-burning_process` · `Carl_David_Anderson` · `Clinton_Davisson` · `Cluster_decay` · `Copper-64` · `Cosmic_ray` · `Cosmic_ray_spallation` · `Cosmogenic_nuclide` · [[Decay_chain]] · `Decay_energy` · [[Decay_product]] · `Deuterium_fusion` · `Double_beta_decay` · `Double_electron_capture` · `Down_quark` · `Edward_Mills_Purcell` · `Edward_Teller` · `Electron_capture` · `Electron_neutrino` · `Electronvolt` · `Enrico_Fermi` · `Ernest_Lawrence` · `Ernest_Rutherford` · `Ernest_Walton` · `Eugene_Wigner` · `Even_and_odd_atomic_nuclei` · `Fluorine-18` · `Frederick_Soddy` · `Fritz_Strassmann` · `Frédéric_Joliot-Curie` · `Gamma_ray` · `Halo_nucleus` · `Hans_Bethe` · `Henri_Becquerel` · `High-energy_nuclear_physics` · `If_and_only_if` · `Interacting_boson_model` · `Internal_conversion` · `Irène_Joliot-Curie` · `Island_of_stability` · `Isobar_(nuclide)` · `Isotone` · `Isotope` · `Isotopes_of_iodine` · `Isotopes_of_oxygen` · `Isotopes_of_sodium` · `J._Hans_D._Jensen` · `J._J._Thomson` · `J._Robert_Oppenheimer` · `James_Chadwick` · `John_Cockcroft` · `Large_Hadron_Collider` · `Lise_Meitner` · `Lithium_burning` · `Luis_Walter_Alvarez` · `Magic_number_(physics)` · `Marie_Curie` · `Mark_Oliphant` · `Mass_number` · `Mirror_nuclei` · `Neon-burning_process` · `Neutrino` · `Neutrinoless_double_beta_decay` · [[Neutron]] · `Neutron_capture` · `Neutron_emission` · `Neutron_number` · `Niels_Bohr` · `Nuclear_astrophysics` · `Nuclear_binding_energy` · `Nuclear_drip_line` · `Nuclear_fission` · `Nuclear_fission_product` · `Nuclear_force` · [[Nuclear_fusion]] · `Nuclear_isomer` · `Nuclear_matter` · `Nuclear_physics` · `Nuclear_reaction` · `Nuclear_shell_model` · `Nuclear_structure` · `Nuclear_transmutation` · `Nucleon` · `Nucleon_pair_breaking_in_fission` · [[Nucleosynthesis]] · `Nuclide` · `Otto_Hahn` · `Oxygen-burning_process` · `P-process` · `Particle_physics` · `Patrick_Blackett` · `Photodisintegration` · `Photofission` · `Pierre_Curie` · [[Polonium]] · `Positron` · `Positron_emission_tomography` · `Potassium-40` · `Primordial_nuclide` · [[Proton]] · `Proton_capture` · `Proton_decay` · `Proton_emission` · `Proton–proton_chain` · `Quark` · `Quark–gluon_plasma` · `R-process` · [[Radioactive_decay]] · `Radiogenic_nuclide` · `Radionuclide` · `Relativistic_Heavy_Ion_Collider` · `Rp-process` · `S-process` · `Semi-empirical_mass_formula` · `Silicon-burning_process` · `Spallation` · [[Spontaneous_fission]] · `Stable_nuclide` · `Stellar_nucleosynthesis` · `Supernova_nucleosynthesis` · `Synthetic_element` · `Triple-alpha_process` · `Up_quark` · `Valley_of_stability` · `Weak_interaction` · `Władysław_Świątecki_(physicist)`
## From the Real GENERATIVE library

*Positron emission — placed from the Real G.E.N.E.R.A.T.I.V.E. course library (Nuclear room). Source: Wikimedia Commons (via Wikipedia article media). [Details & license](https://commons.wikimedia.org/wiki/File:NuclearReaction.svg).*
> Positron emission, beta plus decay, or β+ decay is a subtype of radioactive decay called beta decay, in which a proton inside a radionuclide nucleus is converted into a neutron while releasing a positron and an electron neutrino (νe).[1] Positron emission is mediated by the weak force. The positron is a type of beta particle (β+), the other beta particle bei ([Wikipedia](https://en.wikipedia.org/wiki/Positron_emission))
<!-- REAL-GENERATIVE-MEDIA:END -->
<!-- LOCAL-MEDIA-PASS:START -->
## From the vault media library
!Positron emission thumb.png
*Positron Emission — from the vault's own media holdings, placed 2026-07-09. MTN / Wikitube.io original · CC BY-SA 4.0.*
<!-- LOCAL-MEDIA-PASS:END -->
> **Room:** Nuclear · **Status:** ✅ shipped
## Overview
Positron emission, also called beta-plus decay (β⁺), is a [[Radioactive_decay|radioactive decay]] mode in which a [[Proton|proton]] inside a proton-rich nucleus is converted into a [[Neutron|neutron]], ejecting a positron (the antimatter counterpart of an [[Electron|electron]]) and an electron neutrino. The process can only occur when the parent atom's mass exceeds the daughter atom's mass by at least the [[Energy|energy]] of two electron masses, roughly 1.022 MeV, because the daughter is left one proton lighter and the freed positron carries away the matching positive charge. The atomic number Z drops by one while the mass number A stays fixed, shifting the nucleus down-and-left on the chart of the nuclides toward the valley of stability. Iconic positron emitters include carbon-11, nitrogen-13, oxygen-15, fluorine-18, and gallium-68, each engineered for short-lived diagnostic use in positron-emission tomography (PET): the emitted positron annihilates with a nearby electron almost immediately, producing two back-to-back 511 keV gamma rays that PET scanners detect in coincidence to reconstruct three-dimensional images of metabolic activity. Each isotope obeys a strictly exponential decay law N(t) = N₀ exp(−λt) with λ = ln 2 / T₁⸍₂, the same statistical clock that governs every radioactive species.
## See also
- Room hub: Nuclear
- p5.js Editor conventions: P5 JS EDITOR
- Wiki root: MAIN
---
*Scaffolded by `generative-microsim` from row 0 of the Nuclear sheet on 2026-04-30T08:52:30Z.*
Letters: exponential · mined_electron · probability · clock_time · filter · measurement · energy · iteration
<!-- REAL-GENERATIVE-MEDIA:START -->
<!-- CRAFT-LINK:START g12 -->
*Built to the [[WT!P5_js_Microsim_Master_Class|p5.js Master Class]].*
<!-- CRAFT-LINK:END -->
## Wikipedia : Wikitube
**Strict pair:** [Wikipedia](https://en.wikipedia.org/wiki/Positron_emission) : [Wikitube](https://en.wikitube.io/wiki/Positron_emission)
## Previous hub tags
Tree parent: [[Oxygen]].
Legacy hubs: `GENERATIVE`.
---
*Sources: 1 legacy note. Minted wave 1, 2026-07-30 (v1.6 order).*