Light quanta · Sections 1–2

Give every resonator its share, and the total never stops growing.

If every resonator gets the same mean energy whatever its frequency, how much energy does the radiation hold, and does the total ever stop growing? §1 gives every linear resonator oscillation the same mean energy, whatever its frequency. Widen the range of resonator frequencies you allow, and see what that classical allocation actually predicts, and why the paper says it rules out any equilibrium between matter and radiation.

Classical mode-energy allocation

Classical mode-energy allocation

Static worked example

Predict before the numbers

Widening the resonator range from 100 THz to 1000 THz changes the energy by how much?

Three relations the model could have

The result appears when you choose, say you have one in mind, or skip.

Experiment settings temperature, cutoff and probe frequencies

Worked example: with resonators up to 1 × 10¹⁴ Hz at 1500 K, the classical allocation holds 0.00644 J per cubic metre, and widening the cutoff tenfold multiplies it by 1000.

Mean energy per resonator oscillation2.070974 × 10−20 J
Energy with resonators up to the cutoff0.006439187 J/m³
Share of that energy above the probe frequency0.9990000
Energy after widening the cutoff tenfold6.439187 J/m³
Ratio: tenfold-widened energy ÷ current energy1000

With resonators up to 1.000 × 1014 Hz at 1500 K, the classical allocation holds 0.006439 J per cubic meter; each tenfold widening multiplies it by 1000. Every resonator oscillation carries the same mean energy kBT (source notation (R/N)T), which §1 notes is two-thirds of a free molecule's mean kinetic energy.

§2's Avogadro match and §4's later entropy argument (a separate instrument) use two disjoint limits of the same spectrum: the classical region, admitted at the 1% criterion for x ≤ 0.0198678, and the Wien region, admitted at x ≥ 4.60517. Meeting both arguments does not mean one "quantum regime" supplied both numbers.

The historical Avogadro readout, from Einstein's §2 constants
N, from Einstein's printed §2 constants (historical)6.170486 × 1023 mol⁻¹
N, as printed in §26.17 × 1023 mol⁻¹
NA, defined, 2019 SI (modern)6.02214076 × 1023 mol⁻¹
Hydrogen-atom mass from the printed N (historical)1.62 × 10−24 g
Hydrogen-atom mass, modern (labeled modern)1.673533 × 10−24 g

α is a suspected historical typographical correction (10⁻⁵⁷, not the witness's 10⁻⁵⁶); R = 8.31×10⁷ erg mol⁻¹ K⁻¹ and L = 3×10¹⁰ cm s⁻¹ are declared editorial inputs, not printed values, since §2 does not appear to print either. This readout is never mixed with a modern constant in the same number.

Not modeled: The mechanism coupling matter and radiation beyond Planck's stated equilibrium condition; Cavity shape and walls; The approach to equilibrium; Any quantum hypothesis; Measured spectra (a separate instrument shows those).

Show which functions computed these numbers

src/physics/reference/radiation/classical.ts (classicalCutoffEnergyDensity, classicalTotalEnergy, meanResonatorEnergy), src/physics/reference/radiation/avogadro.ts (avogadroFromPlanckConstants), src/physics/reference/radiation/spectra.ts (regimeRelativeErrors), and src/experiments/lq02/session.ts (which gathers these results for the page; this component never recomputes any of them).

If every way a resonator can vibrate gets the same share of energy, the energy of the radiation grows without limit as higher and higher frequencies are allowed. Einstein notes that on this picture matter and light could never settle into a definite share of the energy.

Section 1 puts a gas, free electrons and resonators, electrons bound to fixed points, in a box with mirror walls. Collisions give each resonator's vibration along one line a mean energy Ē = (R/N)T, the same at every frequency; at 1500 K that is 2.07 × 10−20 J. Planck's relation between a resonator and the radiation around it, Ēν = (L3/8πν2)ρν, then fixes the density: ρν = (R/N)(8πν2/L3)T. The energy per unit volume up to a highest frequency νc is (8πkBT/3c3)νc3, which at 1500 K is 0.00644 J/m3 up to 1014 Hz, and 99.9 percent of it lies above 1013 Hz. Allow frequencies ten times higher and the energy grows a thousandfold, to 6.44 J/m3; allow them all and there is no finite total, which the instrument reports as a refusal rather than a number. Einstein concludes that the relation disagrees with experience and that on this picture there can be no definite distribution of energy between the ether and matter. Section 2 then shows that Planck's formula, which fits experience, agrees with this law at long wavelengths, and that matching the two gives N = 6.17 × 1023.

Modern qualifications

Einstein wrote Ē for the resonator's mean energy, L for the speed of light and ρν for the density, and he gave the result no name; the name it later carried in textbooks is Ehrenfest's, from 1911. Rayleigh had given a density growing as ν2T for long waves in June 1900, and Jeans corrected its coefficient in July 1905, after this paper was received. Planck had derived the resonator relation in 1900 by treating the radiation as the most disordered process conceivable, which is how Einstein cites it; Einstein uses it without Planck's energy elements. The value N = 6.17 × 1023 is Planck's own. The exponent of α as the edition reads the plate, 10−56, would give a tenth of that N; the constants that give 6.17 × 1023 need 10−57, and the provenance record leaves the printed digit to a second witness.

Show the code

The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.

meanResonatorEnergy · src/physics/reference/radiation/classical.ts · this site’s source, as built · sha256:8e2de4a307208c7d7d1db091948f7f506dcb965f85b6b13bb6d9eea35664fd47

This function computes the listed outputs when it runs.

In words

The classical equipartition result, returned in joules and in electronvolts, with the ratio to a free molecule's average kinetic energy beside it. At 300 K it is 4.141947 times 10^-21 J, which is 0.025852 eV. The function takes the Boltzmann constant from the declared set rather than a literal, so a historical set gives Einstein's printed R over N instead.

Implementation

/** Mean resonator energy E_bar = k_B * T = (R/N) * T. */
export function meanResonatorEnergy(
  T: number,
  set: ConstantSet,
): Readonly<{
  status: "value";
  quantityId: "meanResonatorEnergy";
  unit: "J";
  value: number;
  valueEv: number;
  linearRepresentable: true;
  ratioToFreeMoleculeKineticEnergy: number;
}> {
  const kB = thermalConstant(set).value;
  const energyJoules = kB * T;
  const energyEv = energyJoules / JOULES_PER_EV;

  return {
    status: "value",
    quantityId: "meanResonatorEnergy",
    unit: "J",
    value: energyJoules,
    valueEv: energyEv,
    linearRepresentable: true,
    ratioToFreeMoleculeKineticEnergy: 2 / 3, // E_bar / (3/2 * k_B * T) = 2/3
  };
}

The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.

classicalCutoffEnergyDensity · src/physics/reference/radiation/classical.ts · this site’s source, as built · sha256:30fafb7552580daad6a33f3b2a92743fa440291109a59225b8d52c85a7502397

This function computes the listed outputs when it runs.

In words

U = (8 pi k_B T / 3 c^3) times the cube of the cutoff frequency, which is the Rayleigh-Jeans density integrated from zero up to that cutoff. At a cutoff of 10^15 Hz and 5800 K it returns 24.898 J/m^3. Doubling the cutoff multiplies it by eight, and that is the whole of the difficulty: there is no frequency at which the classical allocation stops adding energy.

Implementation

/** Classical cutoff energy density U(nu_c) = (8 * pi * k_B * T / (3 * c^3)) * nu_c^3 in J m^-3. */
export function classicalCutoffEnergyDensity(
  nuCutoff: CyclicFrequency | number,
  T: number,
  set: ConstantSet,
): RadiationResult<number> {
  const quantityId = "radiationEnergy";
  const unit = "J/m^3";
  if (!Number.isFinite(nuCutoff) || nuCutoff === Number.POSITIVE_INFINITY) {
    return {
      status: "outside-domain",
      quantityId,
      unit,
      condition: "classical-total-diverges",
      domainKind: "physical",
      reason:
        "The classical allocation assigns unbounded total energy; an infinite cutoff diverges.",
    };
  }
  if (nuCutoff <= 0) {
    return {
      status: "outside-domain",
      quantityId,
      unit,
      condition: "nonpositive-cutoff-frequency",
      domainKind: "physical",
      reason: `Cutoff frequency must be positive and finite (got ${nuCutoff}).`,
    };
  }
  if (!Number.isFinite(T) || T <= 0) {
    return {
      status: "outside-domain",
      quantityId,
      unit,
      condition: "nonpositive-temperature",
      domainKind: "physical",
      reason: `Temperature must be positive and finite (got ${T}).`,
    };
  }

  const c = constantValue(set, "speedOfLight").value;
  const kB = thermalConstant(set).value;

  // U(nu_c) = (8 * pi * k_B * T / (3 * c^3)) * nu_c^3
  const uCutoff = ((8 * Math.PI * kB * T) / (3 * c ** 3)) * nuCutoff ** 3;

  // The allocation grows as the cube of the cutoff without bound, so a large enough cutoff or
  // temperature carries the product past the floating-point range (the cube alone leaves it above
  // a cutoff of about 5.6 x 10^102 Hz). That is a limit of the arithmetic, not a value: returned as
  // one, it printed "Infinity J/m³" on lq-02 with a NaN share beside it.
  if (!Number.isFinite(uCutoff)) {
    return {
      status: "outside-domain",
      quantityId,
      unit,
      condition: "energy-beyond-number-range",
      domainKind: "numerical",
      reason:
        "At this cutoff the classical energy is larger than this calculation can represent. It grows as the cube of the cutoff without bound.",
    };
  }

  return {
    status: "value",
    quantityId,
    unit,
    value: uCutoff,
    linearRepresentable: true,
  };
}

The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.

classicalTotalEnergy · src/physics/reference/radiation/classical.ts · this site’s source, as built · sha256:3ce397f29778d8b35371d97d40d6278b47c6c19bca6bf7ecc7132745953540bb

This function computes the listed outputs when it runs.

In words

Integrating the classical density from zero to infinity gives no finite answer, because the density rises as the square of the frequency and never turns over. So this function computes nothing. It returns an outside-domain result whose reason is that the classical allocation assigns unbounded total energy, and it does that for every temperature.

Implementation

/** Classical total energy integral over [0, infinity] diverges. */
export function classicalTotalEnergy(_T: number, _set: ConstantSet): RadiationResult<number> {
  return {
    status: "outside-domain",
    quantityId: "radiationEnergy",
    unit: "J/m^3",
    condition: "classical-total-diverges",
    domainKind: "physical",
    reason: "the classical allocation assigns unbounded total energy",
  };
}

The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.

avogadroFromPlanckConstants · src/physics/reference/radiation/avogadro.ts · this site’s source, as built · sha256:df0de169bcc51df201761940d1cede359d1b87afa7a55ee78c6cc2e5968526c3

This function computes the listed outputs when it runs.

In words

N = (beta / alpha) times 8 pi R / L^3, with alpha and beta the two constants of Wien's law as Planck had fitted them, R the gas constant and L the speed of light. Run on the 1905 CGS inputs it returns 6.170486250063268 times 10^23, against the 6.17 times 10^23 Einstein printed and 6.02214076 times 10^23 in the modern definition: high by 2.5 per cent. It returns both the unrounded value and the printed one, and it derives the hydrogen atom mass and R over N from the PRINTED N, so that the page's numbers and the paper's numbers agree digit for digit.

Implementation

export function avogadroFromPlanckConstants(set?: ConstantSet): AvogadroReadout {
  // If no set or modern set is passed, compute with standard historical 1905 CGS inputs or set entries
  let alpha = 6.1e-57;
  let beta = 4.866e-11;
  let R_cgs = 8.31e7;
  let L_cgs = 3e10;

  let alphaStatus = "printed-corrected";
  let alphaReason = "Corrected witness exponent from 10^-56 to 10^-57.";
  let rStatus = "editorial-input";
  let rReason = "Einstein did not print R in §2; standard 1905 value R = 8.31e7 erg/(mol K).";
  let rSensitivity = "Linear in R.";
  let lStatus = "editorial-input";
  let lReason = "Speed of light rounded to 3e10 cm/s in 1905 text.";
  let lSensitivity = "Inverse cubic in L.";

  if (set) {
    if (set.id === "planck-1900-1901-printed") {
      // Planck's own 1900-1901 printed readout
      return {
        status: "value",
        avogadroConstant: 6.175e23,
        printedAvogadroConstant: 6.175e23,
        hydrogenAtomMassGrams: 1 / 6.175e23,
        printedHydrogenAtomMassGrams: 1.62e-24,
        unroundedHydrogenAtomMassGrams: 1 / 6.175e23,
        rOverN: 8.31e7 / 6.175e23,
        printedROverN: 8.31e7 / 6.175e23,
        unroundedROverN: 8.31e7 / 6.175e23,
        markers: {
          avogadroConstant: { printedStatus: "printed", reason: "Planck 1900-1901 printed value." },
        },
        modernComparisons: {
          modernAvogadro: MODERN_AVOGADRO,
          modernReciprocalGram: MODERN_RECIPROCAL_GRAM,
          modernHydrogenAtomMassGrams: MODERN_H1_ATOM_MASS_GRAMS,
          modernBoltzmannConstant: MODERN_BOLTZMANN,
        },
      };
    }

    // Check if set has entries for alpha, beta, R, L
    const alphaEntry = set.entries.find((e) => e.quantityId === "wienConstantAlpha");
    if (alphaEntry) {
      alpha = alphaEntry.value;
      if (alphaEntry.printedStatus) alphaStatus = alphaEntry.printedStatus;
      if (alphaEntry.reason) alphaReason = alphaEntry.reason;
    }
    const betaEntry = set.entries.find((e) => e.quantityId === "wienConstantBeta");
    if (betaEntry) {
      beta = betaEntry.value;
    }
    const rEntry = set.entries.find((e) => e.quantityId === "molarGasConstant");
    if (rEntry) {
      // If R is in SI (8.31), convert to CGS erg/(mol K)
      R_cgs = rEntry.value < 100 ? rEntry.value * 1e7 : rEntry.value;
      if (rEntry.printedStatus) rStatus = rEntry.printedStatus;
      if (rEntry.reason) rReason = rEntry.reason;
      if (rEntry.sensitivity) rSensitivity = rEntry.sensitivity;
    }
    const lEntry = set.entries.find((e) => e.quantityId === "speedOfLight");
    if (lEntry) {
      L_cgs = lEntry.value < 1e9 ? lEntry.value * 100 : lEntry.value;
      if (lEntry.printedStatus) lStatus = lEntry.printedStatus;
      if (lEntry.reason) lReason = lEntry.reason;
      if (lEntry.sensitivity) lSensitivity = lEntry.sensitivity;
    }
  }

  // N = (beta / alpha) * (8 * pi * R / L^3)
  const N_unrounded = (beta / alpha) * ((8 * Math.PI * R_cgs) / L_cgs ** 3);
  const N_printed = 6.17e23;

  const hMass_from_printed_N = 1 / N_printed; // 1.62074554e-24 g
  const hMass_printed = 1.62e-24;
  const hMass_unrounded = 1 / N_unrounded; // 1.62061805e-24 g

  const rOverN_from_printed_N = R_cgs / N_printed; // 1.34683955e-16 erg/K
  const rOverN_unrounded = R_cgs / N_unrounded; // 1.34673347e-16 erg/K

  return {
    status: "value",
    avogadroConstant: N_unrounded,
    printedAvogadroConstant: N_printed,
    hydrogenAtomMassGrams: hMass_from_printed_N,
    printedHydrogenAtomMassGrams: hMass_printed,
    unroundedHydrogenAtomMassGrams: hMass_unrounded,
    rOverN: rOverN_from_printed_N,
    printedROverN: rOverN_from_printed_N,
    unroundedROverN: rOverN_unrounded,
    markers: {
      wienConstantAlpha: { printedStatus: alphaStatus, reason: alphaReason },
      molarGasConstant: { printedStatus: rStatus, reason: rReason, sensitivity: rSensitivity },
      speedOfLight: { printedStatus: lStatus, reason: lReason, sensitivity: lSensitivity },
    },
    modernComparisons: {
      modernAvogadro: MODERN_AVOGADRO,
      modernReciprocalGram: MODERN_RECIPROCAL_GRAM,
      modernHydrogenAtomMassGrams: MODERN_H1_ATOM_MASS_GRAMS,
      modernBoltzmannConstant: MODERN_BOLTZMANN,
    },
  };
}

The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.

regimeRelativeErrors · src/physics/reference/radiation/spectra.ts · this site’s source, as built · sha256:a4b44ec160f4721a8ce8233a6c39adb4e6b2dc061a427db51151d9bddaee5917

This function computes the listed outputs when it runs.

In words

Everything turns on one dimensionless number, x = h nu / (k_B T). Wien's relative error is e to the minus x, so Wien is good where x is large, which is high frequency or low temperature. The classical error is (e^x - 1)/x - 1, which vanishes where x is small. The function returns both errors, the regime they put you in, and the value of x at which each error reaches its tolerance, one per cent by default. Measured at 600 THz and 5800 K: x = 4.96, Wien runs 0.70 per cent below Planck, and the classical law is 27.7 times too large.

Implementation

/**
 * Relative error analysis comparing Wien and Rayleigh-Jeans approximations to Planck's exact law.
 */
export function regimeRelativeErrors(
  nu: CyclicFrequency | number,
  T: number,
  set: ConstantSet,
  options: { epsilonW?: number; epsilonRJ?: number } = {},
): RegimeReport {
  const { h, kB } = getBasePhysicsConstants(set);
  const epsilonW = options.epsilonW ?? 0.01;
  const epsilonRJ = options.epsilonRJ ?? 0.01;

  const x = (h * nu) / (kB * T);
  const wienRelativeError = Math.exp(-x);

  // The classical (Rayleigh-Jeans) relative error, measured against Planck like Wien's above:
  // (u_classical - u_Planck) / u_Planck = (e^x - 1)/x - 1. It was computed as 1 - x/(e^x - 1),
  // which divides by u_classical instead: the two agree to first order at small x, but at
  // x = 5.76 that read 0.98 while the classical law is 54.8 times Planck's value, and it put the
  // 1% boundary at x = 0.020067 where the owning bead specifies 0.0198678. Past x = 700, e^x
  // exceeds binary64 and the error is reported as Infinity, which callers must show in words.
  let rayleighJeansRelativeError: number;
  if (x < 1e-7) {
    rayleighJeansRelativeError = x / 2;
  } else if (x > 700) {
    rayleighJeansRelativeError = Number.POSITIVE_INFINITY;
  } else {
    rayleighJeansRelativeError = Math.expm1(x) / x - 1;
  }

  const wienBoundaryX = Math.log(1 / epsilonW);

  // Solve (e^x - 1)/x - 1 = epsilonRJ, that is e^x - 1 = (1 + epsilonRJ) x, by Newton's method.
  // For small epsilonRJ, x ~ 2 * epsilonRJ - (2/3) * epsilonRJ^2.
  let rjBoundaryX = 2 * epsilonRJ;
  for (let iter = 0; iter < 20; iter++) {
    const fVal = Math.expm1(rjBoundaryX) - (1 + epsilonRJ) * rjBoundaryX;
    const dfVal = Math.exp(rjBoundaryX) - (1 + epsilonRJ);
    const step = fVal / dfVal;
    rjBoundaryX -= step;
    if (Math.abs(step) < 1e-12) break;
  }

  const wienAdmitted = wienRelativeError <= epsilonW;
  const rayleighJeansAdmitted = rayleighJeansRelativeError <= epsilonRJ;

  let regime: "wien" | "rayleigh-jeans" | "intermediate";
  if (wienAdmitted) {
    regime = "wien";
  } else if (rayleighJeansAdmitted) {
    regime = "rayleigh-jeans";
  } else {
    regime = "intermediate";
  }

  return {
    x,
    wienRelativeError,
    rayleighJeansRelativeError,
    regime,
    wienAdmitted,
    rayleighJeansAdmitted,
    wienBoundaryX,
    rayleighJeansBoundaryX: rjBoundaryX,
  };
}

The law this instrument calculates

U(νc)=∫0νc8πν2c3kBT dν=8πkBT3c3νc3\begin{aligned}U(\nu_c) &= \int_0^{\nu_c} \frac{8\pi\nu^2}{c^3}k_BT\,d\nu \\ &= \frac{8\pi k_BT}{3c^3}\nu_c^3\end{aligned}
Explain this equation

Every resonator oscillation, at every frequency, carries the same mean energy Ē = kBT (source notation (R/N)T), two-thirds of a free molecule's mean kinetic energy, as §1 notes. Because that mean energy never falls off with frequency, the energy held by resonators up to a cutoff grows as the cube of the cutoff, without limit as the cutoff is removed.

Why the paper calls this a difficulty, not just an approximation

§1 draws two conclusions from this, not one: the classical allocation disagrees with the measured spectrum, and, independently, it rules out any equilibrium between matter and the radiation field at all, because the total grows without bound as the resonator range widens. This instrument's "remove the upper limit" action shows that second conclusion directly, as a typed refusal rather than a number that quietly becomes huge.

What §2 does with Planck's constants

§2 does not use Planck's radiation law as a hypothesis about light; it uses the two constants of Planck's fitted formula, in the classical limit, to solve for Avogadro's number. The historical readout below reproduces that calculation from Einstein's printed constants, labeled apart from the modern, defined value.

Before you draw a conclusion

Common wrong turns this instrument speaks to

  • Planck had already proposed that light consists of quanta.

    The “elementary quanta” of § 2 are Planck's determination of atomic magnitudes, such as the number of molecules in a gram-molecule. The light quantum is the paper's own viewpoint, proposed in its introduction.

    Read the full entry, with its sources

  • The light-quantum paper was written to answer the “ultraviolet catastrophe”.

    The phrase does not occur in the paper. § 1 shows the classical infinity as one difficulty, and the paper's argument for light quanta rests on something else, the entropy of radiation of low density.

    Read the full entry, with its sources

Embed this laboratory on another page. It starts from its worked defaults, not your current settings.