<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Classic on Hunter Heidenreich | ML Research Scientist</title><link>https://hunterheidenreich.com/tags/classic/</link><description>Recent content in Classic on Hunter Heidenreich | ML Research Scientist</description><image><title>Hunter Heidenreich | ML Research Scientist</title><url>https://hunterheidenreich.com/img/avatar.webp</url><link>https://hunterheidenreich.com/img/avatar.webp</link></image><generator>Hugo -- 0.147.7</generator><language>en-US</language><copyright>2026 Hunter Heidenreich</copyright><lastBuildDate>Sat, 14 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://hunterheidenreich.com/tags/classic/index.xml" rel="self" type="application/rss+xml"/><item><title>Distributed Representations: A Foundational Theory</title><link>https://hunterheidenreich.com/notes/machine-learning/model-architectures/distributed-representations/</link><pubDate>Sun, 14 Dec 2025 00:00:00 +0000</pubDate><guid>https://hunterheidenreich.com/notes/machine-learning/model-architectures/distributed-representations/</guid><description>Hinton's 1984 technical report establishing the theoretical efficiency of distributed representations over local encoding in neural networks.</description><content:encoded><![CDATA[<h2 id="what-kind-of-paper-is-this">What kind of paper is this?</h2>
<p>This is primarily a <strong>Theory</strong> paper, with strong secondary elements of <strong>Method</strong> and <strong>Position</strong>.</p>
<p>It is a theoretical work because its core contribution is the formal mathematical derivation of the encoding accuracy and error properties of distributed schemes (coarse coding) compared to local schemes. It serves as a position paper by challenging the &ldquo;grandmother cell&rdquo; (local representation) intuition prevalent in AI at the time and advocating for the &ldquo;constructive&rdquo; view of memory.</p>
<h2 id="what-is-the-motivation">What is the motivation?</h2>
<p>The motivation is to overcome the inefficiency of <strong>local representations</strong>, where one hardware unit corresponds to exactly one entity, and to challenge traditional metaphors of memory.</p>
<ul>
<li><strong>Inefficiency</strong>: In local representations, high accuracy requires an exponential number of units (accuracy $\propto \sqrt[k]{n}$ for $k$ dimensions).</li>
<li><strong>Brittleness</strong>: Local representations lack natural support for generalization; learning a fact about one concept (e.g., &ldquo;chimps like onions&rdquo;) requires extra machinery to transfer to similar concepts (e.g., &ldquo;gorillas&rdquo;).</li>
<li><strong>Hardware Mismatch</strong>: Massive parallelism is wasted if units are active rarely (1 bit of info per unit active 50% of the time vs. almost 0 for sparse local units).</li>
<li><strong>The &ldquo;Filing Cabinet&rdquo; Metaphor</strong>: The paper challenges the standard view of memory as a storage system of literal copies. It motivates a shift toward understanding memory as a reconstructive inference process.</li>
</ul>
<h2 id="what-is-the-novelty-here">What is the novelty here?</h2>
<p>The paper introduces formal mechanisms that explain <em>why</em> distributed representations are superior:</p>
<ol>
<li><strong>Coarse Coding Efficiency</strong>: Hinton proves that using broad, overlapping receptive fields (&ldquo;coarse coding&rdquo;) yields higher accuracy for a fixed number of units than non-overlapping local fields. For a $k$-dimensional feature space with $n$ units of receptive field radius $r$, accuracy scales as $a \propto n \cdot r^{k-1}$. This is far superior to local encoding, where accuracy scales as $a \propto n^{1/k}$.</li>
<li><strong>Automatic Generalization</strong>: It demonstrates that generalization is an emergent property of vector overlap. Modifying weights for one pattern automatically affects similar patterns (conspiracy effect).</li>
<li><strong>Memory as Reconstruction</strong>: It posits that memory is a reconstructive process where items are created afresh from fragments using plausible inference rules (connection strengths). This blurs the line between veridical recall and confabulation.</li>
<li><strong>Gradual Concept Formation</strong>: Distributed representations allow new concepts to emerge gradually through weight modifications that progressively differentiate existing concepts. This avoids the discrete decisions and spare hardware units required by local representations.</li>
<li><strong>Solution to the Binding Problem</strong>: It proposes that true part/whole hierarchies are formed by fusing the identity of a part with its role to produce a single, new subpattern. The representation of the whole is then the sum of these combined identity/role representations.</li>
</ol>















<figure class="post-figure center ">
    <img src="/img/notes/distributed-representations-binding.svg"
         alt="Diagram showing distributed representations with three pools of units (AGENT, RELATIONSHIP, PATIENT) connected via role/identity bindings"
         title="Diagram showing distributed representations with three pools of units (AGENT, RELATIONSHIP, PATIENT) connected via role/identity bindings"
         
         
         loading="lazy"
         class="post-image">
    
    <figcaption class="post-caption">The binding problem solution: true hierarchies require creating unique subpatterns that fuse an identity with its role, where the whole is represented as the sum of these combined representations.</figcaption>
    
</figure>

<h2 id="what-experiments-were-performed">What experiments were performed?</h2>
<p>The paper performs analytical derivations and two specific computer simulations:</p>
<ol>
<li><strong>Arbitrary Mapping Simulation</strong>: A 3-layer network trained to map 20 grapheme strings (e.g., words) to 20 unrelated semantic vectors.</li>
<li><strong>Damage &amp; Recovery Analysis</strong>:
<ul>
<li><strong>Lesioning</strong>: Removing a single word-set unit to observe error patterns. This produced &ldquo;Deep Dyslexia&rdquo;-like semantic errors (e.g., reading &ldquo;PEACH&rdquo; as &ldquo;APRICOT&rdquo;), where the clean-up effect settles on a similar but incorrect meaning.</li>
<li><strong>Noise Injection</strong>: Adding noise to all connections involving word-set units, reducing performance from 99.3% to 64.3%.</li>
<li><strong>Retraining</strong>: Measuring the speed of relearning after noise damage (&ldquo;spontaneous recovery&rdquo;), where unrehearsed items recover alongside rehearsed ones due to shared weights.</li>
</ul>
</li>
</ol>
<h2 id="what-outcomesconclusions">What outcomes/conclusions?</h2>
<ol>
<li><strong>Accuracy Scaling</strong>: For a $k$-dimensional feature space, the accuracy $a$ of a distributed representation scales as $a \propto n \cdot r^{k-1}$ (where $r$ is the receptive field radius), vastly outperforming local schemes.</li>
<li><strong>Reliability</strong>: Distributed systems exhibit graceful degradation. Removing units causes slight noise across many items.</li>
<li><strong>Spontaneous Recovery</strong>: When retraining a damaged network on a subset of items, the network &ldquo;spontaneously&rdquo; recovers unrehearsed items due to weight sharing, which is a qualitative signature of distributed representations.</li>
<li><strong>Limitations of Coarse Coding</strong>: The paper identifies that coarse coding requires relatively sparse features. Crowding too many feature-points together causes receptive fields to contain too many features, preventing the activity pattern from discriminating between combinations.</li>
<li><strong>Sequential Processing Constraint</strong>: When constituent structure is represented using identity/role bindings, only one structure can be represented at a time. Hinton argues this matches the empirical observation that people are, to a first approximation, sequential symbol processors.</li>
<li><strong>Learning Problem Deferred</strong>: The paper acknowledges that discovering which sets of items should correspond to single units is a difficult search problem, and defers the learning question to separate work (Hinton, Sejnowski, and Ackley, 1984).</li>
</ol>
<h2 id="reproducibility-details">Reproducibility Details</h2>
<p>The following details are extracted from Section 5 (&ldquo;Implementing an Arbitrary Mapping&rdquo;) to facilitate reproduction of the &ldquo;Deep Dyslexia&rdquo; and &ldquo;Arbitrary Mapping&rdquo; simulation.</p>
<h3 id="data">Data</h3>
<p>The simulation uses synthetic data representing words and meanings.</p>
<table>
  <thead>
      <tr>
          <th>Purpose</th>
          <th>Dataset</th>
          <th>Size</th>
          <th>Notes</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Training</td>
          <td>Synthetic Grapheme/Sememe Pairs</td>
          <td>20 pairs</td>
          <td>20 different grapheme strings mapped to random semantic vectors.</td>
      </tr>
  </tbody>
</table>
<ul>
<li><strong>Input (Graphemes)</strong>: 30 total units.
<ul>
<li>Structure: Divided into 3 groups of 10 units each.</li>
<li>Encoding: Each &ldquo;word&rdquo; (3 letters) activates exactly 1 unit in each group (sparse binary).</li>
</ul>
</li>
<li><strong>Output (Sememes)</strong>: 30 total units.
<ul>
<li>Structure: Binary units.</li>
<li>Encoding: Meanings are random vectors where each unit is active with probability $p=0.2$.</li>
</ul>
</li>
</ul>
<h3 id="algorithms">Algorithms</h3>
<ul>
<li><strong>Learning Rule</strong>: The paper cites &ldquo;Hinton, Sejnowski &amp; Ackley (1984)&rdquo; (Boltzmann Machines) for the specific learning algorithm used to set weights.</li>
<li><strong>False Positive Analysis</strong>: The probability $f$ that a semantic feature is incorrectly activated is derived as:</li>
</ul>
<p>$$f = (1 - (1-p)^{(w-1)})^u$$</p>
<p>Where:</p>
<ul>
<li>$p$: Probability of a sememe being in a word meaning ($0.2$).</li>
<li>$w$: Number of words in a &ldquo;word-set&rdquo; (cluster).</li>
<li>$u$: Number of active &ldquo;word-set&rdquo; units per word.</li>
</ul>
<h3 id="models">Models</h3>
<p>The simulation uses a specific three-layer architecture.</p>
<table>
  <thead>
      <tr>
          <th>Layer</th>
          <th>Type</th>
          <th>Count</th>
          <th>Connectivity</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Input</strong></td>
          <td>Grapheme Units</td>
          <td>30</td>
          <td>Connected to all Intermediate units (no direct link to Output).</td>
      </tr>
      <tr>
          <td><strong>Hidden</strong></td>
          <td>&ldquo;Word-Set&rdquo; Units</td>
          <td>20</td>
          <td>Fully connected to Input and Output.</td>
      </tr>
      <tr>
          <td><strong>Output</strong></td>
          <td>Sememe Units</td>
          <td>30</td>
          <td>Connected to all Intermediate units. Includes lateral inhibition (implied for &ldquo;clean up&rdquo;).</td>
      </tr>
  </tbody>
</table>
<ul>
<li><strong>Weights</strong>: Binary/Integer logic in theoretical analysis, but &ldquo;stochastic&rdquo; weights in the Boltzmann simulation.</li>
<li><strong>Thresholds</strong>: Sememe units have variable thresholds dynamically adjusted to be slightly less than the number of active word-set units.</li>
</ul>
<h3 id="evaluation">Evaluation</h3>
<p>The simulation evaluated the robustness of the mapping.</p>
<table>
  <thead>
      <tr>
          <th>Metric</th>
          <th>Value</th>
          <th>Baseline</th>
          <th>Notes</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Accuracy (Clean)</strong></td>
          <td>99.9%</td>
          <td>N/A</td>
          <td>Correct pattern produced 99.9% of the time after learning.</td>
      </tr>
      <tr>
          <td><strong>Lesion Error Rate</strong></td>
          <td>1.4%</td>
          <td>N/A</td>
          <td>140 errors in 10,000 tests after removing 1 word-set unit.</td>
      </tr>
      <tr>
          <td><strong>Semantic Errors</strong></td>
          <td>~60% of errors</td>
          <td>N/A</td>
          <td>83 of the 140 lesion errors were &ldquo;Deep Dyslexia&rdquo; errors (producing a valid but wrong semantic pattern).</td>
      </tr>
      <tr>
          <td><strong>Post-Noise Accuracy</strong></td>
          <td>64.3%</td>
          <td>99.3%</td>
          <td>Performance after adding noise to all connections involving word-set units. The 99.3% baseline (reported separately from the 99.9% clean accuracy above) reflects the pre-noise measurement at the time of this specific experiment.</td>
      </tr>
  </tbody>
</table>
<h3 id="hardware">Hardware</h3>
<ul>
<li><strong>Compute</strong>: Minimal. The original simulation ran on 1980s hardware (likely VAX-11 or similar).</li>
<li><strong>Replication</strong>: Reproducible on any modern CPU in milliseconds.</li>
</ul>
<h2 id="paper-information">Paper Information</h2>
<p><strong>Citation</strong>: Hinton, G. E. (1984). Distributed Representations. <em>Technical Report CMU-CS-84-157</em>, Carnegie-Mellon University.</p>
<p><strong>Publication</strong>: CMU Computer Science Department Technical Report, October 1984</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bibtex" data-lang="bibtex"><span style="display:flex;"><span><span style="color:#a6e22e">@techreport</span>{hinton1984distributed,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">title</span>=<span style="color:#e6db74">{Distributed representations}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">author</span>=<span style="color:#e6db74">{Hinton, Geoffrey E}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">year</span>=<span style="color:#e6db74">{1984}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">institution</span>=<span style="color:#e6db74">{Carnegie-Mellon University}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">number</span>=<span style="color:#e6db74">{CMU-CS-84-157}</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div>]]></content:encoded></item><item><title>The Number of Isomeric Hydrocarbons of the Methane Series</title><link>https://hunterheidenreich.com/notes/chemistry/molecular-representations/notations/number-of-isomeric-hydrocarbons/</link><pubDate>Mon, 08 Sep 2025 00:00:00 +0000</pubDate><guid>https://hunterheidenreich.com/notes/chemistry/molecular-representations/notations/number-of-isomeric-hydrocarbons/</guid><description>Henze and Blair's 1931 JACS paper deriving exact recursive formulas for counting constitutional alkane isomers.</description><content:encoded><![CDATA[<h2 id="a-theoretical-foundation-for-mathematical-chemistry">A Theoretical Foundation for Mathematical Chemistry</h2>
<p>This is a foundational <strong>theoretical paper</strong> in mathematical chemistry and chemical graph theory. It derives <strong>exact mathematical laws</strong> governing molecular topology. The paper also serves as a <strong>benchmark resource</strong>, establishing the first systematic isomer counts that corrected historical errors and whose recursive method remains the basis for modern molecular enumeration.</p>
<h2 id="historical-motivation-and-the-failure-of-centric-trees">Historical Motivation and the Failure of Centric Trees</h2>
<p>The primary motivation was the lack of a rigorous mathematical relationship between carbon content ($N$) and isomer count.</p>
<ul>
<li><strong>Previous failures</strong>: Earlier attempts by <a href="https://doi.org/10.1002/cber.187500801227">Cayley (1875)</a> (as cited by Henze and Blair, referring to the Berichte der deutschen chemischen Gesellschaft summary) and <a href="https://doi.org/10.1002/cber.187500802191">Schiff (1875)</a> used &ldquo;centric&rdquo; and &ldquo;bicentric&rdquo; symmetry tree methods that broke down as carbon content increased, producing incorrect counts as early as $N = 12$. Subsequent efforts by Tiemann (1893), Delannoy (1894), Losanitsch (1897), Goldberg (1898), and Trautz (1924), as cited in the paper, each improved on specific aspects but none achieved general accuracy beyond moderate carbon content.</li>
<li><strong>The theoretical gap</strong>: All prior formulas depended on exhaustively identifying centers of symmetry, meaning they required additional correction terms for each increase in $N$ and could not reliably predict counts for larger molecules like $C_{40}$.</li>
</ul>
<p>This work aimed to develop a theoretically sound, generalizable method that could be extended to any number of carbons.</p>
<h2 id="core-innovation-recursive-enumeration-of-graphs">Core Innovation: Recursive Enumeration of Graphs</h2>
<p>The core novelty is the proof that the count of hydrocarbons is a recursive function of the count of alkyl radicals (alcohols) of size $N/2$ or smaller. The authors rely on a preliminary calculation of the total number of isomeric alcohols (the methanol series) to make this hydrocarbon enumeration possible. By defining $T_k$ as the exact number of possible isomeric alkyl radicals strictly containing $k$ carbon atoms, graph enumeration transforms into a mathematical recurrence.</p>
<p>To rigorously prevent double-counting when functionally identical branches connect to a central carbon, Henze and Blair applied combinations with substitution. Because the chemical branches are unordered topologically, connecting $x$ branches of identical structural size $k$ results in combinations with repetition:</p>
<p>$$ \binom{T_k + x - 1}{x} $$</p>
<p>For example, if a Group B central carbon is bonded to three identical sub-branches of length $k$, the combinatoric volume for that precise topological partition resolves to:</p>
<p>$$ \frac{T_k (T_k + 1)(T_k + 2)}{6} $$</p>
<p>Summing these constrained combinatorial partitions across all valid branch sizes (governed by the Even/Odd bisection rules) yields the exact isomer count for $N$ without overestimating due to symmetric permutations.</p>
<p><strong>The Symmetry Constraints</strong>: The paper rigorously divides the problem space to prevent double-counting:</p>
<ul>
<li><strong>Group A (Centrosymmetric)</strong>: Hydrocarbons that can be bisected into two smaller alkyl radicals.
<ul>
<li><em>Even $N$</em>: Split into two radicals of size $N/2$.</li>
<li><em>Odd $N$</em>: Split into sizes $(N+1)/2$ and $(N-1)/2$.</li>
</ul>
</li>
<li><strong>Group B (Asymmetric)</strong>: Hydrocarbons whose graphic formula cannot be symmetrically bisected. They contain exactly one central carbon atom attached to 3 or 4 branches. To prevent double-counting, Henze and Blair established strict maximum branch sizes:
<ul>
<li><em>Even $N$</em>: No branch can be larger than $(N/2 - 1)$ carbons.</li>
<li><em>Odd $N$</em>: No branch can be larger than $(N-3)/2$ carbons.</li>
<li><em>The Combinatorial Partitioning</em>: They further subdivided these 3-branch and 4-branch molecules into distinct mathematical cases based on whether the branches were structurally identical or unique, applying distinct combinatorial formulas to each scenario.</li>
</ul>
</li>
</ul>















<figure class="post-figure center ">
    <img src="/img/notes/hexane-and-its-six-isomers-by-even-and-odd-decomposition.webp"
         alt="The five structural isomers of hexane classified into Group A and Group B based on their decomposition"
         title="The five structural isomers of hexane classified into Group A and Group B based on their decomposition"
         
         
         loading="lazy"
         class="post-image">
    
    <figcaption class="post-caption">The five isomers of hexane ($C_6$) classified by Henze and Blair&rsquo;s symmetry scheme. Group A molecules (top row) can be bisected along a bond (highlighted in red) into two $C_3$ alkyl radicals. Group B molecules (bottom row) have a central carbon atom (red circle) with 3-4 branches, preventing symmetric bisection.</figcaption>
    
</figure>

<p>This classification is the key insight that enables the recursive formulas. By exhaustively partitioning hydrocarbons into these mutually exclusive groups, the authors could derive separate combinatorial expressions for each and sum them without double-counting.</p>
<p>For each structural class, combinatorial formulas are derived that depend on the number of isomeric alcohols ($T_k$) where $k &lt; N$. This transforms the problem of counting large molecular graphs into a recurrence relation based on the counts of smaller, simpler sub-graphs.</p>
<h2 id="validation-via-exhaustive-hand-enumeration">Validation via Exhaustive Hand-Enumeration</h2>
<p>The experiments were computational and enumerative:</p>
<ol>
<li><strong>Derivation of the recursion formulas</strong>: The main effort was the mathematical derivation of the set of equations for each structural class of hydrocarbon.</li>
<li><strong>Calculation</strong>: They applied their formulas to calculate the number of isomers for alkanes up to $N=40$, reaching over $6.2 \times 10^{13}$ isomers. This was far beyond what was previously possible.</li>
<li><strong>Validation by exhaustive enumeration</strong>: To prove the correctness of their theory, the authors manually drew and counted all possible structural formulas for the undecanes ($C_{11}$), dodecanes ($C_{12}$), tridecanes ($C_{13}$), and tetradecanes ($C_{14}$). This brute-force check confirmed their calculated numbers and corrected long-standing errors in the literature.
<ul>
<li><em>Key correction</em>: The manual enumeration proved that the count for tetradecane ($C_{14}$) is <strong>1,858</strong>, correcting erroneous values previously published by <a href="https://doi.org/10.1002/cber.189703002144" title="Die Isomerie-Arten bei den Homologen der Paraffin-Reihe">Losanitsch (1897)</a>, whose results for $C_{12}$ and $C_{14}$ the paper identifies as incorrect.</li>
</ul>
</li>
</ol>
<h2 id="benchmark-outcomes-and-scaling-limits">Benchmark Outcomes and Scaling Limits</h2>
<ul>
<li><strong>The Constitutional Limit</strong>: The paper establishes the mathematical ground truth for organic molecular graphs by strictly counting <em>constitutional</em> (structural) isomers. The derivation completely excludes 3D stereoisomerism (enantiomers and diastereomers). For modern geometric deep learning applications (e.g., generating 3D conformers), Henze and Blair&rsquo;s scaling sequence serves as a lower bound, representing a severe underestimation of the true number of spatial configurations feasible within chemical space.</li>
<li><strong>Theoretical outcome</strong>: The paper proves that the problem&rsquo;s inherent complexity requires a recursive approach.</li>
<li><strong>Benchmark resource</strong>: The authors published a table of isomer counts up to $C_{40}$ (Table II), correcting historical errors and establishing the first systematic enumeration across this range. Later computational verification revealed that the paper&rsquo;s hand-calculated values are exact through at least $C_{14}$ (confirmed by exhaustive enumeration) but accumulate minor arithmetic errors beyond that range (e.g., at $C_{40}$). The recursive method itself is exact and remains the basis for the accepted values in <a href="https://oeis.org/A000602">OEIS A000602</a>.</li>
</ul>















<figure class="post-figure center ">
    <img src="/img/notes/number-of-isomeric-hydrocarbons-of-the-methane-series.webp"
         alt="Log-scale plot showing exponential growth of alkane isomer counts from C1 to C40"
         title="Log-scale plot showing exponential growth of alkane isomer counts from C1 to C40"
         
         
         loading="lazy"
         class="post-image">
    
    <figcaption class="post-caption">The number of structural isomers grows super-exponentially with carbon content, reaching over 62 trillion for C₄₀. This plot, derived from Henze and Blair&rsquo;s Table II, illustrates the combinatorial explosion that makes direct enumeration intractable for larger molecules.</figcaption>
    
</figure>

<p>The plot above illustrates the staggering growth rate. Methane ($C_1$) through propane ($C_3$) each have exactly one isomer. Beyond this, the count accelerates rapidly: 75 isomers at $C_{10}$, nearly 37 million at $C_{25}$, and over 4 billion at $C_{30}$. By $C_{40}$, the count exceeds $6.2 \times 10^{13}$ (the paper&rsquo;s hand-calculated Table II reports 62,491,178,805,831, while the modern OEIS-verified value is 62,481,801,147,341). This super-exponential scaling demonstrates why brute-force enumeration becomes impossible and why the recursive approach was essential.</p>
<ul>
<li><strong>Foundational impact</strong>: This work established the mathematical framework that would later evolve into modern chemical graph theory and computational chemistry approaches for molecular enumeration. In the context of AI for molecular generation, this is an early form of <strong>expressivity analysis</strong>, defining the size of the chemical space that generative models must learn to cover.</li>
</ul>
<h2 id="reproducibility-details">Reproducibility Details</h2>
<ul>
<li>
<p><strong>Algorithms</strong>: The exact mathematical recursive formulas and combinatorial partitioning logic are fully provided in the text, allowing for programmatic implementation.</p>
</li>
<li>
<p><strong>Evaluation</strong>: The authors scientifically validated their recursive formulas through exhaustive manual hand-enumeration (brute-force drawing of structural formulas) up to $C_{14}$ to establish absolute correctness.</p>
</li>
<li>
<p><strong>Data</strong>: The paper&rsquo;s Table II provides isomer counts up to $C_{40}$. These hand-calculated values are exact through at least $C_{14}$ (validated by exhaustive enumeration) but accumulate minor arithmetic errors beyond that range. The corrected integer sequence is maintained in the On-Line Encyclopedia of Integer Sequences (OEIS) as <a href="https://oeis.org/A000602">A000602</a>.</p>
</li>
<li>
<p><strong>Code</strong>: The OEIS page provides Mathematica and Maple implementations. The following pure Python implementation uses the OEIS generating functions (which formalize Henze and Blair&rsquo;s recursive method) to compute the corrected isomer counts up to any arbitrary $N$:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">compute_alkane_isomers</span>(max_n: int) <span style="color:#f92672">-&gt;</span> list[int]:
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;&#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Computes the number of alkane structural isomers C_nH_{2n+2}
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    up to max_n using the generating functions from OEIS A000602.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> max_n <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>: <span style="color:#66d9ef">return</span> [<span style="color:#ae81ff">1</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Helper: multiply two polynomials (cap at degree max_n)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">poly_mul</span>(a: list[int], b: list[int]) <span style="color:#f92672">-&gt;</span> list[int]:
</span></span><span style="display:flex;"><span>        res <span style="color:#f92672">=</span> [<span style="color:#ae81ff">0</span>] <span style="color:#f92672">*</span> (max_n <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> i, v_a <span style="color:#f92672">in</span> enumerate(a):
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">for</span> j, v_b <span style="color:#f92672">in</span> enumerate(b):
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> i <span style="color:#f92672">+</span> j <span style="color:#f92672">&lt;=</span> max_n: res[i <span style="color:#f92672">+</span> j] <span style="color:#f92672">+=</span> v_a <span style="color:#f92672">*</span> v_b
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">else</span>: <span style="color:#66d9ef">break</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> res
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Helper: evaluate P(x^k) by spacing out terms</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">poly_pow</span>(a: list[int], k: int) <span style="color:#f92672">-&gt;</span> list[int]:
</span></span><span style="display:flex;"><span>        res <span style="color:#f92672">=</span> [<span style="color:#ae81ff">0</span>] <span style="color:#f92672">*</span> (max_n <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> i, v <span style="color:#f92672">in</span> enumerate(a):
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> i <span style="color:#f92672">*</span> k <span style="color:#f92672">&lt;=</span> max_n: res[i <span style="color:#f92672">*</span> k] <span style="color:#f92672">=</span> v
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">else</span>: <span style="color:#66d9ef">break</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> res
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># T represents the alkyl radicals (OEIS A000598), T[0] = 1</span>
</span></span><span style="display:flex;"><span>    T <span style="color:#f92672">=</span> [<span style="color:#ae81ff">0</span>] <span style="color:#f92672">*</span> (max_n <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>    T[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Iteratively build coefficients of T</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># We only need to compute the (n-1)-th degree terms at step n</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> n <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">1</span>, max_n <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>):
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Extract previously calculated slices</span>
</span></span><span style="display:flex;"><span>        t_prev <span style="color:#f92672">=</span> T[:n]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># T(x^2) and T(x^3) terms up to n-1</span>
</span></span><span style="display:flex;"><span>        t2_term <span style="color:#f92672">=</span> T[(n <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">//</span> <span style="color:#ae81ff">2</span>] <span style="color:#66d9ef">if</span> (n <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">%</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span> <span style="color:#66d9ef">else</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>        t3_term <span style="color:#f92672">=</span> T[(n <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">//</span> <span style="color:#ae81ff">3</span>] <span style="color:#66d9ef">if</span> (n <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">%</span> <span style="color:#ae81ff">3</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span> <span style="color:#66d9ef">else</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># T(x)^2 and T(x)^3 terms up to n-1</span>
</span></span><span style="display:flex;"><span>        t_squared_n_1 <span style="color:#f92672">=</span> sum(t_prev[i] <span style="color:#f92672">*</span> t_prev[n <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">-</span> i] <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(n))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        t_cubed_n_1 <span style="color:#f92672">=</span> sum(
</span></span><span style="display:flex;"><span>            T[i] <span style="color:#f92672">*</span> T[j] <span style="color:#f92672">*</span> T[n <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">-</span> i <span style="color:#f92672">-</span> j]
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(n)
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(n <span style="color:#f92672">-</span> i)
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># T(x) * T(x^2) term up to n-1</span>
</span></span><span style="display:flex;"><span>        t_t2_n_1 <span style="color:#f92672">=</span> sum(
</span></span><span style="display:flex;"><span>            T[i] <span style="color:#f92672">*</span> T[j]
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(n)
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range((n <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">-</span> i) <span style="color:#f92672">//</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> i <span style="color:#f92672">+</span> <span style="color:#ae81ff">2</span><span style="color:#f92672">*</span>j <span style="color:#f92672">==</span> n <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        T[n] <span style="color:#f92672">=</span> (t_cubed_n_1 <span style="color:#f92672">+</span> <span style="color:#ae81ff">3</span> <span style="color:#f92672">*</span> t_t2_n_1 <span style="color:#f92672">+</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">*</span> t3_term) <span style="color:#f92672">//</span> <span style="color:#ae81ff">6</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Calculate Alkanes (OEIS A000602) from fully populated T</span>
</span></span><span style="display:flex;"><span>    T2 <span style="color:#f92672">=</span> poly_pow(T, <span style="color:#ae81ff">2</span>)
</span></span><span style="display:flex;"><span>    T3 <span style="color:#f92672">=</span> poly_pow(T, <span style="color:#ae81ff">3</span>)
</span></span><span style="display:flex;"><span>    T4 <span style="color:#f92672">=</span> poly_pow(T, <span style="color:#ae81ff">4</span>)
</span></span><span style="display:flex;"><span>    T_squared <span style="color:#f92672">=</span> poly_mul(T, T)
</span></span><span style="display:flex;"><span>    T_cubed <span style="color:#f92672">=</span> poly_mul(T_squared, T)
</span></span><span style="display:flex;"><span>    T_fourth <span style="color:#f92672">=</span> poly_mul(T_cubed, T)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    term2 <span style="color:#f92672">=</span> [(T_squared[i] <span style="color:#f92672">-</span> T2[i]) <span style="color:#f92672">//</span> <span style="color:#ae81ff">2</span> <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(max_n <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    term3_inner <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span>        T_fourth[i]
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">+</span> <span style="color:#ae81ff">6</span> <span style="color:#f92672">*</span> poly_mul(T_squared, T2)[i]
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">+</span> <span style="color:#ae81ff">8</span> <span style="color:#f92672">*</span> poly_mul(T, T3)[i]
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">+</span> <span style="color:#ae81ff">3</span> <span style="color:#f92672">*</span> poly_mul(T2, T2)[i]
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">+</span> <span style="color:#ae81ff">6</span> <span style="color:#f92672">*</span> T4[i]
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(max_n <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>    ]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    alkanes <span style="color:#f92672">=</span> [<span style="color:#ae81ff">1</span>] <span style="color:#f92672">+</span> [<span style="color:#ae81ff">0</span>] <span style="color:#f92672">*</span> max_n
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> n <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">1</span>, max_n <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>):
</span></span><span style="display:flex;"><span>        alkanes[n] <span style="color:#f92672">=</span> T[n] <span style="color:#f92672">-</span> term2[n] <span style="color:#f92672">+</span> term3_inner[n <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">//</span> <span style="color:#ae81ff">24</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> alkanes
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Calculate and verify</span>
</span></span><span style="display:flex;"><span>isomers <span style="color:#f92672">=</span> compute_alkane_isomers(<span style="color:#ae81ff">40</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;C_14 isomers: </span><span style="color:#e6db74">{</span>isomers[<span style="color:#ae81ff">14</span>]<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)   <span style="color:#75715e"># Output: 1858</span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;C_40 isomers: </span><span style="color:#e6db74">{</span>isomers[<span style="color:#ae81ff">40</span>]<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)   <span style="color:#75715e"># Output: 62481801147341</span>
</span></span></code></pre></div></li>
<li>
<p><strong>Hardware</strong>: Derived analytically and enumerated manually by the authors in 1931 without computational hardware.</p>
</li>
</ul>
<h2 id="paper-information">Paper Information</h2>
<p><strong>Citation</strong>: Henze, H. R., &amp; Blair, C. M. (1931). The number of isomeric hydrocarbons of the methane series. <em>Journal of the American Chemical Society</em>, 53(8), 3077-3085. <a href="https://doi.org/10.1021/ja01359a034">https://doi.org/10.1021/ja01359a034</a></p>
<p><strong>Publication</strong>: Journal of the American Chemical Society (JACS) 1931</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bibtex" data-lang="bibtex"><span style="display:flex;"><span><span style="color:#a6e22e">@article</span>{henze1931number,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">title</span>=<span style="color:#e6db74">{The number of isomeric hydrocarbons of the methane series}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">author</span>=<span style="color:#e6db74">{Henze, Henry R and Blair, Charles M}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">journal</span>=<span style="color:#e6db74">{Journal of the American Chemical Society}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">volume</span>=<span style="color:#e6db74">{53}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">number</span>=<span style="color:#e6db74">{8}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">pages</span>=<span style="color:#e6db74">{3077--3085}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">year</span>=<span style="color:#e6db74">{1931}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">publisher</span>=<span style="color:#e6db74">{ACS Publications}</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div>]]></content:encoded></item><item><title>Communication in the Presence of Noise: Shannon's 1949 Paper</title><link>https://hunterheidenreich.com/notes/machine-learning/model-architectures/communication-in-the-presence-of-noise/</link><pubDate>Mon, 08 Sep 2025 00:00:00 +0000</pubDate><guid>https://hunterheidenreich.com/notes/machine-learning/model-architectures/communication-in-the-presence-of-noise/</guid><description>Shannon's 1949 foundational paper establishing information theory, channel capacity, and the sampling theorem for communication systems.</description><content:encoded><![CDATA[<h2 id="what-kind-of-paper-is-this">What kind of paper is this?</h2>
<p>This is a foundational <strong>Theory</strong> paper. It establishes the mathematical framework for modern information theory and defines the ultimate physical limits of communication for an entire system, from the information source to the final destination.</p>
<h2 id="what-is-the-motivation">What is the motivation?</h2>
<p>The central motivation was to develop a general theory of communication that could quantify information and determine the maximum rate at which it can be transmitted reliably over a noisy channel. Prior to this work, communication system design was largely empirical. Shannon sought to create a mathematical foundation to understand the trade-offs between key parameters like bandwidth, power, and noise, independent of any specific hardware or modulation scheme. To frame this, he conceptualized a general communication system as consisting of five essential elements: an information source, a transmitter, a channel, a receiver, and a destination.</p>
<h2 id="what-is-the-novelty-here">What is the novelty here?</h2>
<p>The novelty is a complete, end-to-end mathematical theory of communication built upon several key concepts and theorems:</p>
<ol>
<li><strong>Geometric Representation of Signals</strong>: Shannon introduced the idea of representing signals as points in a high-dimensional vector space. A signal of duration $T$ and bandwidth $W$ is uniquely specified by $2TW$ numbers (its samples), which are treated as coordinates in a $2TW$-dimensional space. This transformed problems in communication into problems of high-dimensional geometry. In this representation, signal energy corresponds to squared distance from the origin, and noise introduces a &ldquo;sphere of uncertainty&rdquo; around each transmitted point.</li>
</ol>















<figure class="post-figure center ">
    <img src="/img/notes/geometric-interpretation-of-signals-as-spheres.webp"
         alt="Sphere packing illustration showing the geometric interpretation of channel capacity. A large dashed circle represents the total signal space with radius proportional to the square root of P&#43;N. Inside are multiple smaller blue circles (uncertainty spheres) with radius proportional to the square root of N, each centered on a distinct message point."
         title="Sphere packing illustration showing the geometric interpretation of channel capacity. A large dashed circle represents the total signal space with radius proportional to the square root of P&#43;N. Inside are multiple smaller blue circles (uncertainty spheres) with radius proportional to the square root of N, each centered on a distinct message point."
         
         
         loading="lazy"
         class="post-image">
    
    <figcaption class="post-caption"><strong>Sphere Packing and Channel Capacity</strong>: Each transmitted message corresponds to a point in high-dimensional signal space. Noise creates an &lsquo;uncertainty sphere&rsquo; of radius $\sqrt{N}$ around each point. The channel capacity equals how many non-overlapping uncertainty spheres can be packed into the total signal sphere of radius $\sqrt{P+N}$.</figcaption>
    
</figure>

<ol start="2">
<li>
<p><strong>Theorem 1 (The Sampling Theorem)</strong>: The paper provides an explicit statement and proof that a signal containing no frequencies higher than $W$ is perfectly determined by its samples taken at a rate of $2W$ samples per second (i.e., spaced $1/2W$ seconds apart). Shannon credits Nyquist for pointing out the fundamental importance of the time interval $1/2W$ seconds in connection with telegraphy, and names this the &ldquo;Nyquist interval&rdquo; corresponding to the band $W$. This theorem is the theoretical bedrock of all modern digital signal processing.</p>
</li>
<li>
<p><strong>Theorem 2 (Channel Capacity for AWGN)</strong>: This is the paper&rsquo;s most celebrated result, now known as the <strong>Shannon-Hartley theorem</strong> (a name assigned retrospectively, not used in the paper itself). It provides an exact formula for the capacity $C$ (the maximum rate of error-free communication) of a channel with bandwidth $W$, signal power $P$, and additive white Gaussian noise of power $N$:
$$ C = W \log_2 \left(1 + \frac{P}{N}\right) $$
It proves that for any transmission rate below $C$, a coding scheme exists that can achieve an arbitrarily low error frequency.</p>
<p><strong>Random Coding Proof Technique</strong>: Shannon&rsquo;s proof employs a <strong>random coding argument</strong>: he proved that if you choose signal points at random from the sphere of radius $\sqrt{2TWP}$, the average error frequency vanishes for any transmission rate below capacity. This non-constructive proof (meaning it establishes that good codes must exist without constructing any specific one) established that &ldquo;good&rdquo; codes exist almost everywhere in the signal space, even if we don&rsquo;t know how to build them efficiently. The random coding argument became a fundamental tool in information theory, shifting the focus from building specific codes to proving existence and understanding fundamental limits.</p>
</li>
</ol>















<figure class="post-figure center ">
    <img src="/img/notes/shannons-ideal-capacity-curve-and-sampling-theorem.webp"
         alt="Two plots illustrating Shannon&#39;s key theorems: (Left) The ideal capacity curve showing bits per cycle vs SNR in dB, with an example operating point at 10dB. (Right) The sampling theorem demonstrating how a continuous signal is perfectly captured by samples taken at the Nyquist rate of 2W."
         title="Two plots illustrating Shannon&#39;s key theorems: (Left) The ideal capacity curve showing bits per cycle vs SNR in dB, with an example operating point at 10dB. (Right) The sampling theorem demonstrating how a continuous signal is perfectly captured by samples taken at the Nyquist rate of 2W."
         
         
         loading="lazy"
         class="post-image">
    
    <figcaption class="post-caption"><strong>Left</strong>: Shannon&rsquo;s ideal capacity curve, showing how channel capacity (in bits per cycle) increases logarithmically with signal-to-noise ratio. <strong>Right</strong>: The sampling theorem in action, where a band-limited continuous signal is fully determined by discrete samples taken at twice its maximum frequency.</figcaption>
    
</figure>

<ol start="4">
<li>
<p><strong>Theorem 3 (Channel Capacity for Arbitrary Noise)</strong>: Shannon generalized the capacity concept to channels with any type of noise. Entropy power is defined as $N_1 = \frac{1}{2\pi e} e^{2h(X)}$, where $h(X)$ is the differential entropy of the noise distribution (the continuous analog of discrete entropy $H$: where $H$ counts the average bits per symbol from a discrete source, $h(X)$ measures the same unpredictability for continuous-valued random variables); it quantifies how spread out a distribution is in an information-theoretic sense, with Gaussian noise having the highest entropy power for a given variance. He showed that the capacity for a channel with arbitrary noise of power $N$ is bounded by the noise&rsquo;s <strong>entropy power</strong> $N_1$. Shannon proved that <strong>white Gaussian noise is the worst possible type of noise</strong> for any given noise power. Because the Gaussian distribution maximizes entropy for a given variance, the entropy power $N_1$ of any noise with power $N$ satisfies $N_1 \leq N$, with equality only for the Gaussian case. Since channel capacity decreases as entropy power increases, Gaussian noise achieves the highest $N_1$ (equal to $N$) and therefore imposes the lowest capacity bound. This means a system designed to handle white Gaussian noise will perform at least as well against any other noise type of the same power.</p>
<p><strong>Arbitrary Gaussian Noise and the Water-Filling Principle</strong>: Shannon extended his analysis to Gaussian noise with a non-flat power spectrum $N(f)$, using the calculus of variations (a technique for optimizing over functions rather than fixed variables) to find the power allocation $P(f)$ that maximizes capacity. He proved that optimal capacity is achieved when the sum $P(f) + N(f)$ is constant across the utilized frequency band. This leads to what is now known as the &ldquo;water-filling&rdquo; principle: allocate more signal power to quieter frequency bands, and allocate zero power to any band where noise exceeds the constant threshold. This provides the foundation for modern adaptive power allocation across frequency bands.</p>
</li>
</ol>















<figure class="post-figure center ">
    <img src="/img/notes/the-water-filling-principle.webp"
         alt="The water-filling principle for optimal power allocation. Gray area shows noise power N(f) varying across frequencies, orange area shows signal power P(f) allocated to fill up to a constant level lambda, such that P(f) &#43; N(f) equals a constant."
         title="The water-filling principle for optimal power allocation. Gray area shows noise power N(f) varying across frequencies, orange area shows signal power P(f) allocated to fill up to a constant level lambda, such that P(f) &#43; N(f) equals a constant."
         
         
         loading="lazy"
         class="post-image">
    
    <figcaption class="post-caption"><strong>The Water-Filling Principle</strong>: The condition $P(f) + N(f) = \lambda$ is Shannon&rsquo;s derivation; &lsquo;water-filling&rsquo; is the modern retrospective label for it. When noise power varies across frequencies, optimal capacity is achieved by allocating more signal power to &lsquo;quieter&rsquo; frequency bands. Like filling a container with water, power is poured in until the total (signal + noise) reaches a constant level $\lambda$. Frequencies with noise above this threshold receive no power at all.</figcaption>
    
</figure>

<ol start="5">
<li>
<p><strong>Theorem 4 (now known as the Source Coding Theorem)</strong>: This theorem addresses the information source itself. It proves that it&rsquo;s possible to encode messages from a discrete source into binary digits such that the average number of bits per source symbol approaches the source&rsquo;s <strong>entropy</strong>, $H$. This establishes entropy as the fundamental limit of data compression.</p>
</li>
<li>
<p><strong>Theorem 5 (Information Rate for Continuous Sources)</strong>: For continuous (analog) signals, Shannon introduced a concept foundational to rate-distortion theory. He defined the rate $R$ at which a continuous source generates information relative to a specific fidelity criterion (i.e., a tolerable amount of error, $N_1$, in the reproduction). This provides an early theoretical foundation for what later became rate-distortion theory.</p>
</li>
</ol>
<h2 id="what-experiments-were-performed">What experiments were performed?</h2>
<p>The paper is primarily theoretical, with &ldquo;experiments&rdquo; consisting of rigorous <strong>mathematical derivations and proofs</strong>. The channel capacity theorem, for instance, is proven using a geometric sphere-packing argument in the high-dimensional signal space.</p>
<p>However, Shannon does include a quantitative <strong>theoretical benchmark against existing 1949 technology</strong>. He plots his theoretical &ldquo;Ideal Curve&rdquo; against calculated limits of Pulse Code Modulation (PCM) and Pulse Position Modulation (PPM) systems in Figure 6. The PCM points were calculated from formulas in another paper, and the PPM points were from unpublished calculations by B. McMillan. This comparison reveals that the entire series of plotted points for these contemporary systems operated approximately <strong>8 dB</strong> below the ideal power limit over most of the practical range. Interestingly, PPM systems approached to within <strong>3 dB</strong> of the ideal curve specifically at very small $P/N$ ratios, highlighting that different modulation schemes are optimal for different regimes (PCM for high SNR, PPM for power-limited scenarios).</p>
<h2 id="what-outcomesconclusions">What outcomes/conclusions?</h2>
<p>The primary outcome was a complete, unified theory that quantifies both information itself (entropy) and the ability of a channel to transmit it (capacity).</p>
<ul>
<li>
<p><strong>Decoupling of Source and Channel</strong>: A key conclusion is that the problem of communication can be split into two distinct parts: encoding sequences of message symbols into sequences of binary digits (where the average digits per symbol approaches the entropy $H$), and then mapping these binary digits into a particular signal function of long duration to combat noise. A source can be transmitted reliably if and only if its rate $R$ (or entropy $H$) is less than the channel capacity $C$.</p>
</li>
<li>
<p><strong>The Limit is on Rate</strong>: A central conclusion is that noise in a channel imposes a maximum <strong>rate</strong> of transmission. Below this rate, error-free communication is theoretically possible.</p>
</li>
<li>
<p><strong>The Threshold Effect and Topological Necessity</strong>: To approach capacity, one must map a lower-dimensional message space into the high-dimensional signal space efficiently, winding through the available signal sphere to fill its volume (as illustrated with the efficient mapping in Fig. 4 of the paper). This complex mapping creates a sharp <strong>threshold effect</strong>: below a certain noise level, recovery is essentially perfect; above it, the system fails catastrophically because the &ldquo;uncertainty spheres&rdquo; around signal points begin to overlap. Shannon provides a topological explanation for why this threshold is unavoidable: it is not possible to map a region of higher dimensionality into a region of lower dimensionality continuously. To compress bandwidth (reducing the number of dimensions in signal space), the mapping from message space to signal space must necessarily be discontinuous. This required discontinuity creates vulnerable points where a small noise perturbation can cause the received signal to &ldquo;jump&rdquo; to an entirely different interpretation. The threshold is an inevitable consequence of dimensional reduction.</p>
</li>
<li>
<p><strong>The Exchange Relation</strong>: Shannon explicitly states that the key parameters $T$ (time), $W$ (bandwidth), $P$ (power), and $N$ (noise) can be &ldquo;altered at will&rdquo; without changing the total information transmitted, provided $TW \log(1 + P/N)$ is held constant. This exchangeability enables trade-offs such as using more bandwidth to compensate for lower power.</p>
</li>
<li>
<p><strong>Characteristics of an Ideal System</strong>: The theory implies that to approach the channel capacity limit, one must use very complex and long codes. An ideal system exhibits five key properties: (1) the transmission rate approaches $C$, (2) the error probability approaches zero, (3) the transmitted signal&rsquo;s statistical properties approach those of white noise, (4) the threshold effect becomes very sharp (errors increase rapidly if noise exceeds the designed value), and (5) <strong>the required delay increases indefinitely</strong>. This final constraint is a crucial practical limitation: achieving near-capacity performance requires encoding over increasingly long message blocks, introducing latency that may be unacceptable for real-time applications.</p>
</li>
</ul>
<h2 id="reproducibility-details">Reproducibility Details</h2>
<h3 id="algorithms">Algorithms</h3>
<p>The paper introduces the theoretical foundation for the <strong>water-filling algorithm</strong> for optimal power allocation across frequency bands with varying noise levels. The mathematical condition derived is that $P(f) + N(f)$ must be constant across the utilized frequency band.</p>
<h2 id="paper-information">Paper Information</h2>
<p><strong>Citation</strong>: Shannon, C. E. (1949). Communication in the Presence of Noise. <em>Proceedings of the IRE</em>, 37(1), 10-21. <a href="https://doi.org/10.1109/JRPROC.1949.232969">https://doi.org/10.1109/JRPROC.1949.232969</a></p>
<p><strong>Publication</strong>: Proceedings of the IRE, 1949</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bibtex" data-lang="bibtex"><span style="display:flex;"><span><span style="color:#a6e22e">@article</span>{shannon1949communication,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">author</span>=<span style="color:#e6db74">{Shannon, C. E.}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">journal</span>=<span style="color:#e6db74">{Proceedings of the IRE}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">title</span>=<span style="color:#e6db74">{Communication in the Presence of Noise}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">year</span>=<span style="color:#e6db74">{1949}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">volume</span>=<span style="color:#e6db74">{37}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">number</span>=<span style="color:#e6db74">{1}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">pages</span>=<span style="color:#e6db74">{10-21}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">doi</span>=<span style="color:#e6db74">{10.1109/JRPROC.1949.232969}</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div>]]></content:encoded></item><item><title>Lennard-Jones on Adsorption and Diffusion on Surfaces</title><link>https://hunterheidenreich.com/notes/chemistry/molecular-simulation/processes-of-adsorption/</link><pubDate>Sun, 17 Aug 2025 00:00:00 +0000</pubDate><guid>https://hunterheidenreich.com/notes/chemistry/molecular-simulation/processes-of-adsorption/</guid><description>Lennard-Jones's 1932 foundational paper introducing potential energy surface models to unify physical and chemical adsorption.</description><content:encoded><![CDATA[<h2 id="the-theoretical-foundation-of-adsorption-and-diffusion">The Theoretical Foundation of Adsorption and Diffusion</h2>
<p>This paper represents a foundational <strong>Theory</strong> contribution with dual elements of <strong>Systematization</strong>. It derives physical laws for adsorption potentials (Section 2) and diffusion kinetics (Section 4) from first principles, validating them against external experimental data (Ward, Benton). It bridges <strong>electronic structure theory</strong> (potential curves) and <strong>statistical mechanics</strong> (diffusion rates). It provides a unifying theoretical framework to explain a range of experimental observations.</p>
<h2 id="reconciling-physisorption-and-chemisorption">Reconciling Physisorption and Chemisorption</h2>
<p>The primary motivation was to reconcile conflicting experimental evidence regarding the nature of gas-solid interactions. At the time, it was observed that the same gas and solid could interact weakly at low temperatures (consistent with van der Waals forces) but exhibit strong, chemical-like bonding at higher temperatures, a process requiring significant activation energy. The paper seeks to provide a single, coherent model that can explain both &ldquo;physical adsorption&rdquo; (physisorption) and &ldquo;activated&rdquo; or &ldquo;chemical adsorption&rdquo; (chemisorption) and the transition between them.</p>
<h2 id="quantum-mechanical-potential-energy-surfaces-for-adsorption">Quantum Mechanical Potential Energy Surfaces for Adsorption</h2>
<p>The core novelty is the application of quantum mechanical potential energy surfaces to the problem of surface adsorption. The key conceptual breakthroughs are:</p>
<ol>
<li>
<p><strong>Dual Potential Energy Curves</strong>: The paper proposes that the state of the system must be described by at least two distinct potential energy curves as a function of the distance from the surface:</p>
<ul>
<li>One curve represents the interaction of the intact molecule with the surface (e.g., H₂ with a metal). This corresponds to weak, long-range van der Waals forces.</li>
<li>A second curve represents the interaction of the dissociated constituent atoms with the surface (e.g., 2H atoms with the metal). This corresponds to strong, short-range chemical bonds.</li>
</ul>
</li>
<li>
<p><strong>Activated Adsorption via Curve Crossing</strong>: The transition from the molecular (physisorbed) state to the atomic (chemisorbed) state occurs at the intersection of these two potential energy curves. For a molecule to dissociate and chemisorb, it must possess sufficient energy to reach this crossing point. This energy is identified as the <strong>energy of activation</strong>, which had been observed experimentally.</p>
</li>
<li>
<p><strong>Unified Model</strong>: This model unifies physisorption and chemisorption into a single continuous process. A molecule approaching the surface is first trapped in the shallow potential well of the physisorption curve. If it acquires enough thermal energy to overcome the activation barrier, it can transition to the much deeper potential well of the chemisorption state. This provides a clear physical picture for temperature-dependent adsorption phenomena.</p>
</li>
<li>
<p><strong>Quantum Mechanical Basis for Cohesion</strong>: To explain the nature of the chemisorption bond itself, Lennard-Jones draws on the then-recent quantum theory of metals (Sommerfeld, Bloch). In a metal, electrons are not bound to individual atoms but instead occupy shared energy states (bands) spread across the crystal. When an atom approaches the surface, local energy levels form in the gap between the bulk bands, creating sites where bonding can occur. The adsorption bond arises from the interaction between the valency electron of the approaching atom and conduction electrons of the metal, forming a closed shell analogous to a homopolar bond.</p>
</li>
</ol>
<h2 id="validating-theory-against-experimental-gas-solid-interactions">Validating Theory Against Experimental Gas-Solid Interactions</h2>
<p>This is a theoretical paper with no original experiments performed by the author. However, Lennard-Jones validates his theoretical framework against existing experimental data from other researchers:</p>
<ul>
<li><strong>Ward&rsquo;s data</strong>: Hydrogen absorption on copper, used to validate the square root time law for slow sorption kinetics (§4)</li>
<li><strong>Activated adsorption experiments</strong>: Benton and White (hydrogen on nickel), Taylor and Williamson, and Taylor and McKinney all provided isobar data showing temperature-dependent transitions between adsorption types (§3). Garner and Kingman documented three distinct adsorption regimes at different temperatures.</li>
<li><strong>van der Waals constant data</strong>: Used existing measurements of diamagnetic susceptibility to calculate predicted heats of adsorption (e.g., argon on copper yielding approximately 6000 cal/gram atom, nitrogen roughly 2500 cal/gram mol, hydrogen roughly 1300 cal/gram mol)</li>
<li><strong>KCl crystal calculations</strong>: Computed the full attractive potential field of argon above a KCl crystal lattice, accounting for the discrete ionic structure to produce detailed potential energy curves at different surface positions (§2)</li>
</ul>
<p>The validation approach involves deriving theoretical predictions from first principles and showing they match the functional form and magnitude of independently measured experimental results.</p>
<h2 id="the-lennard-jones-diagram-and-activated-adsorption">The Lennard-Jones Diagram and Activated Adsorption</h2>
<p><strong>Key Outcomes</strong>:</p>
<ul>
<li>The paper introduced the now-famous Lennard-Jones diagram for surface interactions, plotting potential energy versus distance from the surface for both molecular and dissociated atomic species. This graphical model became a cornerstone of surface science.</li>
<li>Derived the square root time law ($S \propto \sqrt{t}$) for slow sorption kinetics, validated against Ward&rsquo;s experimental data.</li>
<li>Established quantitative connection between adsorption potentials and measurable atomic properties (diamagnetic susceptibility).</li>
</ul>
<p><strong>Conclusions</strong>:</p>
<ul>
<li>The nature of adsorption is determined by the interplay between two distinct potential states (molecular and atomic).</li>
<li>&ldquo;Activated adsorption&rdquo; is the process of overcoming an energy barrier to transition from a physically adsorbed molecular state to a chemically adsorbed atomic state.</li>
<li>The model predicts that the specific geometry of the surface (i.e., the lattice spacing) and the orientation of the approaching molecule are critical, as they influence the shape of the potential energy surfaces and thus the magnitude of the activation energy.</li>
<li>The reverse process (recombination of atoms and desorption of a molecule) also requires activation energy to move from the chemisorbed state back to the molecular state.</li>
<li>This entire mechanism is proposed as a fundamental factor in heterogeneous <strong>catalysis</strong>, where the surface acts to lower the activation energy for molecular dissociation, facilitating chemical reactions.</li>
</ul>
<p><strong>Limitations</strong>:</p>
<ul>
<li>The initial &ldquo;method of images&rdquo; derivation assumes a perfectly continuous conducting surface, an approximation that breaks down at the atomic orbital level close to the surface.</li>
<li>While Lennard-Jones uses one-dimensional calculations to estimate initial potential well depths, he later qualitatively extends this to 3D &ldquo;contour tunnels&rdquo; to explain surface migration. However, these early geometric approximations lack the many-body, multi-dimensional complexity natively handled by modern Density Functional Theory (DFT) simulations.</li>
</ul>
<hr>
<h2 id="mathematical-derivations">Mathematical Derivations</h2>
<h3 id="van-der-waals-calculation-section-2">Van der Waals Calculation (Section 2)</h3>
<p>The paper derives the attractive force between a neutral atom and a metal surface using the <strong>classical method of electrical images</strong>. The key steps are:</p>
<ol>
<li><strong>Method of Images</strong>: Lennard-Jones models the metal as a continuum of perfectly mobile electric fluid (a perfectly polarisable system). When a neutral atom approaches, its instantaneous dipole moment induces image charges in the metal surface.</li>
</ol>















<figure class="post-figure center ">
    <img src="/img/notes/method-of-images-atom-surface.webp"
         alt="Diagram showing an atom with nucleus (&#43;Ne) and electrons (-e) at distance R from a conducting surface, with its electrical image reflected on the opposite side"
         title="Diagram showing an atom with nucleus (&#43;Ne) and electrons (-e) at distance R from a conducting surface, with its electrical image reflected on the opposite side"
         
         
         loading="lazy"
         class="post-image">
    
    <figcaption class="post-caption">An atom and its electrical image in a conducting surface. The nucleus (+Ne) and electrons create mirror charges across the metal plane.</figcaption>
    
</figure>

<ol start="2">
<li><strong>The Interaction Potential</strong>: The resulting potential energy $W$ of an atom at distance $R$ from the metal surface is:</li>
</ol>
<p>$$W = -\frac{e^2 \overline{r^2}}{6R^3}$$</p>
<p>where $\overline{r^2}$ is the mean square distance of electrons from the nucleus.</p>
<ol start="3">
<li><strong>Connection to Measurable Properties</strong>: This theoretical potential can be calculated using <strong>diamagnetic susceptibility</strong> ($\chi$). The interaction simplifies to:</li>
</ol>
<p>$$W = \mu R^{-3}$$</p>
<p>where $\mu = mc^2\chi/L$, with $m$ the electron mass, $c$ the speed of light, $\chi$ the diamagnetic susceptibility, and $L$ Loschmidt&rsquo;s number ($6.06 \times 10^{23}$). This connects the adsorption potential to measurable magnetic properties of the atom.</p>
<ol start="4">
<li><strong>Repulsive Forces and Equilibrium</strong>: By assuming repulsive forces account for approximately 40% of the potential at equilibrium, Lennard-Jones estimates heats of adsorption. For argon on copper, this yields approximately 6000 cal per gram atom. Similar calculations give roughly 2500 cal/gram mol for nitrogen on copper and 1300 cal/gram mol for hydrogen.</li>
</ol>
<hr>
<h2 id="kinetic-theory-of-slow-sorption-section-4">Kinetic Theory of Slow Sorption (Section 4)</h2>
<p>The paper extends beyond surface phenomena to model how gas <em>enters</em> the bulk solid (absorption). This section is critical for understanding time-dependent adsorption kinetics.</p>
<h3 id="the-cracks-hypothesis">The &ldquo;Cracks&rdquo; Hypothesis</h3>
<p>Lennard-Jones proposes that &ldquo;slow sorption&rdquo; is <strong>lateral diffusion along surface cracks</strong> (fissures between microcrystal boundaries) in the solid. The outer surface presents not a uniform plane but a network of narrow, deep crevasses where gas can penetrate. This reframes the problem: the rate-limiting step is diffusion along these crack walls, explaining why sorption rates differ from predictions based on bulk diffusion coefficients.</p>
<h3 id="the-diffusion-equation">The Diffusion Equation</h3>
<p>The problem is formulated using Fick&rsquo;s second law:</p>
<p>$$\frac{\partial n}{\partial t} = D \frac{\partial^{2}n}{\partial x^{2}}$$</p>
<p>where $n$ is the concentration of adsorbed atoms, $t$ is time, $D$ is the diffusion coefficient, and $x$ is the position along the crack.</p>
<h3 id="derivation-of-the-diffusion-coefficient">Derivation of the Diffusion Coefficient</h3>
<p>The diffusion coefficient is derived from kinetic theory:</p>
<p>$$D = \frac{\bar{c}^2 \tau^2}{2\tau^*}$$</p>
<p>where:</p>
<ul>
<li>$\bar{c}$ is the mean lateral velocity of mobile atoms parallel to the surface</li>
<li>$\tau$ is the time an atom spends in the mobile (activated) state</li>
<li>$\tau^*$ is the interval between activation events</li>
</ul>
<p>Atoms are &ldquo;activated&rdquo; to a mobile state with energy $E_0$, after which they can migrate along the surface.</p>
<h3 id="the-square-root-law">The Square Root Law</h3>
<p>Solving the diffusion equation for a semi-infinite crack yields the total amount of gas absorbed $S$ as a function of time:</p>
<p>$$S = 2n_0 \sqrt{\frac{Dt}{\pi}}$$</p>
<p>This predicts that <strong>absorption scales with the square root of time</strong>:</p>
<p>$$S \propto \sqrt{t}$$</p>
<h3 id="experimental-validation">Experimental Validation</h3>
<p>Lennard-Jones validates this derivation by re-analyzing Ward&rsquo;s experimental data on the Copper/Hydrogen system. Plotting the absorbed quantity against $\sqrt{t}$ produces linear curves, confirming the theoretical prediction. From the slope of the $\log_{10}(S^2/q^2t)$ vs. $1/T$ plot, Ward determined an activation energy of 14,100 cal per gram-molecule for the surface diffusion process.</p>
<hr>
<h2 id="surface-topography-and-3d-contours">Surface Topography and 3D Contours</h2>
<p>The notes above imply a one-dimensional process (distance from surface). The paper explicitly expands this to three dimensions to explain surface migration.</p>
<h3 id="potential-tunnels">Potential &ldquo;Tunnels&rdquo;</h3>
<p>Lennard-Jones models the surface potential as <strong>3D contour surfaces</strong> resembling &ldquo;underground caverns&rdquo; or tunnels. The potential energy landscape above a crystalline surface has periodic minima and saddle points.</p>
<h3 id="surface-migration">Surface Migration</h3>
<p>Atoms migrate along &ldquo;tunnels&rdquo; of low potential energy between surface atoms. The activation energy for surface diffusion corresponds to the barrier height between adjacent potential wells on the surface. This geometric picture explains:</p>
<ul>
<li>Why certain crystallographic orientations are more reactive</li>
<li>The temperature dependence of surface diffusion rates</li>
<li>The role of surface defects in catalysis</li>
</ul>
<h2 id="reproducibility">Reproducibility</h2>
<p>This is a 1932 theoretical paper with no associated code, datasets, or models. The mathematical derivations are fully presented in the text and can be followed from first principles. The experimental data referenced (Ward&rsquo;s copper/hydrogen measurements, Benton and White&rsquo;s nickel/hydrogen isobars) are cited from independently published sources. No computational artifacts exist.</p>
<ul>
<li><strong>Status</strong>: Closed (theoretical paper, no reproducibility artifacts)</li>
<li><strong>Hardware</strong>: N/A (analytical derivations only)</li>
</ul>
<h2 id="paper-information">Paper Information</h2>
<p><strong>Citation</strong>: Lennard-Jones, J. E. (1932). Processes of Adsorption and Diffusion on Solid Surfaces. <em>Transactions of the Faraday Society</em>, 28, 333-359. <a href="https://doi.org/10.1039/tf9322800333">https://doi.org/10.1039/tf9322800333</a></p>
<p><strong>Publication</strong>: Transactions of the Faraday Society, 1932</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bibtex" data-lang="bibtex"><span style="display:flex;"><span><span style="color:#a6e22e">@article</span>{lennardjones1932processes,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">title</span>=<span style="color:#e6db74">{Processes of adsorption and diffusion on solid surfaces}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">author</span>=<span style="color:#e6db74">{Lennard-Jones, John Edward}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">journal</span>=<span style="color:#e6db74">{Transactions of the Faraday Society}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">volume</span>=<span style="color:#e6db74">{28}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">pages</span>=<span style="color:#e6db74">{333--359}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">year</span>=<span style="color:#e6db74">{1932}</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">publisher</span>=<span style="color:#e6db74">{Royal Society of Chemistry}</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div>]]></content:encoded></item></channel></rss>