<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-04-20T16:43:11+00:00</updated><id>/feed.xml</id><title type="html">David Radcliffe</title><subtitle>My personal website.</subtitle><entry><title type="html">Area Bounds for a Midpoint-Crosscut Quadrilateral</title><link href="/math/2026/03/20/crosscut-quadrilateral.html" rel="alternate" type="text/html" title="Area Bounds for a Midpoint-Crosscut Quadrilateral" /><published>2026-03-20T19:08:00+00:00</published><updated>2026-03-20T19:08:00+00:00</updated><id>/math/2026/03/20/crosscut-quadrilateral</id><content type="html" xml:base="/math/2026/03/20/crosscut-quadrilateral.html"><![CDATA[<p>In 2016, I posted the following problem on <a href="https://math.stackexchange.com/questions/1925901/quadrilateral-formed-by-connecting-the-vertices-of-a-convex-quadrilateral-to-mid">Math Stack Exchange</a>:</p>

<p><em>Let $ABCD$ be a convex quadrilateral, and $E, F, G, H$ be the midpoints of the sides. The line segments $\overline{AF}$, $\overline{BG}$, $\overline{CH}$, and $\overline{DE}$ bound a convex quadrilateral $PQRS$ inside $ABCD$. What is the ratio of the areas of the two quadrilaterals?</em></p>

<p><img src="/img/crosscut-quadrilateral.png" alt="Figure 1: The midpoint-crosscut quadrilateral P QRS inside ABCD." class="center" height="300" /></p>

<p>Later, I found a solution to my own problem, which I posted as an answer on the same page. The solution used an affine transformation to simplify the problem, and then used SymPy to compute the areas of the two quadrilaterals. The final result was that the area of $PQRS$ is between $\frac{1}{6}$ and $\frac{1}{5}$ of the area of $ABCD$. The bounds are tight, and equality in the upper bound is achieved exactly when $PQRS$ is a trapezoid.</p>

<p>The article <a href="/pdf/crosscut-quadrilateral.pdf">linked here</a> contains a detailed write-up of the solution. The computer algebra system SymPy was used to perform the necessary algebraic manipulations. The code is included below for reference.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">sympy</span> <span class="k">as</span> <span class="n">sp</span>

<span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">sp</span><span class="p">.</span><span class="n">symbols</span><span class="p">(</span><span class="s">"x y"</span><span class="p">)</span>
<span class="n">X</span><span class="p">,</span> <span class="n">Y</span> <span class="o">=</span> <span class="n">sp</span><span class="p">.</span><span class="n">symbols</span><span class="p">(</span><span class="s">"X Y"</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">midpoint</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">q</span><span class="p">):</span>
    <span class="s">"""Return the midpoint of the segment joining p and q."""</span>
    <span class="k">return</span> <span class="p">((</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">q</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">q</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">line_through</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">q</span><span class="p">):</span>
    <span class="s">"""Return the equation L(X, Y) = 0 of the line through p and q."""</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">X</span> <span class="o">-</span> <span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">*</span> <span class="p">(</span><span class="n">Y</span> <span class="o">-</span> <span class="n">q</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">-</span> <span class="p">(</span><span class="n">X</span> <span class="o">-</span> <span class="n">q</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">*</span> <span class="p">(</span><span class="n">Y</span> <span class="o">-</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>


<span class="k">def</span> <span class="nf">intersection</span><span class="p">(</span><span class="n">line1</span><span class="p">,</span> <span class="n">line2</span><span class="p">):</span>
    <span class="s">"""Return the intersection point of the two given lines."""</span>
    <span class="n">solution</span> <span class="o">=</span> <span class="n">sp</span><span class="p">.</span><span class="n">solve</span><span class="p">((</span><span class="n">line1</span><span class="p">,</span> <span class="n">line2</span><span class="p">),</span> <span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">),</span> <span class="nb">dict</span><span class="o">=</span><span class="bp">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">solution</span><span class="p">[</span><span class="n">X</span><span class="p">],</span> <span class="n">solution</span><span class="p">[</span><span class="n">Y</span><span class="p">])</span>


<span class="k">def</span> <span class="nf">polygon_area</span><span class="p">(</span><span class="n">vertices</span><span class="p">):</span>
    <span class="s">"""Return the signed area of a polygon with ordered vertices."""</span>
    <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">vertices</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">sp</span><span class="p">.</span><span class="n">simplify</span><span class="p">(</span>
        <span class="nb">sum</span><span class="p">(</span>
            <span class="n">vertices</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">vertices</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span>
            <span class="o">-</span> <span class="n">vertices</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">vertices</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
        <span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
    <span class="p">)</span>


<span class="k">def</span> <span class="nf">slope</span><span class="p">(</span><span class="n">P</span><span class="p">,</span> <span class="n">Q</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">sp</span><span class="p">.</span><span class="n">factor</span><span class="p">(</span>
        <span class="n">sp</span><span class="p">.</span><span class="n">simplify</span><span class="p">(</span>
            <span class="p">(</span><span class="n">Q</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">P</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">/</span> <span class="p">(</span><span class="n">Q</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">P</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
        <span class="p">)</span>
    <span class="p">)</span>


<span class="k">def</span> <span class="nf">pretty</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
    <span class="s">"""Factor and print expressions in a compact human-readable form."""</span>
    <span class="n">expr</span> <span class="o">=</span> <span class="n">sp</span><span class="p">.</span><span class="n">factor</span><span class="p">(</span><span class="n">sp</span><span class="p">.</span><span class="n">simplify</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
    <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span><span class="s">"**"</span><span class="p">,</span> <span class="s">"^"</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span><span class="s">"*"</span><span class="p">,</span> <span class="s">""</span><span class="p">)</span>


<span class="n">zero</span> <span class="o">=</span> <span class="n">sp</span><span class="p">.</span><span class="n">Integer</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">two</span> <span class="o">=</span> <span class="n">sp</span><span class="p">.</span><span class="n">Integer</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>

<span class="n">A</span> <span class="o">=</span> <span class="p">(</span><span class="n">zero</span><span class="p">,</span> <span class="n">zero</span><span class="p">)</span>
<span class="n">B</span> <span class="o">=</span> <span class="p">(</span><span class="n">two</span><span class="p">,</span> <span class="n">zero</span><span class="p">)</span>
<span class="n">C</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="n">D</span> <span class="o">=</span> <span class="p">(</span><span class="n">zero</span><span class="p">,</span> <span class="n">two</span><span class="p">)</span>
<span class="n">vertices</span> <span class="o">=</span> <span class="p">[</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">,</span> <span class="n">D</span><span class="p">]</span>

<span class="n">E</span> <span class="o">=</span> <span class="n">midpoint</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">)</span>
<span class="n">F</span> <span class="o">=</span> <span class="n">midpoint</span><span class="p">(</span><span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">)</span>
<span class="n">G</span> <span class="o">=</span> <span class="n">midpoint</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
<span class="n">H</span> <span class="o">=</span> <span class="n">midpoint</span><span class="p">(</span><span class="n">D</span><span class="p">,</span> <span class="n">A</span><span class="p">)</span>

<span class="n">P</span> <span class="o">=</span> <span class="n">intersection</span><span class="p">(</span><span class="n">line_through</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">F</span><span class="p">),</span> <span class="n">line_through</span><span class="p">(</span><span class="n">B</span><span class="p">,</span> <span class="n">G</span><span class="p">))</span>
<span class="n">Q</span> <span class="o">=</span> <span class="n">intersection</span><span class="p">(</span><span class="n">line_through</span><span class="p">(</span><span class="n">B</span><span class="p">,</span> <span class="n">G</span><span class="p">),</span> <span class="n">line_through</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">H</span><span class="p">))</span>
<span class="n">R</span> <span class="o">=</span> <span class="n">intersection</span><span class="p">(</span><span class="n">line_through</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">H</span><span class="p">),</span> <span class="n">line_through</span><span class="p">(</span><span class="n">D</span><span class="p">,</span> <span class="n">E</span><span class="p">))</span>
<span class="n">S</span> <span class="o">=</span> <span class="n">intersection</span><span class="p">(</span><span class="n">line_through</span><span class="p">(</span><span class="n">D</span><span class="p">,</span> <span class="n">E</span><span class="p">),</span> <span class="n">line_through</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">F</span><span class="p">))</span>
<span class="n">inner_vertices</span> <span class="o">=</span> <span class="p">[</span><span class="n">P</span><span class="p">,</span> <span class="n">Q</span><span class="p">,</span> <span class="n">R</span><span class="p">,</span> <span class="n">S</span><span class="p">]</span>

<span class="k">for</span> <span class="n">label</span><span class="p">,</span> <span class="n">point</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="s">"PQRS"</span><span class="p">,</span> <span class="n">inner_vertices</span><span class="p">):</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="si">{</span><span class="n">label</span><span class="si">}</span><span class="s">x = </span><span class="si">{</span><span class="n">pretty</span><span class="p">(</span><span class="n">point</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="si">{</span><span class="n">label</span><span class="si">}</span><span class="s">y = </span><span class="si">{</span><span class="n">pretty</span><span class="p">(</span><span class="n">point</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>

<span class="n">outer_area</span> <span class="o">=</span> <span class="n">polygon_area</span><span class="p">(</span><span class="n">vertices</span><span class="p">)</span>
<span class="n">inner_area</span> <span class="o">=</span> <span class="n">polygon_area</span><span class="p">(</span><span class="n">inner_vertices</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="se">\n</span><span class="s">outer area = </span><span class="si">{</span><span class="n">pretty</span><span class="p">(</span><span class="n">outer_area</span><span class="p">)</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"inner area:"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">pretty</span><span class="p">(</span><span class="n">inner_area</span><span class="p">))</span>

<span class="k">print</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">outer area - 5 * inner area ="</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">pretty</span><span class="p">(</span><span class="n">outer_area</span> <span class="o">-</span> <span class="mi">5</span> <span class="o">*</span> <span class="n">inner_area</span><span class="p">))</span>

<span class="k">print</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">6 * inner area - outer area ="</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">pretty</span><span class="p">(</span><span class="mi">6</span> <span class="o">*</span> <span class="n">inner_area</span> <span class="o">-</span> <span class="n">outer_area</span><span class="p">))</span>
</code></pre></div></div>]]></content><author><name></name></author><category term="math" /><summary type="html"><![CDATA[In 2016, I posted the following problem on Math Stack Exchange:]]></summary></entry><entry><title type="html">On the binary reverse-and-add trajectory of 22</title><link href="/math/2026/03/17/binary-reverse-add-22.html" rel="alternate" type="text/html" title="On the binary reverse-and-add trajectory of 22" /><published>2026-03-17T16:38:00+00:00</published><updated>2026-03-17T16:38:00+00:00</updated><id>/math/2026/03/17/binary-reverse-add-22</id><content type="html" xml:base="/math/2026/03/17/binary-reverse-add-22.html"><![CDATA[<p>The reverse-and-add process is a simple iterative procedure that can be applied to any positive integer. Starting with a number, you reverse its digits and add the reversed number to the original number. This process is repeated with the resulting sum. For example, starting with 59:</p>
<ol>
  <li>Reverse 59 to get 95.</li>
  <li>Add 59 and 95 to get 154.</li>
  <li>Reverse 154 to get 451.</li>
  <li>Add 154 and 451 to get 605.</li>
  <li>Reverse 605 to get 506.</li>
  <li>Add 605 and 506 to get 1111.</li>
</ol>

<p>Do we always end up with a palindrome (a number that reads the same forwards and backwards) after a finite number of steps? This is an open question in mathematics. The smallest number for which this question is still unresolved is 196. The trajectory of 196 under the reverse-and-add process has been computed for a billion iterations without ever producing a palindrome, leading to the <a href="https://en.wikipedia.org/wiki/Lychrel_number#196_palindrome_quest">conjecture</a> that it may never produce one.</p>

<p>The reverse-and-add process can also be applied in binary. Starting with the number 22, which is 10110 in binary, we can compute its trajectory under the binary reverse-and-add process. The sequence of numbers generated by this process exhibits periodic behavior, and it can be shown that it does not produce a palindrome in binary.</p>

<p>Here is a detailed <a href="/pdf/binary-reverse-add-22.pdf">analysis</a> of the binary reverse-and-add trajectory of 22, showing that a palindrome is never produced.</p>]]></content><author><name></name></author><category term="math" /><summary type="html"><![CDATA[The reverse-and-add process is a simple iterative procedure that can be applied to any positive integer. Starting with a number, you reverse its digits and add the reversed number to the original number. This process is repeated with the resulting sum. For example, starting with 59: Reverse 59 to get 95. Add 59 and 95 to get 154. Reverse 154 to get 451. Add 154 and 451 to get 605. Reverse 605 to get 506. Add 605 and 506 to get 1111.]]></summary></entry><entry><title type="html">Polynomials as finite sums of periodic functions</title><link href="/math/2026/03/04/polynomials-as-sums-of-periodic-functions.html" rel="alternate" type="text/html" title="Polynomials as finite sums of periodic functions" /><published>2026-03-04T14:00:00+00:00</published><updated>2026-03-04T14:00:00+00:00</updated><id>/math/2026/03/04/polynomials-as-sums-of-periodic-functions</id><content type="html" xml:base="/math/2026/03/04/polynomials-as-sums-of-periodic-functions.html"><![CDATA[<p>Every real polynomial function of degree $n$ can be expresed
as the sum of $n+1$ periodic functions.
The <a href="/pdf/polynomials-as-sums-of-periodic-functions.pdf">proof</a>
requires the axiom of choice.</p>]]></content><author><name></name></author><category term="math" /><summary type="html"><![CDATA[Every real polynomial function of degree $n$ can be expresed as the sum of $n+1$ periodic functions. The proof requires the axiom of choice.]]></summary></entry><entry><title type="html">Cancellation in direct products of finite groups</title><link href="/math/2026/02/28/cancellation-in-direct-products-of-finite-groups.html" rel="alternate" type="text/html" title="Cancellation in direct products of finite groups" /><published>2026-02-28T18:12:00+00:00</published><updated>2026-02-28T18:12:00+00:00</updated><id>/math/2026/02/28/cancellation-in-direct-products-of-finite-groups</id><content type="html" xml:base="/math/2026/02/28/cancellation-in-direct-products-of-finite-groups.html"><![CDATA[<p>Let $A$, $B$, $C$ be finite groups. If $A \times B$ and $A \times C$ are isomorphic,
then $B$ and $C$ are also isomorphic. That is, the common factor $A$
can be cancelled from both sides of the equation.</p>

<p>I learned a beautiful proof of this result
from the Usenet newsgroup sci.math in 2001,
while I was completing my Ph.D. dissertation. I rewrote the proof
in a plain text file, and then forgot the details.</p>

<p>Today, I prompted ChatGPT to rewrite the proof carefully in LaTeX.
I think that the result was pretty good. You can view the proof as a
<a href="/pdf/cancel-direct-product-finite-groups.pdf">PDF</a>.</p>]]></content><author><name></name></author><category term="math" /><summary type="html"><![CDATA[Let $A$, $B$, $C$ be finite groups. If $A \times B$ and $A \times C$ are isomorphic, then $B$ and $C$ are also isomorphic. That is, the common factor $A$ can be cancelled from both sides of the equation.]]></summary></entry><entry><title type="html">Welcome to my personal website</title><link href="/jekyll/update/2026/01/20/welcome.html" rel="alternate" type="text/html" title="Welcome to my personal website" /><published>2026-01-20T15:26:27+00:00</published><updated>2026-01-20T15:26:27+00:00</updated><id>/jekyll/update/2026/01/20/welcome</id><content type="html" xml:base="/jekyll/update/2026/01/20/welcome.html"><![CDATA[<p>My name is David Radcliffe. I am an independent
mathematician (Ph.D. 2001) and a software engineer
in Saint Paul, Minnesota.</p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[My name is David Radcliffe. I am an independent mathematician (Ph.D. 2001) and a software engineer in Saint Paul, Minnesota.]]></summary></entry></feed>