<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Malcolm Low</title>
    <description>The latest articles on DEV Community by Malcolm Low (@malcolmlow).</description>
    <link>https://dev.to/malcolmlow</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3894359%2F50ab9e6e-a918-40f1-b3b5-a7526195ffa6.jpg</url>
      <title>DEV Community: Malcolm Low</title>
      <link>https://dev.to/malcolmlow</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/malcolmlow"/>
    <language>en</language>
    <item>
      <title>The Curious Case of 1/998001: Missing Number &amp; Math Guide</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Sat, 03 Oct 2026 04:55:36 +0000</pubDate>
      <link>https://dev.to/malcolmlow/the-curious-case-of-1998001-missing-number-math-guide-5db4</link>
      <guid>https://dev.to/malcolmlow/the-curious-case-of-1998001-missing-number-math-guide-5db4</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://malcolmlow.com/2025/08/06/mathematical-patterns-the-curious-case-of-1-998001/" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Quick Answer &amp;amp; Key Insight: Why Does 1/998001 Generate All 3-Digit Numbers?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Yes, 1/998001 generates every 3-digit sequence.&lt;/strong&gt; Because 998001 equals $999^2$, the decimal expansion cascades through consecutive integers, but carrying digits at the 998th block creates an unexpected loop trap that skips 998. See the mathematical proof and sequence breakdown table below →&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mathematics reveals elegant patterns in unexpected places. Consider the fraction $\frac{1}{998001}$, which equals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.000001002003004005006...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the pattern: it contains every three-digit integer in sequential ascending order (&lt;code&gt;000&lt;/code&gt;, &lt;code&gt;001&lt;/code&gt;, &lt;code&gt;002&lt;/code&gt;, &lt;code&gt;003&lt;/code&gt;, &lt;code&gt;004&lt;/code&gt;, &lt;code&gt;005&lt;/code&gt;...).&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Power-of-10 Denominator Family
&lt;/h2&gt;

&lt;p&gt;This phenomenon occurs because $998001 = 999^2$. Similar cascading patterns emerge in related fractions based on $10^k - 1$:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$\frac{1}{9} = 0.111111\dots$ (repeating 1-digit sequence)&lt;/li&gt;
&lt;li&gt;$\frac{1}{99} = 0.010101\dots$ (repeating 2-digit sequence)&lt;/li&gt;
&lt;li&gt;$\frac{1}{999} = 0.001001001\dots$ (repeating 3-digit sequence)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When we square the denominator, something extraordinary happens. &lt;/p&gt;

&lt;p&gt;Consider $\frac{1}{9^2} = \frac{1}{81}$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 / 81 = 0.012345679012345679...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that it generates all digits from &lt;code&gt;0&lt;/code&gt; to &lt;code&gt;9&lt;/code&gt; in order, &lt;strong&gt;except the number 8 is skipped&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Similarly, $\frac{1}{99^2} = \frac{1}{9801}$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 / 9801 = 0.000102030405...9697990001...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It generates all 2-digit numbers &lt;code&gt;00&lt;/code&gt; to &lt;code&gt;99&lt;/code&gt;, &lt;strong&gt;except 98 is skipped&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;And for $\frac{1}{999^2} = \frac{1}{998001}$, it generates all 3-digit numbers from &lt;code&gt;000&lt;/code&gt; to &lt;code&gt;999&lt;/code&gt;, &lt;strong&gt;except 998 is skipped&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Mathematical Proof: The Series Expansion
&lt;/h2&gt;

&lt;p&gt;To understand why this happens, consider the Taylor series for $\frac{1}{(1 - x)^2}$:&lt;/p&gt;

&lt;p&gt;$$\frac{1}{(1 - x)^2} = \sum_{n=1}^{\infty} n x^{n-1} = 1 + 2x + 3x^2 + 4x^3 + 5x^4 + \dots$$&lt;/p&gt;

&lt;p&gt;Let $x = 10^{-3} = \frac{1}{1000}$. Then:&lt;/p&gt;

&lt;p&gt;$$1 - x = 1 - \frac{1}{1000} = \frac{999}{1000}$$&lt;/p&gt;

&lt;p&gt;$$(1 - x)^2 = \left(\frac{999}{1000}\right)^2 = \frac{998001}{1000000}$$&lt;/p&gt;

&lt;p&gt;Taking the reciprocal:&lt;/p&gt;

&lt;p&gt;$$\frac{1}{(1 - x)^2} = \frac{1000000}{998001} = 1 + \frac{2}{1000} + \frac{3}{1000^2} + \frac{4}{1000^3} + \dots$$&lt;/p&gt;

&lt;p&gt;Dividing both sides by $10^6$:&lt;/p&gt;

&lt;p&gt;$$\frac{1}{998001} = \sum_{n=1}^{\infty} n \cdot 10^{-3(n+1)} = \frac{1}{1000^2} + \frac{2}{1000^3} + \frac{3}{1000^4} + \dots$$&lt;/p&gt;

&lt;p&gt;Written out in decimal form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  0.000001
+ 0.000000002
+ 0.000000000003
+ 0.000000000000004
...
= 0.000 001 002 003 004 005 ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Why is 998 Missing?
&lt;/h2&gt;

&lt;p&gt;Every term adds an increment of $+1$ to its respective 3-digit block. However, what happens when $n = 998$, $999$, and $1000$?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For $n = 998$, the block is &lt;code&gt;... 997 [998] ...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;For $n = 999$, the block is &lt;code&gt;... [999] ...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;For $n = 1000$, we have &lt;strong&gt;four digits&lt;/strong&gt;! The leading digit &lt;code&gt;1&lt;/code&gt; cannot fit in the 3-digit slot, so it &lt;strong&gt;carries over&lt;/strong&gt; into the preceding block:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;$$\dots 998 + 1 \text{ (carry)} = 999$$&lt;/p&gt;

&lt;p&gt;The cascading carry propagates backward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Block $999 + 1 = 1000$, which carries &lt;code&gt;1&lt;/code&gt; into the $998$ block.&lt;/li&gt;
&lt;li&gt;The $998$ block receives the carry: $998 + 1 = 999$.&lt;/li&gt;
&lt;li&gt;The $999$ block itself becomes &lt;code&gt;000&lt;/code&gt; (since its 1 was carried from the 1000 block).&lt;/li&gt;
&lt;li&gt;Thus, the sequence outputs &lt;code&gt;... 996, 997, 999, 000, 001 ...&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The number 998 is absorbed by the carry from 999 and 1000!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Python Verification Script
&lt;/h2&gt;

&lt;p&gt;You can verify this in Python using the &lt;code&gt;decimal&lt;/code&gt; module with high precision:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;decimal&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getcontext&lt;/span&gt;

&lt;span class="c1"&gt;# Set precision to 3000 decimal places (999 * 3 digits)
&lt;/span&gt;&lt;span class="nf"&gt;getcontext&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;prec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3010&lt;/span&gt;

&lt;span class="n"&gt;fraction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;998001&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dec_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fraction&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Extract 3-digit blocks
&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dec_str&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dec_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;First 10 blocks: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Blocks around 998: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;995&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1002&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Check missing number
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Missing block found: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;First 10 blocks: ['000', '001', '002', '003', '004', '005', '006', '007', '008', '009']
Blocks around 998: ['995', '996', '997', '999', '000', '001', '002']
Missing block found: 998
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Frequently Asked Questions (FAQ)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why does 1/998001 generate all 3-digit numbers?
&lt;/h3&gt;

&lt;p&gt;1/998001 equals $1/(999^2)$. Expanding $1/(10^3 - 1)^2$ produces the series $\sum n \cdot 10^{-3(n+1)}$, yielding consecutive 3-digit blocks &lt;code&gt;000&lt;/code&gt;, &lt;code&gt;001&lt;/code&gt;, &lt;code&gt;002&lt;/code&gt;, &lt;code&gt;003&lt;/code&gt;... in ascending order.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is 998 missing in the decimal expansion of 1/998001?
&lt;/h3&gt;

&lt;p&gt;The number 998 is skipped because the addition of subsequent carried terms (specifically 999 and 1000) cascades into the 998 block, turning 998 into 999 and resetting the sequence counter.&lt;/p&gt;

&lt;h3&gt;
  
  
  What practical applications do these repeating fractions have?
&lt;/h3&gt;

&lt;p&gt;These properties underpin cyclic decimal algorithms, pseudo-random number generation, digital filter design, and error-correcting codes where dense periodic bit sequences are required.&lt;/p&gt;

</description>
      <category>math</category>
      <category>algorithms</category>
      <category>python</category>
      <category>compsci</category>
    </item>
    <item>
      <title>Drawing Quantum Diagrams with Matplotlib on Android Termux</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Fri, 02 Oct 2026 23:59:52 +0000</pubDate>
      <link>https://dev.to/malcolmlow/drawing-quantum-diagrams-with-matplotlib-on-android-termux-3k9g</link>
      <guid>https://dev.to/malcolmlow/drawing-quantum-diagrams-with-matplotlib-on-android-termux-3k9g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Part of the &lt;a href="https://malcolmlow.com/2026/06/26/quantum-computing-a-complete-learning-path/" rel="noopener noreferrer"&gt;Quantum Computing: A Complete Learning Path&lt;/a&gt; and &lt;a href="https://malcolmlow.com/2026/09/18/run-google-antigravity-cli-termux-proot/" rel="noopener noreferrer"&gt;Developer Workflows on Termux&lt;/a&gt; series on &lt;a href="https://malcolmlow.com" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rendering publication-grade quantum state diagrams directly on an Android device is surprisingly practical. With modern high-resolution mobile screens and terminal environments like &lt;strong&gt;Termux&lt;/strong&gt;, you can generate vector charts, calculate unitary matrix transformations, and export WebP figures on the go.&lt;/p&gt;

&lt;p&gt;However, anyone who has tried running &lt;code&gt;pip install qiskit&lt;/code&gt; directly on Termux knows the pain: modern Qiskit requires a Rust toolchain (&lt;code&gt;qiskit-aer&lt;/code&gt; and core binaries) that often fails to compile on mobile ARM64 or exhausts device memory during wheel builds.&lt;/p&gt;

&lt;p&gt;In this guide, we walk through a &lt;strong&gt;lean, tested workflow&lt;/strong&gt; for rendering multi-panel 3D Bloch sphere progression diagrams (tracking Pauli $X$, Hadamard $H$, and Pauli $Z$ gates) on Android Termux using &lt;strong&gt;pure NumPy, Matplotlib, and a lightweight standalone loader&lt;/strong&gt;—no Rust compiler required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Answer &amp;amp; Key Insight
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can you render 3D Bloch spheres and quantum circuits on Android Termux without building full Qiskit?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Yes, you can generate 3D Bloch spheres on Termux using pure NumPy and Matplotlib.&lt;/strong&gt; Full Qiskit wheel builds frequently crash mobile devices due to Rust compiler memory exhaustion. By dynamically isolating Qiskit's pure-Python &lt;code&gt;bloch.py&lt;/code&gt; module and computing state evolution with 2x2 NumPy matrix operators, you generate identical publication-grade figures in seconds without compiling heavy binaries.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. What Was Tested
&lt;/h2&gt;

&lt;p&gt;The workflow was verified on an Android ARM64 device running &lt;strong&gt;Termux&lt;/strong&gt; under the standard user environment (no root required):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python:&lt;/strong&gt; 3.12+ (Termux packages)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Libraries:&lt;/strong&gt; &lt;code&gt;numpy&lt;/code&gt;, &lt;code&gt;matplotlib&lt;/code&gt;, &lt;code&gt;cwebp&lt;/code&gt; (libwebp)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagram:&lt;/strong&gt; 3 rows × 2 columns of 3D Bloch spheres (X, H, and Z gate before/after states)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output:&lt;/strong&gt; High-resolution WebP image under 150 KB with crisp vector typography&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Install Termux Prerequisites
&lt;/h2&gt;

&lt;p&gt;Open Termux and install Python, Clang, and Matplotlib's system dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkg update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pkg upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
pkg &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; python python-numpy python-matplotlib libpng libjpeg-turbo libwebp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify your Matplotlib installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import matplotlib, numpy; print('Matplotlib:', matplotlib.__version__, '| NumPy:', numpy.__version__)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. When Full Qiskit Will Not Install
&lt;/h2&gt;

&lt;p&gt;Running &lt;code&gt;pip install qiskit&lt;/code&gt; on native Android Termux typically fails with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error: can't find Rust compiler
...
Building wheel for qiskit-aer (setup.py) ... error: killed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if you install the &lt;code&gt;rust&lt;/code&gt; package via &lt;code&gt;pkg install rust&lt;/code&gt;, compiling Qiskit’s core C/Rust extensions takes 30–45 minutes and often triggers the Linux Out-Of-Memory (OOM) killer on phones with less than 8 GB of RAM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; We don't need the entire quantum simulator just to draw a Bloch sphere! Qiskit's &lt;code&gt;Bloch&lt;/code&gt; class is written in &lt;strong&gt;pure Python&lt;/strong&gt; using Matplotlib 3D axes (&lt;code&gt;mpl_toolkits.mplot3d&lt;/code&gt;). We can download the pinned Qiskit source tarball, extract only &lt;code&gt;qiskit/visualization/bloch.py&lt;/code&gt;, and dynamically import it into our script.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The Lean Standalone Bloch Loader
&lt;/h2&gt;

&lt;p&gt;Run this one-time command in Termux to download and extract the visualizer module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/tmp/qiskit-source
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/tmp/qiskit-source
curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://github.com/Qiskit/qiskit/archive/refs/tags/2.5.2.tar.gz &lt;span class="nt"&gt;-o&lt;/span&gt; qiskit-2.5.2.tar.gz
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; qiskit-2.5.2.tar.gz qiskit-2.5.2/qiskit/visualization/bloch.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, create your standalone generator script &lt;code&gt;generate_bloch.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;importlib.util&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Locate the standalone bloch.py module
&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.5.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;bloch_source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PREFIX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/data/data/com.termux/files/usr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tmp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qiskit-source&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qiskit-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qiskit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;visualization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bloch.py&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Stub minimal Qiskit visualization namespace
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;matplotlib_close_if_inline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_figure&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="n"&gt;visualization_pkg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ModuleType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qiskit.visualization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;visualization_pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__path__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;utils_module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ModuleType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qiskit.visualization.utils&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;utils_module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;matplotlib_close_if_inline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;matplotlib_close_if_inline&lt;/span&gt;

&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qiskit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ModuleType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qiskit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qiskit.visualization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;visualization_pkg&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qiskit.visualization.utils&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;utils_module&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Dynamically import the Bloch class
&lt;/span&gt;&lt;span class="n"&gt;spec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;importlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;util&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spec_from_file_location&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qiskit.visualization.bloch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bloch_source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;importlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;util&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;module_from_spec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;
&lt;span class="n"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exec_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Bloch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bloch&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Pure NumPy state vector coordinate calculation
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bloch_vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Converts a 2-element complex state vector [alpha, beta] to [x, y, z].&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;beta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;
    &lt;span class="n"&gt;overlap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;conj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;beta&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;real&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# 5. Define Unitary Operators
&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;complex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;x_gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;complex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;h_gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;complex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;z_gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;complex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# State progressions
&lt;/span&gt;&lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x_gate&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;zero&lt;/span&gt;
&lt;span class="n"&gt;plus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h_gate&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;zero&lt;/span&gt;
&lt;span class="n"&gt;minus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;z_gate&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;plus&lt;/span&gt;

&lt;span class="c1"&gt;# Verify unit normalization
&lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;states&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minus&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;titles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X input: $|0\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X output: $|1\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;H input: $|0\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;H output: $|+\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Z input: $|+\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Z output: $|-\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;colors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#1565C0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#D32F2F&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="c1"&gt;# 6. Render the 3x2 Figure
&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;9.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;12.6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;white&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;titles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;axis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;projection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sphere&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Bloch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sphere&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$|+\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$|-\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;sphere&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vector_color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;sphere&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_vectors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bloch_vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;sphere&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Annotate Gate labels along the left margin
&lt;/span&gt;&lt;span class="n"&gt;gate_labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X gate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.805&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;H gate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.495&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Z gate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.185&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_pos&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;gate_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;center&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;center&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;suptitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bloch-Sphere Gate Order: X, then H, then Z&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.98&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bloch_progression.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dpi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tight&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✓ Rendered bloch_progression.png in &amp;lt; 3 seconds!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Convert PNG to High-Performance WebP
&lt;/h2&gt;

&lt;p&gt;Matplotlib outputs high-DPI PNGs, but for web publishing, converting to lossy WebP dramatically reduces file size while retaining crystal-clear vector line rendering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python generate_bloch.py
cwebp &lt;span class="nt"&gt;-q&lt;/span&gt; 88 bloch_progression.png &lt;span class="nt"&gt;-o&lt;/span&gt; bloch_progression.webp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Original PNG:&lt;/strong&gt; ~1.4 MB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebP Output:&lt;/strong&gt; ~128 KB (&lt;strong&gt;91% reduction&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Problems Encountered and Their Fixes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue Encountered&lt;/th&gt;
&lt;th&gt;Root Cause&lt;/th&gt;
&lt;th&gt;Working Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;No module named 'mpl_toolkits.mplot3d'&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Incomplete Matplotlib build&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;pkg install python-matplotlib&lt;/code&gt; instead of pip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Matplotlib GUI window fails&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Termux has no X11/Wayland display by default&lt;/td&gt;
&lt;td&gt;Use non-interactive backend: &lt;code&gt;plt.switch_backend('Agg')&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Labels truncated at figure boundaries&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complex 3D subplots clipping margins&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;bbox_inches="tight"&lt;/code&gt; and adjust &lt;code&gt;figsize&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LaTeX math font syntax errors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Missing system LaTeX distribution&lt;/td&gt;
&lt;td&gt;Matplotlib's built-in &lt;code&gt;mathtext&lt;/code&gt; parser handles &lt;code&gt;$...$&lt;/code&gt; without LaTeX installed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I run Qiskit Aer simulations on Termux?
&lt;/h3&gt;

&lt;p&gt;Yes, but running Qiskit Aer reliably on Termux requires using &lt;strong&gt;PRoot Debian or Ubuntu&lt;/strong&gt; (&lt;code&gt;pkg install proot-distro&lt;/code&gt;), which provides pre-compiled glibc ARM64 Linux wheels rather than compiling against Android Bionic libc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not just use matplotlib-inline?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;matplotlib-inline&lt;/code&gt; is designed for interactive Jupyter notebooks. For headless mobile scripting and automation pipelines, using Matplotlib's &lt;code&gt;Agg&lt;/code&gt; backend and exporting directly to disk is significantly faster and requires zero server overhead.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://malcolmlow.com/2026/09/11/draw-bloch-sphere-qiskit-termux-wordpress/" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>quantum</category>
      <category>python</category>
      <category>android</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Bloch Sphere Visual Guide: Basis States |0⟩, |1⟩, and Pauli X &amp; Z Gates</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Fri, 02 Oct 2026 23:58:08 +0000</pubDate>
      <link>https://dev.to/malcolmlow/bloch-sphere-visual-guide-basis-states-0-1-and-pauli-x-z-gates-3df6</link>
      <guid>https://dev.to/malcolmlow/bloch-sphere-visual-guide-basis-states-0-1-and-pauli-x-z-gates-3df6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Module 2&lt;/strong&gt; in the &lt;a href="https://malcolmlow.com/2026/06/26/quantum-computing-a-complete-learning-path/" rel="noopener noreferrer"&gt;Quantum Computing: A Complete Learning Path&lt;/a&gt; series on &lt;a href="https://malcolmlow.com" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;. Following our &lt;a href="https://malcolmlow.com/2025/11/27/introduction-to-quantum-computing-qubits-hadamard-gates-and-superposition/" rel="noopener noreferrer"&gt;Introduction to Qubits and Superposition&lt;/a&gt; (Module 1), this guide establishes the 3D geometric intuition for single-qubit quantum states and rotations before moving to &lt;a href="https://malcolmlow.com/2026/09/26/two-qubit-entanglement-four-bell-states-qiskit/" rel="noopener noreferrer"&gt;Two-Qubit Entanglement&lt;/a&gt; (Module 3).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every single-qubit quantum state lives on the surface of a unit sphere in three-dimensional Euclidean space: the &lt;strong&gt;Bloch sphere&lt;/strong&gt;. While classical bits are confined to discrete binary values $0$ and $1$, a qubit can point in any direction defined by spherical coordinates $(\theta, \phi)$.&lt;/p&gt;

&lt;p&gt;Yet many beginners struggle to bridge the algebraic definition of a state $|\psi\rangle = \alpha |0\rangle + \beta |1\rangle$ with its physical geometry. Why is $|1\rangle$ at the South Pole when classical intuition expects it to be 90° away from $|0\rangle$? How does an $X$ gate flip a state without changing relative phase? And how does a $Z$ gate alter quantum information if it never changes measurement probabilities in the computational basis?&lt;/p&gt;

&lt;p&gt;In this guide, we break down single-qubit geometry from first principles: deriving the polar angles $\theta$ and $\phi$, tracking the basis states $|0\rangle$ and $|1\rangle$, visualizing the equatorial superposition states $|+\rangle$ and $|-\rangle$, analyzing how the Pauli $X$, Hadamard $H$, and Pauli $Z$ gates rotate vectors, and verifying the complete transformation with runnable &lt;strong&gt;Qiskit&lt;/strong&gt; visualization code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Answer &amp;amp; Key Insight
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How do Pauli X and Z gates rotate qubit states on the Bloch sphere?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Yes, Pauli X and Z gates flip states on the sphere.&lt;/strong&gt; The Pauli $X$ gate rotates the qubit state vector by $\pi$ radians (180°) around the x-axis, flipping computational basis state $|0\rangle$ to $|1\rangle$. The Pauli $Z$ gate rotates the state vector by $\pi$ radians around the z-axis, leaving $|0\rangle$ and $|1\rangle$ unchanged in probability while flipping relative phase on equatorial superposition states (transforming $|+\rangle$ to $|-\rangle$). Blindly rotating qubits without tracking orthogonal axes causes fatal phase errors in quantum algorithms.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. Why the Bloch Sphere Works: Geometry of a Pure State
&lt;/h2&gt;

&lt;p&gt;A pure single-qubit state is a normalized vector in two-dimensional complex Hilbert space $\mathbb{C}^2$:&lt;/p&gt;

&lt;p&gt;$$|\psi\rangle = \alpha |0\rangle + \beta |1\rangle, \quad |\alpha|^2 + |\beta|^2 = 1$$&lt;/p&gt;

&lt;p&gt;Because physical measurements depend only on relative phase (global phase factor $e^{i\gamma}$ is unobservable), any pure state can be uniquely parameterized by two real angles $\theta \in [0, \pi]$ and $\phi \in [0, 2\pi)$:&lt;/p&gt;

&lt;p&gt;$$|\psi\rangle = \cos\left(\frac{\theta}{2}\right) |0\rangle + e^{i\phi} \sin\left(\frac{\theta}{2}\right) |1\rangle$$&lt;/p&gt;

&lt;p&gt;This corresponds directly to a unit vector $\vec{r} = (x, y, z)$ on the 3D Bloch sphere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$x = \sin\theta \cos\phi$&lt;/li&gt;
&lt;li&gt;$y = \sin\theta \sin\phi$&lt;/li&gt;
&lt;li&gt;$z = \cos\theta$&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why the Half-Angle $\theta/2$?
&lt;/h3&gt;

&lt;p&gt;Notice that $\theta$ ranges from $0$ to $\pi$ (180°), but $\theta/2$ ranges from $0$ to $\pi/2$ (90°). This mathematical half-angle is the key: &lt;strong&gt;orthogonal quantum states (90° in Hilbert space) are mapped to antipodal points (180° apart) on the Bloch sphere&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Basis States and the Equatorial Plane
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhgby0aj3omty40bcq479.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhgby0aj3omty40bcq479.webp" alt="Bloch Sphere Basis States and Superpositions" width="799" height="286"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Figure 1:&lt;/strong&gt; Computational basis states at the poles vs. equal superposition states on the equatorial plane.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Computational Basis (Z-Axis Poles)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;North Pole ($z = +1$):&lt;/strong&gt; $\theta = 0 \implies |\psi\rangle = |0\rangle$&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;South Pole ($z = -1$):&lt;/strong&gt; $\theta = \pi \implies |\psi\rangle = |1\rangle$&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because $|0\rangle$ and $|1\rangle$ lie at opposite poles, any state along the z-axis has a well-defined probability of collapsing into classical bits when measured.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Equatorial Plane (X and Y Axes)
&lt;/h3&gt;

&lt;p&gt;When $\theta = \pi/2$, $\cos(\pi/4) = \sin(\pi/4) = 1/\sqrt{2}$. The qubit has an equal 50/50 probability of yielding $0$ or $1$:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Positive X-Axis ($+x$):&lt;/strong&gt; $\phi = 0 \implies |+\rangle = \frac{|0\rangle + |1\rangle}{\sqrt{2}}$&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Negative X-Axis ($-x$):&lt;/strong&gt; $\phi = \pi \implies |-\rangle = \frac{|0\rangle - |1\rangle}{\sqrt{2}}$&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Positive Y-Axis ($+y$):&lt;/strong&gt; $\phi = \pi/2 \implies |+i\rangle = \frac{|0\rangle + i|1\rangle}{\sqrt{2}}$&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Negative Y-Axis ($-y$):&lt;/strong&gt; $\phi = 3\pi/2 \implies |-i\rangle = \frac{|0\rangle - i|1\rangle}{\sqrt{2}}$&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  3. The Pauli X Gate: 180° Rotation Around the X-Axis
&lt;/h2&gt;

&lt;p&gt;The Pauli $X$ gate represents quantum bit-flip logic:&lt;/p&gt;

&lt;p&gt;$$X = \begin{pmatrix} 0 &amp;amp; 1 \ 1 &amp;amp; 0 \end{pmatrix}$$&lt;/p&gt;

&lt;p&gt;Geometrically, $X$ rotates the state vector by $\pi$ radians around the &lt;strong&gt;x-axis&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$X |0\rangle = |1\rangle$ (North Pole rotates through the equator to South Pole)&lt;/li&gt;
&lt;li&gt;$X |1\rangle = |0\rangle$ (South Pole rotates back to North Pole)&lt;/li&gt;
&lt;li&gt;$X |+\rangle = |+\rangle$ (State along the x-axis is an eigenstate and remains unchanged!)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  4. The Hadamard Gate: Bridging Poles and Equator
&lt;/h2&gt;

&lt;p&gt;The Hadamard gate $H$ creates quantum superposition:&lt;/p&gt;

&lt;p&gt;$$H = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 &amp;amp; 1 \ 1 &amp;amp; -1 \end{pmatrix}$$&lt;/p&gt;

&lt;p&gt;Geometrically, $H$ is a 180° rotation around the &lt;strong&gt;diagonal $(x + z)$ axis&lt;/strong&gt;. It swaps the computational basis with the Hadamard basis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$H |0\rangle = |+\rangle$ (Moves North Pole to positive x-axis)&lt;/li&gt;
&lt;li&gt;$H |1\rangle = |-\rangle$ (Moves South Pole to negative x-axis)&lt;/li&gt;
&lt;li&gt;$H |+\rangle = |0\rangle$ and $H |-\rangle = |1\rangle$ (Reversible self-inverse: $H^2 = I$)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  5. The Pauli Z Gate: 180° Phase Rotation Around the Z-Axis
&lt;/h2&gt;

&lt;p&gt;The Pauli $Z$ gate represents phase-flip logic:&lt;/p&gt;

&lt;p&gt;$$Z = \begin{pmatrix} 1 &amp;amp; 0 \ 0 &amp;amp; -1 \end{pmatrix}$$&lt;/p&gt;

&lt;p&gt;Geometrically, $Z$ rotates the state vector by $\pi$ radians around the &lt;strong&gt;z-axis&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$Z |0\rangle = |0\rangle$ (North Pole lies on the rotation axis; unchanged)&lt;/li&gt;
&lt;li&gt;$Z |1\rangle = -|1\rangle$ (Global phase; probability unchanged)&lt;/li&gt;
&lt;li&gt;$Z |+\rangle = |-\rangle$ (Rotates the vector across the equatorial plane from $+x$ to $-x$!)&lt;/li&gt;
&lt;li&gt;$Z |-\rangle = |+\rangle$&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; A $Z$ gate does not change measurement outcomes in the computational basis ($|0\rangle$ vs $|1\rangle$), but it fundamentally flips quantum phase. In algorithms like Grover's search and Deutsch-Jozsa, this phase flip enables constructive and destructive interference.&lt;/p&gt;


&lt;h2&gt;
  
  
  6. X, H, and Z Transformations Side by Side
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5bss6cv24qhm0vaja1dx.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5bss6cv24qhm0vaja1dx.webp" alt="Bloch Sphere Gate Transformations" width="800" height="1137"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Figure 2:&lt;/strong&gt; Visual progression of quantum states under Pauli X, Hadamard H, and Pauli Z gate operations.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gate&lt;/th&gt;
&lt;th&gt;Matrix Operator&lt;/th&gt;
&lt;th&gt;Geometric Axis&lt;/th&gt;
&lt;th&gt;Input State&lt;/th&gt;
&lt;th&gt;Output State&lt;/th&gt;
&lt;th&gt;Physical Effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pauli X&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$\begin{pmatrix} 0 &amp;amp; 1 \ 1 &amp;amp; 0 \end{pmatrix}$&lt;/td&gt;
&lt;td&gt;Rotation by $\pi$ around $x$&lt;/td&gt;
&lt;td&gt;$&lt;/td&gt;
&lt;td&gt;0\rangle$&lt;/td&gt;
&lt;td&gt;$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hadamard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$\frac{1}{\sqrt{2}}\begin{pmatrix} 1 &amp;amp; 1 \ 1 &amp;amp; -1 \end{pmatrix}$&lt;/td&gt;
&lt;td&gt;Rotation by $\pi$ around $x+z$&lt;/td&gt;
&lt;td&gt;$&lt;/td&gt;
&lt;td&gt;0\rangle$&lt;/td&gt;
&lt;td&gt;$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pauli Z&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$\begin{pmatrix} 1 &amp;amp; 0 \ 0 &amp;amp; -1 \end{pmatrix}$&lt;/td&gt;
&lt;td&gt;Rotation by $\pi$ around $z$&lt;/td&gt;
&lt;td&gt;$&lt;/td&gt;
&lt;td&gt;+\rangle$&lt;/td&gt;
&lt;td&gt;$&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  7. Python Verification in Qiskit
&lt;/h2&gt;

&lt;p&gt;You can generate this exact multi-panel 3D Bloch visualization using Qiskit and Matplotlib:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit.circuit.library&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HGate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;XGate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ZGate&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit.quantum_info&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Statevector&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit.visualization.bloch&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Bloch&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bloch_vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Calculates (x, y, z) Bloch coordinates from a 2-element Statevector.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;beta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
    &lt;span class="n"&gt;overlap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;conj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;beta&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;real&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Define base states
&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Statevector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;XGate&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;plus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HGate&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;minus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ZGate&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equiv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Statevector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;plus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equiv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Statevector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;minus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equiv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Statevector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X gate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Input: $|0\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Output: $|1\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;H gate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Input: $|0\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Output: $|+\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Z gate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Input: $|+\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Output: $|-\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;9.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;12.6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;white&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;before_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;after_title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;column_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;before_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#1565C0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;after_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#D32F2F&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;axis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row_index&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;column_index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;projection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sphere&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Bloch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sphere&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$|+\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$|-\rangle$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;sphere&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vector_color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;sphere&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_vectors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bloch_vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;sphere&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.805&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;row_index&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;center&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;center&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;suptitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bloch-Sphere Gate Progression: X, then H, then Z&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.98&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bloch_progression.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dpi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Saved bloch_progression.png successfully!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Summary &amp;amp; Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Orthogonality vs. Antipodality:&lt;/strong&gt; In Hilbert space, orthogonal states $|0\rangle$ and $|1\rangle$ have zero inner product ($\langle 0|1\rangle = 0$). On the Bloch sphere, they point in opposite directions (separated by 180°).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-Qubit Unitaries are Rotations:&lt;/strong&gt; Every single-qubit quantum gate is isomorphic to an $SO(3)$ rotation of the Bloch sphere around some axis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Foundation of Entanglement:&lt;/strong&gt; The Bloch sphere only describes pure single-qubit states. As soon as two qubits become entangled, individual Bloch vectors shrink inside the sphere, representing mixed states.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why is |1⟩ at the South Pole instead of 90° away from |0⟩?
&lt;/h3&gt;

&lt;p&gt;Because of the mathematical half-angle factor $\theta/2$ in the Bloch parametrization $|\psi\rangle = \cos(\theta/2)|0\rangle + e^{i\phi}\sin(\theta/2)|1\rangle$. While $|0\rangle$ and $|1\rangle$ are orthogonal in complex vector space (90°), their geometric representation maps $\theta = \pi$ (180°), placing them at antipodal poles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the Pauli Z gate change measurement probabilities?
&lt;/h3&gt;

&lt;p&gt;Not in the computational basis. For computational states $|0\rangle$ and $|1\rangle$, the $Z$ gate leaves measurement probabilities at 100%. However, for superposition states like $|+\rangle$, $Z$ flips the relative phase to $|-\rangle$, which can be detected with 100% certainty by measuring in the Hadamard basis.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://malcolmlow.com/2026/09/03/bloch-sphere-basis-states-x-z-gates/" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>quantum</category>
      <category>python</category>
      <category>qiskit</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Deutsch-Jozsa Algorithm Explained: Quantum Complexity &amp; Qiskit</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Fri, 02 Oct 2026 23:57:13 +0000</pubDate>
      <link>https://dev.to/malcolmlow/the-deutsch-jozsa-algorithm-explained-quantum-complexity-qiskit-33o7</link>
      <guid>https://dev.to/malcolmlow/the-deutsch-jozsa-algorithm-explained-quantum-complexity-qiskit-33o7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Part of the &lt;a href="https://malcolmlow.com/2026/06/26/quantum-computing-a-complete-learning-path/" rel="noopener noreferrer"&gt;Quantum Computing: A Complete Learning Path&lt;/a&gt; series on &lt;a href="https://malcolmlow.com" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;. Following our earlier analyses of the &lt;a href="https://malcolmlow.com/2025/12/09/deutschs-algorithm-in-quantum-computing-the-4-cases/" rel="noopener noreferrer"&gt;single-qubit Deutsch Algorithm&lt;/a&gt; and &lt;a href="https://malcolmlow.com/2025/12/09/understanding-phase-kickback-in-quantum-computing/" rel="noopener noreferrer"&gt;Phase Kickback&lt;/a&gt;, this guide scales the formulation to multi-qubit registers with the &lt;strong&gt;Deutsch-Jozsa Algorithm&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In 1985, David Deutsch proposed the first quantum algorithm that demonstrated a computational speedup over any classical counterpart, proving that quantum mechanics could evaluate a global property of a function faster than classical boolean logic. In 1992, together with Richard Jozsa, this was generalized into the &lt;strong&gt;Deutsch-Jozsa Algorithm&lt;/strong&gt;: the very first algorithm to exhibit an &lt;em&gt;exponential&lt;/em&gt; query separation between deterministic classical computation and exact quantum computing.&lt;/p&gt;

&lt;p&gt;While Deutsch's original prototype applied to single-bit inputs ($n=1$, yielding a factor-of-2 speedup), Deutsch-Jozsa scales to arbitrary $n$-bit registers ($n \ge 1$). In this guide, we break down the mathematical problem, detail the four canonical oracle implementations, derive how phase kickback and Hadamard interference eliminate the exponential query barrier, and demonstrate working code in modern &lt;strong&gt;Qiskit 2.x&lt;/strong&gt; with circuit diagrams.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Answer &amp;amp; Key Insight
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can the Deutsch-Jozsa algorithm determine if an arbitrary Boolean function is constant or balanced in a single evaluation?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Yes, Deutsch-Jozsa solves the promise problem in exactly 1 query ($O(1)$).&lt;/strong&gt; Classically, a deterministic computer must evaluate $2^{n-1} + 1$ states in the worst case—an exponential barrier that becomes intractable for even moderate register sizes ($n=30$ requires over 536 million queries). Quantum interference extracts the global function property in a single shot by exploiting phase kickback and destructive interference.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. The Problem: Constant vs. Balanced Boolean Functions
&lt;/h2&gt;

&lt;p&gt;We are given a black-box oracle that computes an unknown Boolean function taking an $n$-bit string and returning a single bit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f: {0, 1}ⁿ → {0, 1}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are promised that $f$ belongs strictly to one of two categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Constant:&lt;/strong&gt; The function returns the exact same value for all possible inputs ($f(x) = 0$ for all $x$, or $f(x) = 1$ for all $x$).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Balanced:&lt;/strong&gt; The function returns &lt;code&gt;0&lt;/code&gt; for exactly half of the $2^n$ inputs ($2^{n-1}$ states) and &lt;code&gt;1&lt;/code&gt; for the remaining half ($2^{n-1}$ states).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Objective:&lt;/strong&gt; Determine with 100% mathematical certainty whether $f$ is constant or balanced using the absolute minimum number of oracle evaluations.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Complexity Comparison: Exponential Separation
&lt;/h2&gt;

&lt;p&gt;Classically, if you query the oracle with an input $x_1$ and receive $f(x_1) = 0$, you learn nothing definitive. If your next query $x_2$ yields $f(x_2) = 1$, you immediately know $f$ is balanced (best-case: 2 queries). However, in the worst-case scenario, every input you test continues to return &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Because a balanced function has exactly $2^{n-1}$ zeros, observing $2^{n-1}$ zeros in a row still leaves the possibility that the remaining $2^{n-1}$ inputs are all ones (balanced) or all zeros (constant). To be 100% deterministic, a classical computer must evaluate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Classical Deterministic Queries (Worst-Case) = 2ⁿ⁻¹ + 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quantum computing solves this in &lt;strong&gt;exactly 1 query&lt;/strong&gt; ($O(1)$) with 100% certainty:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input Bits ($n$)&lt;/th&gt;
&lt;th&gt;Search Space ($2^n$)&lt;/th&gt;
&lt;th&gt;Classical Deterministic ($2^{n-1}+1$)&lt;/th&gt;
&lt;th&gt;Quantum ($O(1)$)&lt;/th&gt;
&lt;th&gt;Speedup Ratio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;n = 1 (Deutsch)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2 queries&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 query&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;n = 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;5 queries&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 query&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;n = 10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,024&lt;/td&gt;
&lt;td&gt;513 queries&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 query&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;513×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;n = 30&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~1.07 × 10⁹&lt;/td&gt;
&lt;td&gt;536,870,913 queries&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 query&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;gt; 5 × 10⁸×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3. The Mathematical Engine: Phase Kickback
&lt;/h2&gt;

&lt;p&gt;To compute $f(x)$ reversibly, quantum computers use a unitary oracle $U_f$ operating on an input register $|x\rangle$ and an auxiliary target qubit $|y\rangle$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;U_f |x⟩ |y⟩ = |x⟩ |y ⊕ f(x)⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rather than preparing the target qubit in $|0\rangle$, we prepare it in the anti-symmetric superposition state $|-\rangle = \frac{|0\rangle - |1\rangle}{\sqrt{2}}$ using an $X$ gate followed by a Hadamard $H$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;U_f |x⟩ |-⟩ = U_f |x⟩ [ (|0⟩ - |1⟩) / √2 ]
            = [ |x⟩ |0 ⊕ f(x)⟩ - |x⟩ |1 ⊕ f(x)⟩ ] / √2

• If f(x) = 0: [ |x⟩|0⟩ - |x⟩|1⟩ ] / √2 = (+1) |x⟩ |-⟩
• If f(x) = 1: [ |x⟩|1⟩ - |x⟩|0⟩ ] / √2 = (-1) |x⟩ |-⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In both cases, we can write the result compactly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;U_f |x⟩ |-⟩ = (-1)^{f(x)} |x⟩ |-⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bit $f(x)$ is not written to the target qubit at all—it is &lt;strong&gt;kicked back as an eigenvalue phase factor $(-1)^{f(x)}$&lt;/strong&gt; directly onto the input register state!&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Implementing All 4 Types of Oracles in Qiskit
&lt;/h2&gt;

&lt;p&gt;To understand how oracles are physically constructed, let us take a 3-qubit input register ($q_0, q_1, q_2$) with an auxiliary target qubit ($q_3$). Any Boolean function falls into one of four canonical implementations:&lt;/p&gt;

&lt;h3&gt;
  
  
  Oracle 1: Constant-0 ($f(x) = 0$ everywhere)
&lt;/h3&gt;

&lt;p&gt;Because $y \oplus 0 = y$, the target qubit is left completely untouched. The circuit is an empty identity wire:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ha92x6ts3s4bzygq6wb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ha92x6ts3s4bzygq6wb.png" alt="Oracle 1: Constant-0 Identity Circuit" width="260" height="545"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Figure 1 (Oracle 1):&lt;/strong&gt; Identity wire — target qubit &lt;code&gt;q_3&lt;/code&gt; remains unchanged.&lt;/p&gt;
&lt;h3&gt;
  
  
  Oracle 2: Constant-1 ($f(x) = 1$ everywhere)
&lt;/h3&gt;

&lt;p&gt;Because $y \oplus 1 = \bar{y}$, the target qubit must flip unconditionally for all inputs. We apply a single NOT ($X$) gate to $q_3$:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0h3vdj5hpva5lwy1o6zg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0h3vdj5hpva5lwy1o6zg.png" alt="Oracle 2: Constant-1 Inversion Circuit" width="318" height="545"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Figure 2 (Oracle 2):&lt;/strong&gt; Unconditional &lt;code&gt;X&lt;/code&gt; gate on &lt;code&gt;q_3&lt;/code&gt; — imparts an unobservable global minus sign.&lt;/p&gt;
&lt;h3&gt;
  
  
  Oracle 3: Balanced Direct ($f(x) = x_0 \oplus x_2$)
&lt;/h3&gt;

&lt;p&gt;To create a balanced function, we can compute an inner product or parity check. In this example, CNOTs are placed on $q_0$ and $q_2$ targeting $q_3$, leaving $q_1$ unattached:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fazy0b9ld278h1htx7ufc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fazy0b9ld278h1htx7ufc.png" alt="Oracle 3: Balanced Direct Parity Circuit" width="434" height="545"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Figure 3 (Oracle 3):&lt;/strong&gt; CNOT controls on &lt;code&gt;q_0&lt;/code&gt; and &lt;code&gt;q_2&lt;/code&gt; — evaluates &lt;code&gt;f(x) = x_0 ⊕ x_2&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Oracle 4: Balanced Inverted ($f(x) = \neg(x_0 \oplus x_2)$)
&lt;/h3&gt;

&lt;p&gt;This is the complement of Oracle 3 (inverting all outputs). We place CNOTs on $q_0$ and $q_2$, followed by an $X$ gate on target $q_3$:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu8a0htkghh5cemk3d9s7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu8a0htkghh5cemk3d9s7.png" alt="Oracle 4: Balanced Inverted Circuit" width="550" height="545"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Figure 4 (Oracle 4):&lt;/strong&gt; CNOT controls on &lt;code&gt;q_0&lt;/code&gt; and &lt;code&gt;q_2&lt;/code&gt; followed by NOT on &lt;code&gt;q_3&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Oracle Comparison Matrix
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Oracle Type&lt;/th&gt;
&lt;th&gt;Logic Equation&lt;/th&gt;
&lt;th&gt;Gates on Target ($q_3$)&lt;/th&gt;
&lt;th&gt;Measurement&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Constant-0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;f(x) = 0&lt;/td&gt;
&lt;td&gt;None (Wire)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;000 (100%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CONSTANT&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Constant-1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;f(x) = 1&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;000 (100%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CONSTANT&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Balanced Direct&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;f(x) = x₀ ⊕ x₂&lt;/td&gt;
&lt;td&gt;CX(q0) + CX(q2)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;101 (100%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;BALANCED&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Balanced Inverted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;f(x) = ¬(x₀ ⊕ x₂)&lt;/td&gt;
&lt;td&gt;CX(q0) + CX(q2) + X&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;101 (100%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;BALANCED&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  5. Full Circuit &amp;amp; Quantum Interference Derivation
&lt;/h2&gt;

&lt;p&gt;Here is the complete end-to-end Deutsch-Jozsa circuit for our 3-qubit balanced function ($f(x) = x_0 \oplus x_2$):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foki4dwk66qxhzhuupon7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foki4dwk66qxhzhuupon7.png" alt="Complete Deutsch-Jozsa Quantum Circuit" width="800" height="389"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Figure 5:&lt;/strong&gt; Complete Deutsch-Jozsa Circuit in Qiskit: State prep, superposition, oracle, interference Hadamards, and measurement.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Mathematical Interference:
&lt;/h3&gt;

&lt;p&gt;Before the final Hadamard transform, the input register is in the state:&lt;/p&gt;

&lt;p&gt;$$\frac{1}{\sqrt{2^n}} \sum_{x} (-1)^{f(x)} |x\rangle$$&lt;/p&gt;

&lt;p&gt;Applying the Walsh-Hadamard transform $H^{\otimes n}$ maps each basis state $|x\rangle$ to $\frac{1}{\sqrt{2^n}} \sum_{z} (-1)^{x \cdot z} |z\rangle$. The total state becomes:&lt;/p&gt;

&lt;p&gt;$$|\psi_{\text{final}}\rangle = \sum_{z} \left[ \frac{1}{2^n} \sum_{x} (-1)^{f(x) + x \cdot z} \right] |z\rangle$$&lt;/p&gt;

&lt;p&gt;When we measure, consider the probability amplitude of measuring the all-zero state $|00\dots 0\rangle$ (where $z = 00\dots 0 \implies x \cdot z = 0$):&lt;/p&gt;

&lt;p&gt;$$\alpha_{00\dots 0} = \frac{1}{2^n} \sum_{x \in {0, 1}^n} (-1)^{f(x)}$$&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If $f$ is Constant:&lt;/strong&gt; All $(-1)^{f(x)}$ have the same sign ($\pm 1$). The sum adds constructively: $\alpha_{00\dots 0} = \frac{1}{2^n} (\pm 2^n) = \pm 1$. The measurement probability is $|\pm 1|^2 = \mathbf{100\%}$. You will measure &lt;strong&gt;&lt;code&gt;00...0&lt;/code&gt; every single time&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If $f$ is Balanced:&lt;/strong&gt; Exactly $2^{n-1}$ inputs yield $+1$ and $2^{n-1}$ yield $-1$. The sum cancels out completely: $\alpha_{00\dots 0} = \frac{1}{2^n} (2^{n-1} - 2^{n-1}) = \mathbf{0}$. The probability of measuring all zeros is &lt;strong&gt;strictly 0%&lt;/strong&gt;! Any non-zero bitstring confirms $f$ is balanced.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  6. Complete Qiskit 2.x Python Implementation
&lt;/h2&gt;

&lt;p&gt;The script below builds, executes, and verifies all 4 oracles using modern Qiskit 2.x primitives (&lt;code&gt;StatevectorSampler&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QuantumCircuit&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit.primitives&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StatevectorSampler&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_oracle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oracle_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;QuantumCircuit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Builds one of the 4 canonical oracles on 4 qubits (q0, q1, q2 input; q3 target).&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;oracle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;QuantumCircuit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;oracle_type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;oracle_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;constant_0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Type 1: f(x) = 0 (Identity wire)
&lt;/span&gt;        &lt;span class="k"&gt;pass&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;oracle_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;constant_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Type 2: f(x) = 1 (Unconditional target flip)
&lt;/span&gt;        &lt;span class="n"&gt;oracle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;oracle_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;balanced_direct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Type 3: f(x) = x0 ^ x2 (CNOT parity on q0 and q2)
&lt;/span&gt;        &lt;span class="n"&gt;oracle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;oracle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;oracle_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;balanced_inverted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Type 4: f(x) = ~(x0 ^ x2) (CNOT parity + NOT gate)
&lt;/span&gt;        &lt;span class="n"&gt;oracle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;oracle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;oracle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unknown oracle type: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;oracle_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;oracle&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_deutsch_jozsa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oracle_circuit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;QuantumCircuit&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Wraps an oracle inside the full Deutsch-Jozsa algorithm and measures.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;QuantumCircuit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 1. State preparation: target qubit to |-&amp;gt;
&lt;/span&gt;    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;barrier&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. Insert the oracle
&lt;/span&gt;    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oracle_circuit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inplace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;barrier&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# 3. Interference decoding
&lt;/span&gt;    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c1"&gt;# 4. Measure input register
&lt;/span&gt;    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="c1"&gt;# Execute on StatevectorSampler
&lt;/span&gt;    &lt;span class="n"&gt;sampler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StatevectorSampler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sampler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;shots&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_counts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;verdict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CONSTANT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;000&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BALANCED&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verdict&lt;/span&gt;

&lt;span class="c1"&gt;# Execute and compare all 4 canonical oracles
&lt;/span&gt;&lt;span class="n"&gt;oracles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;constant_0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;constant_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;balanced_direct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;balanced_inverted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Oracle Type&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Measurement&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Decision&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;o_name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;oracles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;oracle_qc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_oracle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;full_qc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verdict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;run_deutsch_jozsa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oracle_qc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;o_name&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;verdict&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Execution Output:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Oracle Type          | Measurement  | Decision  
--------------------------------------------------
constant_0           | {'000': 100} | CONSTANT  
constant_1           | {'000': 100} | CONSTANT  
balanced_direct      | {'101': 100} | BALANCED  
balanced_inverted    | {'101': 100} | BALANCED  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Key Insights &amp;amp; Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Global Property vs. Local Evaluation:&lt;/strong&gt; The algorithm never tells you &lt;em&gt;which&lt;/em&gt; inputs produce &lt;code&gt;0&lt;/code&gt; or &lt;code&gt;1&lt;/code&gt;. It extracts only the collective structural property (constant vs. balanced) by harnessing destructive interference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase Kickback Converts Values to Geometry:&lt;/strong&gt; Setting the ancilla to $|-\rangle$ turns modular arithmetic ($y \oplus f(x)$) into spatial eigenvalue phase shifts ($(-1)^{f(x)}$).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Stepping Stone to Modern Quantum Algorithms:&lt;/strong&gt; Deutsch-Jozsa laid the direct mathematical groundwork for the &lt;strong&gt;Bernstein-Vazirani algorithm&lt;/strong&gt; (finding the hidden bitstring $s$), &lt;strong&gt;Simon’s algorithm&lt;/strong&gt;, and ultimately &lt;strong&gt;Shor’s algorithm&lt;/strong&gt; for integer factorization.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why does classical computing require 2^(n-1) + 1 evaluations for Deutsch-Jozsa?
&lt;/h3&gt;

&lt;p&gt;In the worst-case scenario, a balanced function might return the same value (e.g., 0) for the first $2^{n-1}$ inputs tested. Only on the $(2^{n-1} + 1)$-th query can a classical deterministic algorithm guarantee whether the remaining values are identical (constant) or inverted (balanced).&lt;/p&gt;

&lt;h3&gt;
  
  
  How does the Deutsch-Jozsa algorithm achieve 100% determinism?
&lt;/h3&gt;

&lt;p&gt;Through quantum phase kickback and Hadamard interference, all balanced states produce completely destructive interference at the $|00\dots 0\rangle$ basis state (amplitude = 0), while constant states produce completely constructive interference (amplitude = 1). Thus, observing all zeros confirms constant, while any non-zero measurement confirms balanced in a single shot.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://malcolmlow.com/2026/09/26/deutsch-jozsa-algorithm-quantum-vs-classical-complexity-qiskit/" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>quantum</category>
      <category>python</category>
      <category>qiskit</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Quantum Fourier Transform (QFT) of a Single Qubit: The Hadamard Transform</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Sun, 27 Sep 2026 05:13:51 +0000</pubDate>
      <link>https://dev.to/malcolmlow/quantum-fourier-transform-qft-of-a-single-qubit-the-hadamard-transform-5dc9</link>
      <guid>https://dev.to/malcolmlow/quantum-fourier-transform-qft-of-a-single-qubit-the-hadamard-transform-5dc9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Module 4&lt;/strong&gt; in the &lt;a href="https://malcolmlow.com/2026/06/26/quantum-computing-a-complete-learning-path/" rel="noopener noreferrer"&gt;Quantum Computing: A Complete Learning Path&lt;/a&gt; series. Bridging the transition from entangled communications in &lt;a href="https://malcolmlow.com/2026/09/27/superdense-coding-explained-qiskit/" rel="noopener noreferrer"&gt;Superdense Coding&lt;/a&gt; (Module 3b) and &lt;a href="https://malcolmlow.com/2026/09/26/two-qubit-entanglement-four-bell-states-qiskit/" rel="noopener noreferrer"&gt;Two-Qubit Entanglement&lt;/a&gt; (Module 3) to the multi-qubit Hadamard tools in &lt;a href="https://malcolmlow.com/2026/04/03/quantum-computing-the-walsh-hadamard-matrix-backbone-of-grovers-diffusion-operator/" rel="noopener noreferrer"&gt;The Walsh-Hadamard Matrix&lt;/a&gt; (Module 5).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;strong&gt;Quantum Fourier Transform (QFT)&lt;/strong&gt; is one of the most powerful subroutines in all of quantum algorithms. It serves as the mathematical engine powering &lt;strong&gt;Shor's Factoring Algorithm&lt;/strong&gt;, &lt;strong&gt;Quantum Phase Estimation (QPE)&lt;/strong&gt;, and quantum order finding. At first glance, the general $n$-qubit QFT formula appears formidable, laden with complex exponential phases and multi-controlled phase rotations.&lt;/p&gt;

&lt;p&gt;However, when stripped down to its absolute simplest case—a single qubit ($N = 2^1 = 2$)—an elegant mathematical symmetry emerges: &lt;strong&gt;the 1-qubit Quantum Fourier Transform is identical to the familiar Hadamard gate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this guide, we derive this equivalence from first principles, evaluate the basis states $|0\rangle$ and $|1\rangle$, inspect the matrix representation, and verify the equivalence in &lt;strong&gt;Qiskit 2.x&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The General Definition of the Quantum Fourier Transform
&lt;/h2&gt;

&lt;p&gt;In an $N$-dimensional Hilbert space with computational basis states ${|0\rangle, |1\rangle, \dots, |N-1\rangle}$, the Quantum Fourier Transform acts on a computational basis state $|x\rangle$ as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|x̃⟩ ≡ QFT |x⟩ ≡ ( 1 / √N ) ∑ [ e^(2π i x y / N) ] |y⟩    (summed from y = 0 to N - 1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just like the classical Discrete Fourier Transform (DFT), the QFT maps computational basis states into superpositions of states whose relative phases rotate at frequencies proportional to $x$. For an $n$-qubit quantum register, the dimension of the state space is $N = 2^n$.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Specializing to One Qubit (N = 2)
&lt;/h2&gt;

&lt;p&gt;Now, let us examine what happens when we set the number of qubits to $n = 1$, which gives &lt;strong&gt;$N = 2^1 = 2$&lt;/strong&gt;. The summation runs over only two values: $y = 0$ and $y = 1$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QFT |x⟩ = ( 1 / √2 ) ∑ [ e^(2π i x y / 2) ] |y⟩
        = ( 1 / √2 ) ∑ [ e^(i π x y) ] |y⟩
        = ( 1 / √2 ) [ e^(i π x · 0) |0⟩ + e^(i π x · 1) |1⟩ ]
        = ( 1 / √2 ) [ |0⟩ + e^(i π x) |1⟩ ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how drastically the phase factor simplifies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$e^{2\pi i x y / 2}$ simplifies immediately to $e^{i \pi x y}$.&lt;/li&gt;
&lt;li&gt;Because $y \in {0, 1}$, the first term is always $e^0 = 1$.&lt;/li&gt;
&lt;li&gt;This leaves only the single phase factor $e^{i \pi x}$ multiplying the $|1\rangle$ component.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Evaluating Basis States |0⟩ and |1⟩
&lt;/h2&gt;

&lt;p&gt;A single qubit has only two computational basis inputs: $x = 0$ and $x = 1$. Let us evaluate each:&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 1: When $x = 0$
&lt;/h3&gt;

&lt;p&gt;Substitute $x = 0$ into the phase term $e^{i \pi \cdot 0} = e^0 = 1$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QFT |0⟩ = ( 1 / √2 ) [ |0⟩ + e^(i π · 0) |1⟩ ]
        = ( |0⟩ + |1⟩ ) / √2
        = |+⟩ ≡ H |0⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Case 2: When $x = 1$
&lt;/h3&gt;

&lt;p&gt;Substitute $x = 1$ into the phase term using Euler's identity ($e^{i \pi} = -1$):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QFT |1⟩ = ( 1 / √2 ) [ |0⟩ + e^(i π · 1) |1⟩ ]
        = ( |0⟩ - |1⟩ ) / √2
        = |-⟩ ≡ H |1⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Matrix Identity
&lt;/h3&gt;

&lt;p&gt;Because the QFT transforms $|0\rangle \to |+\rangle$ and $|1\rangle \to |-\rangle$, its $2 \times 2$ unitary matrix representation is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;F₂ = ( 1 / √2 ) × [ [ 1,  1 ],
                    [ 1, -1 ] ] ≡ H
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thus, the single-qubit Quantum Fourier Transform and the single-qubit Hadamard gate are &lt;strong&gt;literally the exact same unitary operator&lt;/strong&gt;!&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Verifying the Equivalence in Qiskit 2.x
&lt;/h2&gt;

&lt;p&gt;In Qiskit 2.x, the Quantum Fourier Transform is available as &lt;code&gt;QFTGate&lt;/code&gt; in &lt;code&gt;qiskit.circuit.library&lt;/code&gt;. When we decompose a 1-qubit &lt;code&gt;QFTGate&lt;/code&gt;, Qiskit compiles it directly into a single &lt;code&gt;H&lt;/code&gt; gate:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc7luoaunspvffw81xvgp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc7luoaunspvffw81xvgp.png" alt="1-Qubit QFT Decomposed Circuit in Qiskit" width="272" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a reproducible script in &lt;strong&gt;Qiskit 2.x&lt;/strong&gt; verifying that the Frobenius norm difference between &lt;code&gt;QFTGate(1)&lt;/code&gt; and &lt;code&gt;Operator.from_label('H')&lt;/code&gt; is zero down to machine precision ($10^{-16}$):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QuantumCircuit&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit.circuit.library&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QFTGate&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit.quantum_info&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Operator&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Build circuit with 1-qubit QFT
&lt;/span&gt;&lt;span class="n"&gt;qc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;QuantumCircuit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;QFTGate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Decompose the gate into elementary operations
&lt;/span&gt;&lt;span class="n"&gt;qc_decomposed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decompose&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Decomposed 1-Qubit QFT Circuit:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qc_decomposed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Extract the Unitary Matrix Operators
&lt;/span&gt;&lt;span class="n"&gt;op_qft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Operator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
&lt;span class="n"&gt;op_hadamard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Operator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;H&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;1-Qubit QFT Matrix:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op_qft&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Standard Hadamard Matrix:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op_hadamard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Verify mathematical equivalence
&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op_qft&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;op_hadamard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Frobenius Norm Difference: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Equivalence Verified    : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op_qft&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;op_hadamard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Execution Output:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Decomposed 1-Qubit QFT Circuit:
   ┌───┐
q: ┤ H ├
   └───┘

1-Qubit QFT Matrix:
[[ 0.7071+0.j  0.7071+0.j]
 [ 0.7071+0.j -0.7071+0.j]]

Standard Hadamard Matrix:
[[ 0.7071+0.j  0.7071+0.j]
 [ 0.7071+0.j -0.7071+0.j]]

Frobenius Norm Difference: 2.38e-16
Equivalence Verified    : True
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is the QFT of one qubit the exact same as the Hadamard gate?
&lt;/h3&gt;

&lt;p&gt;Yes. Working through the $N = 2$ case of the QFT definition shows that $\text{QFT}|0\rangle = |+\rangle$ and $\text{QFT}|1\rangle = |-\rangle$, which are identical to the outputs of a Hadamard gate on the same inputs. For one qubit, QFT and $H$ are literally the exact same unitary operator.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the Quantum Fourier Transform used for in quantum algorithms?
&lt;/h3&gt;

&lt;p&gt;The QFT is the foundational engine of &lt;strong&gt;Quantum Phase Estimation (QPE)&lt;/strong&gt; and &lt;strong&gt;Shor's Factoring Algorithm&lt;/strong&gt;. It converts periodic phase differences into measurable computational basis states, allowing a quantum computer to find periods exponentially faster than any classical algorithm.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does the multi-qubit QFT generalize beyond 1 qubit?
&lt;/h3&gt;

&lt;p&gt;When multiple qubits are involved ($n &amp;gt; 1$), the QFT cannot be achieved with independent Hadamard gates alone. It requires an interlocking ladder of Hadamards and &lt;strong&gt;controlled phase rotation gates&lt;/strong&gt; ($R_k$), followed by SWAP gates to reverse qubit order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;R_k = [ [ 1,        0        ],
        [ 0,  e^(2π i / 2^k) ] ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 1-qubit case is the unique scenario where all controlled rotations vanish, leaving only the lone Hadamard transformation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Insights &amp;amp; Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One-Qubit Equivalence:&lt;/strong&gt; Setting $N = 2$ in the discrete quantum Fourier transform collapses the general phase sum to $(|0\rangle + e^{i \pi x}|1\rangle) / \sqrt{2}$.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Euler's Identity at Work:&lt;/strong&gt; Because $e^{i \pi \cdot 0} = +1$ and $e^{i \pi \cdot 1} = -1$, the QFT turns $|0\rangle \to |+\rangle$ and $|1\rangle \to |-\rangle$—the hallmark behavior of the Hadamard gate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Stepping Stone to Multi-Qubit QFT:&lt;/strong&gt; Understanding the 1-qubit case is essential before studying how controlled phase rotations generalize the QFT to Shor's algorithm and period finding.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Continue the Quantum Series
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;← Previous:&lt;/strong&gt; &lt;a href="https://malcolmlow.com/2026/09/27/superdense-coding-explained-qiskit/" rel="noopener noreferrer"&gt;Superdense Coding Explained: Transmitting 2 Classical Bits in 1 Qubit (Module 3b)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foundations:&lt;/strong&gt; &lt;a href="https://malcolmlow.com/2026/09/26/two-qubit-entanglement-four-bell-states-qiskit/" rel="noopener noreferrer"&gt;Two-Qubit Entanglement &amp;amp; The 4 Bell States (Module 3)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next:&lt;/strong&gt; &lt;a href="https://malcolmlow.com/2026/04/03/quantum-computing-the-walsh-hadamard-matrix-backbone-of-grovers-diffusion-operator/" rel="noopener noreferrer"&gt;The Walsh-Hadamard Matrix: Backbone of Grover's Diffusion Operator (Module 5)&lt;/a&gt; →&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roadmap:&lt;/strong&gt; &lt;a href="https://malcolmlow.com/2026/06/26/quantum-computing-a-complete-learning-path/" rel="noopener noreferrer"&gt;Quantum Computing: A Complete Learning Path&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>quantum</category>
      <category>python</category>
      <category>qiskit</category>
      <category>math</category>
    </item>
    <item>
      <title>Superdense Coding Explained: Transmitting 2 Classical Bits in 1 Qubit with Qiskit 2.x</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Sun, 27 Sep 2026 04:55:10 +0000</pubDate>
      <link>https://dev.to/malcolmlow/superdense-coding-explained-transmitting-2-classical-bits-in-1-qubit-with-qiskit-2x-4ihf</link>
      <guid>https://dev.to/malcolmlow/superdense-coding-explained-transmitting-2-classical-bits-in-1-qubit-with-qiskit-2x-4ihf</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Module 3b&lt;/strong&gt; in the &lt;a href="https://malcolmlow.com/2026/06/26/quantum-computing-a-complete-learning-path/" rel="noopener noreferrer"&gt;Quantum Computing: A Complete Learning Path&lt;/a&gt; series. Following directly from &lt;a href="https://malcolmlow.com/2026/09/26/two-qubit-entanglement-four-bell-states-qiskit/" rel="noopener noreferrer"&gt;Two-Qubit Entanglement &amp;amp; The 4 Bell States&lt;/a&gt; (Module 3) and bridging the transition to &lt;a href="https://malcolmlow.com/2026/06/24/quantum-teleportation-and-why-it-isnt-cloning/" rel="noopener noreferrer"&gt;Quantum Teleportation&lt;/a&gt; (Module 9).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In classical information theory, transmitting two bits of information (such as &lt;code&gt;00&lt;/code&gt;, &lt;code&gt;01&lt;/code&gt;, &lt;code&gt;10&lt;/code&gt;, or &lt;code&gt;11&lt;/code&gt;) strictly requires sending two physical signals. If you have only a single physical wire or send a single classical pulse, the laws of physics dictate that you can transmit at most one bit of data. In quantum information theory, a celebrated theorem known as &lt;strong&gt;Holevo's Bound (1973)&lt;/strong&gt; proved that an isolated single qubit can likewise communicate at most one bit of classical information.&lt;/p&gt;

&lt;p&gt;Yet, in 1992, physicists Charles Bennett and Stephen Wiesner discovered a startling loophole: if the sender and receiver share an entangled pair of qubits beforehand, the sender can physically transmit &lt;strong&gt;just one single qubit&lt;/strong&gt; and deliver &lt;strong&gt;two full classical bits&lt;/strong&gt; with 100% deterministic accuracy. This protocol is called &lt;strong&gt;Superdense Coding&lt;/strong&gt; (or Dense Coding). &lt;/p&gt;

&lt;p&gt;In this guide, we break down the mechanics of superdense coding, demonstrate how Alice transforms the shared Bell pair using local Pauli gates, analyze Bob's deterministic Bell decoder, and verify the protocol using &lt;strong&gt;Qiskit 2.x&lt;/strong&gt; with circuit diagrams.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Communication Limit: Holevo’s Bound vs. Entanglement
&lt;/h2&gt;

&lt;p&gt;To appreciate why superdense coding is remarkable, we must first understand the fundamental limit on quantum communication:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Holevo's Bound (Without Entanglement):
1 Transmitted Qubit → At most 1 Accessible Classical Bit

Superdense Coding (With 1 Pre-Shared Bell Pair):
1 Transmitted Qubit → Exactly 2 Accessible Classical Bits
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even though a single qubit pure state $|\psi\rangle = \alpha|0\rangle + \beta|1\rangle$ contains continuous complex amplitudes $\alpha$ and $\beta$ (an infinite amount of theoretical mathematical parameters), any measurement causes the qubit to collapse into either $|0\rangle$ or $|1\rangle$. Therefore, a receiver without prior entanglement can never extract more than 1 classical bit of information from a single qubit.&lt;/p&gt;

&lt;p&gt;How does superdense coding bypass this? It does not violate Holevo’s bound because &lt;strong&gt;entanglement acts as a physical communication resource&lt;/strong&gt;. The two classical bits are not crammed into the single transmitted qubit alone. Instead, the transmitted qubit acts as an &lt;em&gt;address key&lt;/em&gt; that unlocks the correlation already stored in the shared two-qubit entangled system.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The 4-Step Protocol: Alice, Bob, and Charlie
&lt;/h2&gt;

&lt;p&gt;The superdense coding protocol unfolds across four sequential stages between three actors: a source (Charlie), the sender (Alice), and the receiver (Bob):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Step 1 — Entanglement Distribution:&lt;/strong&gt; Charlie prepares an entangled Bell pair $|\Phi^+\rangle = (|00\rangle + |11\rangle) / \sqrt{2}$. He sends qubit 0 ($q_0$) to Alice and qubit 1 ($q_1$) to Bob. Alice and Bob can now be arbitrarily far apart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 2 — Alice’s Local Encoding:&lt;/strong&gt; Alice wants to send a 2-bit message $m \in {00, 01, 10, 11}$. She applies a single local Pauli gate ($I$, $Z$, $X$, or $ZX$) to her qubit $q_0$ only. She never touches Bob’s qubit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 3 — Physical Transmission:&lt;/strong&gt; Alice sends her single physical qubit $q_0$ over a quantum communication channel (such as an optical fiber) to Bob.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 4 — Bob’s Bell Basis Decoding:&lt;/strong&gt; Bob now holds both qubits ($q_0$ and $q_1$). He runs the &lt;strong&gt;Bell Basis Decoder&lt;/strong&gt; (a CNOT gate followed by a Hadamard on $q_0$) and measures both qubits in the computational basis, reading Alice’s 2-bit message with 100% deterministic certainty.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F51yuzkmr4zcpuk9s6i8a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F51yuzkmr4zcpuk9s6i8a.png" alt="Superdense Coding Protocol Overview Circuit" width="800" height="167"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Circuit 1:&lt;/strong&gt; The complete Superdense Coding protocol showing Entanglement Preparation, Alice’s Local Encoding, and Bob’s Bell Basis Decoder.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. The 4 Encoding Operations: From Bits to Bell States
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://malcolmlow.com/2026/09/26/two-qubit-entanglement-four-bell-states-qiskit/" rel="noopener noreferrer"&gt;Module 3 (The 4 Bell States)&lt;/a&gt;, we discovered that the 4 Bell states form an orthonormal basis for two qubits. Alice's brilliance in superdense coding is that by applying &lt;strong&gt;only local single-qubit gates&lt;/strong&gt; to her half of $|\Phi^+\rangle$, she can steer the joint two-qubit state into &lt;em&gt;any one of the four orthogonal Bell states&lt;/em&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  Case 1: Message &lt;code&gt;00&lt;/code&gt; — Identity Gate $I$
&lt;/h3&gt;

&lt;p&gt;Alice leaves her qubit untouched (applies Identity $I$). The joint state remains the original Bell state $|\Phi^+\rangle$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(I ⊗ I) |Φ+⟩ = ( |00⟩ + |11⟩ ) / √2 = |Φ+⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fad0qzssgcdbg1jo9ve7n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fad0qzssgcdbg1jo9ve7n.png" alt="SDC Message 00 Circuit" width="800" height="201"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Circuit 2:&lt;/strong&gt; Superdense coding for message &lt;code&gt;00&lt;/code&gt; (Identity gate on &lt;code&gt;q_0&lt;/code&gt; → Bob measures 00).&lt;/p&gt;
&lt;h3&gt;
  
  
  Case 2: Message &lt;code&gt;01&lt;/code&gt; — Pauli-Z Gate $Z$ (Phase-Flip)
&lt;/h3&gt;

&lt;p&gt;Alice applies a $Z$ gate to $q_0$. Since $Z|0\rangle = |0\rangle$ and $Z|1\rangle = -|1\rangle$, the relative phase flips from $+$ to $-$, converting the state to $|\Phi^-\rangle$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(Z ⊗ I) |Φ+⟩ = ( |00⟩ - |11⟩ ) / √2 = |Phi-⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ardt5hkcppyf4nn4u8z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ardt5hkcppyf4nn4u8z.png" alt="SDC Message 01 Circuit" width="800" height="201"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Circuit 3:&lt;/strong&gt; Superdense coding for message &lt;code&gt;01&lt;/code&gt; (&lt;code&gt;Z&lt;/code&gt; gate on &lt;code&gt;q_0&lt;/code&gt; → Bob measures 01).&lt;/p&gt;
&lt;h3&gt;
  
  
  Case 3: Message &lt;code&gt;10&lt;/code&gt; — Pauli-X Gate $X$ (Bit-Flip)
&lt;/h3&gt;

&lt;p&gt;Alice applies an $X$ gate to $q_0$. Since $X|0\rangle = |1\rangle$ and $X|1\rangle = |0\rangle$, the bit correlations flip from equal parity to anti-correlated, converting the state to $|\Psi^+\rangle$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(X ⊗ I) |Φ+⟩ = ( |10⟩ + |01⟩ ) / √2 = |Ψ+⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F73gerlzwd8wuemtgm999.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F73gerlzwd8wuemtgm999.png" alt="SDC Message 10 Circuit" width="800" height="201"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Circuit 4:&lt;/strong&gt; Superdense coding for message &lt;code&gt;10&lt;/code&gt; (&lt;code&gt;X&lt;/code&gt; gate on &lt;code&gt;q_0&lt;/code&gt; → Bob measures 10).&lt;/p&gt;
&lt;h3&gt;
  
  
  Case 4: Message &lt;code&gt;11&lt;/code&gt; — Both Gates $ZX$ (Bit &amp;amp; Phase Flip)
&lt;/h3&gt;

&lt;p&gt;Alice applies both $Z$ and $X$ gates (or $iY$). This flips both the bit values and the relative sign, transforming the state into the Singlet state $|\Psi^-\rangle$ (up to global phase):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(ZX ⊗ I) |Φ+⟩ = ( -|01⟩ + |10⟩ ) / √2 = -|Ψ-⟩ ≡ |Ψ-⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi6chpmy9wzfb7jgrwgk5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi6chpmy9wzfb7jgrwgk5.png" alt="SDC Message 11 Circuit" width="799" height="188"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Circuit 5:&lt;/strong&gt; Superdense coding for message &lt;code&gt;11&lt;/code&gt; (&lt;code&gt;Z&lt;/code&gt; followed by &lt;code&gt;X&lt;/code&gt; on &lt;code&gt;q_0&lt;/code&gt; → Bob measures 11).&lt;/p&gt;
&lt;h3&gt;
  
  
  Superdense Coding Protocol Truth Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Message&lt;/th&gt;
&lt;th&gt;Alice's Local Gate&lt;/th&gt;
&lt;th&gt;Encoded Bell State&lt;/th&gt;
&lt;th&gt;Bob's Decoder ($CX \to H$)&lt;/th&gt;
&lt;th&gt;Measured Classical Bits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;00&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$I$ (None)&lt;/td&gt;
&lt;td&gt;$\&lt;/td&gt;
&lt;td&gt;\Phi^+\rangle$&lt;/td&gt;
&lt;td&gt;$\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;01&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$Z$ (Phase-Flip)&lt;/td&gt;
&lt;td&gt;$\&lt;/td&gt;
&lt;td&gt;\Phi^-\rangle$&lt;/td&gt;
&lt;td&gt;$\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;10&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$X$ (Bit-Flip)&lt;/td&gt;
&lt;td&gt;$\&lt;/td&gt;
&lt;td&gt;\Psi^+\rangle$&lt;/td&gt;
&lt;td&gt;$\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;11&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$ZX$ (Bit &amp;amp; Phase)&lt;/td&gt;
&lt;td&gt;$\&lt;/td&gt;
&lt;td&gt;\Psi^-\rangle$&lt;/td&gt;
&lt;td&gt;$\&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  4. Why Superdense Coding Cannot Transmit Faster Than Light
&lt;/h2&gt;

&lt;p&gt;A natural question arises: &lt;em&gt;If Alice applies her encoding gate immediately on qubit 0, does Bob instantly receive her message across the universe?&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can Bob read Alice's message before receiving her qubit?
Answer: NO. Bob's qubit in isolation is in a Maximally Mixed State (|r| = 0).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we established in Module 3, as long as Bob holds only qubit $q_1$ in isolation, his reduced density matrix is identical regardless of which gate Alice applied:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If Alice applies $I$: Bob's local state is 50% $|0\rangle$, 50% $|1\rangle$ (pure noise)&lt;/li&gt;
&lt;li&gt;If Alice applies $Z$: Bob's local state is 50% $|0\rangle$, 50% $|1\rangle$ (pure noise)&lt;/li&gt;
&lt;li&gt;If Alice applies $X$: Bob's local state is 50% $|0\rangle$, 50% $|1\rangle$ (pure noise)&lt;/li&gt;
&lt;li&gt;If Alice applies $ZX$: Bob's local state is 50% $|0\rangle$, 50% $|1\rangle$ (pure noise)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No measurement Bob performs on his own qubit alone can reveal any information about which gate Alice selected! &lt;strong&gt;Zero information is transmitted until Alice physically transports qubit $q_0$ across space to Bob.&lt;/strong&gt; Because the physical transmission of a qubit is bounded by the speed of light $c$, Einstein's causality is rigorously preserved.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Quantum Resource Duality: Superdense Coding vs. Teleportation
&lt;/h2&gt;

&lt;p&gt;Superdense coding and &lt;a href="https://malcolmlow.com/2026/06/24/quantum-teleportation-and-why-it-isnt-cloning/" rel="noopener noreferrer"&gt;Quantum Teleportation (Module 9)&lt;/a&gt; form the fundamental dual pillars of quantum communication. They represent the exact reciprocal exchange rate between quantum and classical channels:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Superdense Coding (Module 3b)&lt;/th&gt;
&lt;th&gt;Quantum Teleportation (Module 9)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Objective&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Transmit 2 classical bits&lt;/td&gt;
&lt;td&gt;Transmit 1 unknown quantum state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pre-Shared Resource&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 shared Bell pair ($|\Phi^+\rangle$)&lt;/td&gt;
&lt;td&gt;1 shared Bell pair ($|\Phi^+\rangle$)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Channel Transmitted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;1 physical qubit&lt;/strong&gt; (quantum channel)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;2 classical bits&lt;/strong&gt; (classical radio/fiber)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Information Exchange&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 e-bit + 1 qubit $\to$ 2 classical bits&lt;/td&gt;
&lt;td&gt;1 e-bit + 2 classical bits $\to$ 1 qubit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In both protocols, 1 Bell pair (1 e-bit of entanglement) acts as a currency that doubles the power of the transmitted channel!&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Complete Qiskit 2.x Python Implementation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QuantumCircuit&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit.quantum_info&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Statevector&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_superdense_circuit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;QuantumCircuit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Builds an end-to-end Superdense Coding circuit in Qiskit 2.x.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;QuantumCircuit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# --- PHASE 1: PRE-SHARED ENTANGLEMENT (Charlie) ---
&lt;/span&gt;    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;barrier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bell Pair&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# --- PHASE 2: ALICE'S LOCAL ENCODING (on qubit 0) ---
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# Identity: do nothing
&lt;/span&gt;    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;z&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;# Phase-flip: |Phi+&amp;gt; -&amp;gt; |Phi-&amp;gt;
&lt;/span&gt;    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;# Bit-flip:   |Phi+&amp;gt; -&amp;gt; |Psi+&amp;gt;
&lt;/span&gt;    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;11&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;z&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;# Bit &amp;amp; Phase: |Phi+&amp;gt; -&amp;gt; -|Psi-&amp;gt;
&lt;/span&gt;    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Message must be &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;00&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;01&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, or &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;11&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;barrier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice Transmits q0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# --- PHASE 3: BOB'S BELL BASIS DECODER ---
&lt;/span&gt;    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;barrier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bob Decodes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Measure both qubits into classical register
&lt;/span&gt;    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;qc&lt;/span&gt;

&lt;span class="c1"&gt;# --- SIMULATION &amp;amp; VERIFICATION OF ALL 4 MESSAGES ---
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=== Superdense Coding Simulation (Qiskit 2.x) ===&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;test_messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;11&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;test_messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;build_superdense_circuit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qc_no_meas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove_final_measurements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inplace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;sv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Statevector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qc_no_meas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;probs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;probabilities_dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;formatted_probs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;probs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;1e-6&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Target Message Sent : &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bob&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s Decoded State : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;formatted_probs&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Verification Status : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PASS (100% Certainty)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;formatted_probs&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;formatted_probs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;FAIL&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Execution Output:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=== Superdense Coding Simulation (Qiskit 2.x) ===

Target Message Sent : '00'
Bob's Decoded State : {'00': 1.0}
Verification Status : PASS (100% Certainty)
---------------------------------------------
Target Message Sent : '01'
Bob's Decoded State : {'01': 1.0}
Verification Status : PASS (100% Certainty)
---------------------------------------------
Target Message Sent : '10'
Bob's Decoded State : {'10': 1.0}
Verification Status : PASS (100% Certainty)
---------------------------------------------
Target Message Sent : '11'
Bob's Decoded State : {'11': 1.0}
Verification Status : PASS (100% Certainty)
---------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Insights &amp;amp; Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Entanglement Doubles Classical Capacity:&lt;/strong&gt; With one pre-shared Bell pair, transmitting 1 physical qubit transfers 2 classical bits deterministically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Gates Steer Global States:&lt;/strong&gt; Alice applies local Pauli operations ($I$, $Z$, $X$, $ZX$) to her qubit alone, yet changes the joint entanglement basis into one of the 4 orthogonal Bell states.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No FTL Communication:&lt;/strong&gt; Bob gains zero bits of information until Alice’s physical qubit arrives through space. Causality is strictly maintained.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Teleportation Duality:&lt;/strong&gt; Superdense coding trades 1 qubit for 2 classical bits; quantum teleportation trades 2 classical bits for 1 qubit.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Continue the Quantum Series:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;← Previous: &lt;a href="https://malcolmlow.com/2026/09/26/two-qubit-entanglement-four-bell-states-qiskit/" rel="noopener noreferrer"&gt;Two-Qubit Entanglement Explained: The 4 Bell States and Qiskit Implementation (Module 3)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;→ Next: &lt;a href="https://malcolmlow.com/2024/04/21/quantum-fourier-transform-of-1-qubit/" rel="noopener noreferrer"&gt;The One-Qubit QFT &amp;amp; Hadamard Transform (Module 4)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dual Protocol: &lt;a href="https://malcolmlow.com/2026/06/24/quantum-teleportation-and-why-it-isnt-cloning/" rel="noopener noreferrer"&gt;Quantum Teleportation, and Why It Isn’t Cloning (Module 9)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Learning path: &lt;a href="https://malcolmlow.com/2026/06/26/quantum-computing-a-complete-learning-path/" rel="noopener noreferrer"&gt;View the complete Quantum Computing learning path →&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>quantum</category>
      <category>python</category>
      <category>qiskit</category>
      <category>physics</category>
    </item>
    <item>
      <title>Two-Qubit Entanglement Explained: The 4 Bell States and Qiskit Implementation</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Sun, 27 Sep 2026 04:54:43 +0000</pubDate>
      <link>https://dev.to/malcolmlow/two-qubit-entanglement-explained-the-4-bell-states-and-qiskit-implementation-37j8</link>
      <guid>https://dev.to/malcolmlow/two-qubit-entanglement-explained-the-4-bell-states-and-qiskit-implementation-37j8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Module 3&lt;/strong&gt; in the &lt;a href="https://malcolmlow.com/2026/06/26/quantum-computing-a-complete-learning-path/" rel="noopener noreferrer"&gt;Quantum Computing: A Complete Learning Path&lt;/a&gt; series. Bridging the transition from single-qubit geometry in &lt;a href="https://malcolmlow.com/2026/09/03/bloch-sphere-basis-states-x-z-gates/" rel="noopener noreferrer"&gt;Bloch Sphere Explained&lt;/a&gt; (Module 2) to multi-qubit communication in &lt;a href="https://malcolmlow.com/2026/09/27/superdense-coding-explained-qiskit/" rel="noopener noreferrer"&gt;Superdense Coding&lt;/a&gt; (Module 3b) and &lt;a href="https://malcolmlow.com/2026/06/24/quantum-teleportation-and-why-it-isnt-cloning/" rel="noopener noreferrer"&gt;Quantum Teleportation&lt;/a&gt; (Module 9).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In single-qubit quantum mechanics, every pure state can be visualized as a vector pointing to a point on the surface of the three-dimensional Bloch sphere. However, as soon as a second qubit enters the system, quantum physics reveals its most distinctive phenomenon: &lt;strong&gt;quantum entanglement&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When two qubits become entangled, the state of the composite system can no longer be described by the independent states of its individual components. Individual qubits lose their independent identity, single-qubit Bloch vectors collapse into the interior of the sphere as mixed states, and measurements on separated particles exhibit correlations that cannot be explained by classical probability. &lt;/p&gt;

&lt;p&gt;In this guide, we build two-qubit entanglement from first principles: defining mathematical non-separability, synthesizing the &lt;strong&gt;four maximally entangled Bell states&lt;/strong&gt; (EPR pairs), deriving the Bell basis decoder, and running verifiable code in &lt;strong&gt;Qiskit 2.x&lt;/strong&gt; with Matplotlib circuit diagrams.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. What is Entanglement? Mathematical Non-Separability
&lt;/h2&gt;

&lt;p&gt;To understand what entanglement is, we must first understand what it is &lt;em&gt;not&lt;/em&gt;. Consider two independent qubits, &lt;code&gt;A&lt;/code&gt; and &lt;code&gt;B&lt;/code&gt;, each in a general superposition state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|ψ_A⟩ = α₀ |0⟩ + α₁ |1⟩,    |ψ_B⟩ = β₀ |0⟩ + β₁ |1⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The joint state of the two qubits is given by the tensor product $|a⟩ \otimes |b⟩$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|ψ_joint⟩ = α₀β₀ |00⟩ + α₀β₁ |01⟩ + α₁β₀ |10⟩ + α₁β₁ |11⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any two-qubit state that can be factored into such a tensor product is called a &lt;strong&gt;product state&lt;/strong&gt; (or separable state). Now, consider the canonical Bell state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|Φ+⟩ = ( |00⟩ + |11⟩ ) / √2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Non-Separability Proof:
&lt;/h3&gt;

&lt;p&gt;Can we choose single-qubit coefficients $\alpha_0, \alpha_1, \beta_0, \beta_1$ such that $|\psi_{\text{joint}}\rangle = |\Phi^+\rangle$? Matching coefficients requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$\alpha_0 \beta_0 = 1 / \sqrt{2}$&lt;/li&gt;
&lt;li&gt;$\alpha_1 \beta_1 = 1 / \sqrt{2}$&lt;/li&gt;
&lt;li&gt;$\alpha_0 \beta_1 = 0 \implies$ either $\alpha_0 = 0$ or $\beta_1 = 0$&lt;/li&gt;
&lt;li&gt;$\alpha_1 \beta_0 = 0 \implies$ either $\alpha_1 = 0$ or $\beta_0 = 0$&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If $\alpha_0 = 0$, then $\alpha_0 \beta_0 = 0 \neq 1 / \sqrt{2}$, a contradiction! If $\beta_1 = 0$, then $\alpha_1 \beta_1 = 0 \neq 1 / \sqrt{2}$, another contradiction! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No single-qubit states $|\psi_A\rangle$ and $|\psi_B\rangle$ exist&lt;/strong&gt; whose product equals $|\Phi^+\rangle$. The state is mathematically non-separable: it exists solely as an indivisible two-qubit entity.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Controlled-NOT (CNOT) Gate: Generating Entanglement
&lt;/h2&gt;

&lt;p&gt;Single-qubit operations (such as Hadamard $H$, Pauli $X$, or Phase $Z$) are &lt;strong&gt;local unitaries&lt;/strong&gt; ($U_A \otimes U_B$). By definition, a local unitary applied to a separable state produces another separable state—it can never create entanglement from scratch.&lt;/p&gt;

&lt;p&gt;To generate entanglement, we need an interaction between qubits. The universal two-qubit entangler is the &lt;strong&gt;Controlled-NOT (CNOT or $CX$)&lt;/strong&gt; gate. It leaves the control qubit unchanged and flips the target qubit if and only if the control qubit is $|1\rangle$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CX |00⟩ = |00⟩,    CX |01⟩ = |01⟩,    CX |10⟩ = |11⟩,    CX |11⟩ = |10⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Entanglement Recipe:
&lt;/h3&gt;

&lt;p&gt;When a CNOT is fed an unentangled product state where the control qubit is in superposition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|ψ⟩ = |+⟩ |0⟩ = [ (|0⟩ + |1⟩) / √2 ] ⊗ |0⟩ = ( |00⟩ + |10⟩ ) / √2

CX |ψ⟩ = ( CX|00⟩ + CX|10⟩ ) / √2 = ( |00⟩ + |11⟩ ) / √2 = |Φ+⟩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CNOT couples the control's superposition to the target's bit value, fusing the two independent states into a single entangled state.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The 4 Maximally Entangled Bell States (EPR Pairs)
&lt;/h2&gt;

&lt;p&gt;The 4 Bell states form an orthonormal basis for the entire two-qubit Hilbert space $\mathbb{C}^4$, known as the &lt;strong&gt;Bell basis&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. State |Φ+⟩ = ( |00⟩ + |11⟩ ) / √2 — (Correlated, Positive Phase)
&lt;/h3&gt;

&lt;p&gt;Prepared from $|00\rangle$ via $H(q_0)$ followed by $CX(q_0, q_1)$:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fulyok5aofgbbqd1mtkb9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fulyok5aofgbbqd1mtkb9.png" alt="Bell |Φ+⟩ Circuit" width="434" height="314"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Circuit 1:&lt;/strong&gt; Preparation of &lt;code&gt;|Φ+⟩&lt;/code&gt; from ground state &lt;code&gt;|00⟩&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. State |Φ−⟩ = ( |00⟩ − |11⟩ ) / √2 — (Correlated, Negative Phase)
&lt;/h3&gt;

&lt;p&gt;Prepared by applying an $X$ gate (or $Z$ gate) to $q_0$ before the Hadamard, creating $|-\rangle \otimes |0\rangle$ before the CNOT:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvg9fgyne1mt8bhk8vqaq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvg9fgyne1mt8bhk8vqaq.png" alt="Bell |Φ−⟩ Circuit" width="550" height="314"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Circuit 2:&lt;/strong&gt; Preparation of &lt;code&gt;|Φ−⟩&lt;/code&gt; with relative minus phase.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. State |Ψ+⟩ = ( |01⟩ + |10⟩ ) / √2 — (Anti-Correlated, Positive Phase)
&lt;/h3&gt;

&lt;p&gt;Prepared by flipping the target qubit $q_1$ with an $X$ gate, so the CNOT flips $|01\rangle \leftrightarrow |10\rangle$:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ful23ccrup2s7sr94t7ng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ful23ccrup2s7sr94t7ng.png" alt="Bell |Ψ+⟩ Circuit" width="434" height="314"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Circuit 3:&lt;/strong&gt; Preparation of &lt;code&gt;|Ψ+⟩&lt;/code&gt; with bit-flip anti-correlation.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. State |Ψ−⟩ = ( |01⟩ − |10⟩ ) / √2 — (The Singlet State)
&lt;/h3&gt;

&lt;p&gt;Prepared with $X$ gates on both qubits before the entangling layer. $|\Psi^-\rangle$ is the unique &lt;strong&gt;anti-symmetric singlet state&lt;/strong&gt; with total spin $S = 0$, making it invariant under arbitrary simultaneous bilateral rotations:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkw0y51dj1c13mx1gbv44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkw0y51dj1c13mx1gbv44.png" alt="Bell |Ψ−⟩ Singlet Circuit" width="550" height="314"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Circuit 4:&lt;/strong&gt; Preparation of the rotationally invariant Singlet State &lt;code&gt;|Ψ−⟩&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Bell Basis Properties Matrix
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bell State&lt;/th&gt;
&lt;th&gt;Input State&lt;/th&gt;
&lt;th&gt;Statevector Expression&lt;/th&gt;
&lt;th&gt;Correlation Type&lt;/th&gt;
&lt;th&gt;Allowed Outcomes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;|Φ+⟩&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;|00⟩&lt;/td&gt;
&lt;td&gt;( |00⟩ + |11⟩ ) / √2&lt;/td&gt;
&lt;td&gt;Correlated (Even Parity)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;00&lt;/code&gt; (50%), &lt;code&gt;11&lt;/code&gt; (50%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;|Φ−⟩&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;|10⟩&lt;/td&gt;
&lt;td&gt;( |00⟩ − |11⟩ ) / √2&lt;/td&gt;
&lt;td&gt;Correlated (Even Parity)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;00&lt;/code&gt; (50%), &lt;code&gt;11&lt;/code&gt; (50%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;|Ψ+⟩&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;|01⟩&lt;/td&gt;
&lt;td&gt;( |01⟩ + |10⟩ ) / √2&lt;/td&gt;
&lt;td&gt;Anti-Correlated (Odd Parity)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;01&lt;/code&gt; (50%), &lt;code&gt;10&lt;/code&gt; (50%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;|Ψ−⟩&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;|11⟩&lt;/td&gt;
&lt;td&gt;( |01⟩ − |10⟩ ) / √2&lt;/td&gt;
&lt;td&gt;Anti-Correlated (Singlet)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;01&lt;/code&gt; (50%), &lt;code&gt;10&lt;/code&gt; (50%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  4. Why the Bloch Sphere Fails for Entangled Qubits
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://malcolmlow.com/2026/09/03/bloch-sphere-basis-states-x-z-gates/" rel="noopener noreferrer"&gt;Module 2 (Bloch Sphere Explained)&lt;/a&gt;, we saw that any standalone qubit pure state points to the surface of the three-dimensional Bloch sphere with radius &lt;strong&gt;|r| = 1&lt;/strong&gt;. &lt;em&gt;What happens to the Bloch vector of qubit&lt;/em&gt; &lt;code&gt;A&lt;/code&gt; &lt;em&gt;when it is entangled in&lt;/em&gt; &lt;code&gt;|Φ+⟩&lt;/code&gt;&lt;em&gt;?&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Single Qubit (Pure State)  : |r| = 1  (Points to sphere surface)
Entangled Qubit (Isolated) : |r| = 0  (Collapses to dead center)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because an entangled state cannot be factored into independent parts, qubit &lt;code&gt;A&lt;/code&gt; does not have a pure state of its own. If you measure qubit &lt;code&gt;A&lt;/code&gt; in isolation along &lt;em&gt;any&lt;/em&gt; axis (&lt;code&gt;X&lt;/code&gt;, &lt;code&gt;Y&lt;/code&gt;, or &lt;code&gt;Z&lt;/code&gt;), you observe pure 50/50 random noise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expectation along $X$: $\langle X \rangle = 0$&lt;/li&gt;
&lt;li&gt;Expectation along $Y$: $\langle Y \rangle = 0$&lt;/li&gt;
&lt;li&gt;Expectation along $Z$: $\langle Z \rangle = 0$&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With all three coordinates vanishing (&lt;code&gt;r_x = 0, r_y = 0, r_z = 0&lt;/code&gt;), qubit &lt;code&gt;A&lt;/code&gt; collapses into a &lt;strong&gt;maximally mixed state&lt;/strong&gt; at the exact center of the sphere (&lt;strong&gt;|r| = 0&lt;/strong&gt;). The Bloch sphere is fundamentally a single-qubit geometry tool—it cannot visualize entanglement because none of the information belongs to qubit &lt;code&gt;A&lt;/code&gt; or qubit &lt;code&gt;B&lt;/code&gt; alone. All the information resides exclusively in the &lt;strong&gt;joint correlations between them&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Reversing Entanglement: The Bell Basis Analyzer
&lt;/h2&gt;

&lt;p&gt;If we measure $|\Phi^+\rangle$ and $|\Phi^-\rangle$ directly in the computational basis, both produce &lt;code&gt;00&lt;/code&gt; (50%) and &lt;code&gt;11&lt;/code&gt; (50%). How can an experimenter distinguish all four Bell states deterministically?&lt;/p&gt;

&lt;p&gt;Because quantum circuits are unitary and reversible, we apply the &lt;strong&gt;inverse of the Bell preparation circuit&lt;/strong&gt;: a CNOT gate followed by a Hadamard on the control qubit ($CX \to H$):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo8dkr2dzvvpayuqr68dv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo8dkr2dzvvpayuqr68dv.png" alt="Bell Basis Analyzer Decoder Circuit" width="800" height="340"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Circuit 5:&lt;/strong&gt; The Bell Basis Decoder (&lt;code&gt;CX&lt;/code&gt; followed by &lt;code&gt;H&lt;/code&gt;) rotates the 4 entangled states back to the computational basis.&lt;/p&gt;

&lt;p&gt;This transformation maps the 4 entangled Bell states back into the 4 classical basis bitstrings with &lt;strong&gt;100% deterministic certainty&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$|\Phi^+\rangle \to$ &lt;strong&gt;&lt;code&gt;00&lt;/code&gt; (100%)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;$|\Phi^-\rangle \to$ &lt;strong&gt;&lt;code&gt;01&lt;/code&gt; (100%)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;$|\Psi^+\rangle \to$ &lt;strong&gt;&lt;code&gt;10&lt;/code&gt; (100%)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;$|\Psi^-\rangle \to$ &lt;strong&gt;&lt;code&gt;11&lt;/code&gt; (100%)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This decoder is the foundational building block for &lt;a href="https://malcolmlow.com/2026/09/27/superdense-coding-explained-qiskit/" rel="noopener noreferrer"&gt;Superdense Coding (Module 3b)&lt;/a&gt; (transmitting 2 classical bits using only 1 physical qubit) and the receiver measurement in &lt;a href="https://malcolmlow.com/2026/06/24/quantum-teleportation-and-why-it-isnt-cloning/" rel="noopener noreferrer"&gt;Quantum Teleportation (Module 9)&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Complete Qiskit 2.x Implementation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QuantumCircuit&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit.quantum_info&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Statevector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DensityMatrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;partial_trace&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_bell_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;QuantumCircuit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;QuantumCircuit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;state_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Phi+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;state_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Phi-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;state_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Psi+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;state_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Psi-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;qc&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bell_basis_decoder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;QuantumCircuit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;dec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;QuantumCircuit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dec&lt;/span&gt;

&lt;span class="n"&gt;bell_states&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Phi+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Phi-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Psi+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Psi-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=== 4 Bell States Generation &amp;amp; Verification ===&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;bell_states&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;prep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;build_bell_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Statevector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Run through the Bell Basis Decoder
&lt;/span&gt;    &lt;span class="n"&gt;full_circuit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bell_basis_decoder&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;full_sv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Statevector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full_circuit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove_final_measurements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inplace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="n"&gt;probs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;full_sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;probabilities_dict&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;1e-4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;State |&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  Statevector: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  Bell Basis Decoder Outcome: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;probs&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Verify Bloch radius collapse for Qubit A
&lt;/span&gt;&lt;span class="n"&gt;phi_plus_sv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Statevector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;build_bell_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Phi+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;rho_total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DensityMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;phi_plus_sv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rho_A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;partial_trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rho_total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;purity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;real&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rho_A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;rho_A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reduced Density Matrix of Qubit A:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rho_A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Purity Tr(rho_A^2): &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;purity&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (0.50 = Maximally Mixed, Bloch radius r = 0)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Execution Output:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=== 4 Bell States Generation &amp;amp; Verification ===

State |Phi+&amp;gt;:
  Statevector: [0.707+0.j 0.   +0.j 0.   +0.j 0.707+0.j]
  Bell Basis Decoder Outcome: {'00': 1.0}

State |Phi-&amp;gt;:
  Statevector: [ 0.707+0.j  0.   +0.j  0.   +0.j -0.707+0.j]
  Bell Basis Decoder Outcome: {'01': 1.0}

State |Psi+&amp;gt;:
  Statevector: [0.   +0.j 0.707+0.j 0.707+0.j 0.   +0.j]
  Bell Basis Decoder Outcome: {'10': 1.0}

State |Psi-&amp;gt;:
  Statevector: [ 0.   +0.j -0.707+0.j  0.707+0.j  0.   +0.j]
  Bell Basis Decoder Outcome: {'11': 1.0}

Reduced Density Matrix of Qubit A:
[[0.5+0.j 0. +0.j]
 [0. +0.j 0.5+0.j]]
Purity Tr(rho_A^2): 0.50 (0.50 = Maximally Mixed, Bloch radius r = 0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Insights &amp;amp; Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Entanglement is Non-Factorability:&lt;/strong&gt; An entangled state cannot be written as $|a\rangle \otimes |b\rangle$. The whole possesses definite physical properties that do not exist in the parts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Randomness vs. Global Certainty:&lt;/strong&gt; Measuring one qubit of a Bell pair yields pure 50/50 randomness ($r = 0$). Yet, the two-qubit joint correlation is 100% deterministic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Quantum Information Backbone:&lt;/strong&gt; Without the Bell basis, neither &lt;a href="https://malcolmlow.com/2026/09/27/superdense-coding-explained-qiskit/" rel="noopener noreferrer"&gt;Superdense Coding&lt;/a&gt; nor &lt;a href="https://malcolmlow.com/2026/06/24/quantum-teleportation-and-why-it-isnt-cloning/" rel="noopener noreferrer"&gt;Quantum Teleportation&lt;/a&gt; could exist.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Continue the Quantum Series:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;← Previous: &lt;a href="https://malcolmlow.com/2026/09/03/bloch-sphere-basis-states-x-z-gates/" rel="noopener noreferrer"&gt;Bloch Sphere Explained: Basis States and the X and Z Gates (Module 2)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;→ Next: &lt;a href="https://malcolmlow.com/2026/09/27/superdense-coding-explained-qiskit/" rel="noopener noreferrer"&gt;Superdense Coding Explained: Transmitting 2 Classical Bits in 1 Qubit (Module 3b)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Learning path: &lt;a href="https://malcolmlow.com/2026/06/26/quantum-computing-a-complete-learning-path/" rel="noopener noreferrer"&gt;View the complete Quantum Computing learning path →&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>quantum</category>
      <category>python</category>
      <category>qiskit</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Pocket Data Science IV: Tackling Kaggle MNIST on Android with Antigravity CLI</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Sun, 27 Sep 2026 02:04:03 +0000</pubDate>
      <link>https://dev.to/malcolmlow/pocket-data-science-iv-tackling-kaggle-mnist-on-android-with-antigravity-cli-1nfk</link>
      <guid>https://dev.to/malcolmlow/pocket-data-science-iv-tackling-kaggle-mnist-on-android-with-antigravity-cli-1nfk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;💻 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; All 10 self-contained experiment scripts, requirements, and reproduction instructions are published open-source on GitHub: &lt;a href="https://github.com/myhlow/kaggle-digit-recognizer-mnist" rel="noopener noreferrer"&gt;&lt;strong&gt;myhlow/kaggle-digit-recognizer-mnist&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;A hands-on walkthrough exploring computer vision baselines on Kaggle's Digit Recognizer (MNIST) benchmark: from empirical random guessing and prototype centroid templates to multinomial softmax regression and PCA-accelerated non-linear ensembles on an Android phone running Termux and Google Antigravity CLI.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;In our previous explorations across the &lt;strong&gt;Pocket Data Science&lt;/strong&gt; series (&lt;a href="https://malcolmlow.com/2026/09/22/pocket-data-science-training-10-fold-ensemble-android-termux-antigravity-kaggle/" rel="noopener noreferrer"&gt;Titanic&lt;/a&gt;, &lt;a href="https://malcolmlow.com/2026/09/24/pocket-data-science-2-spaceship-titanic-android-termux-antigravity-catboost/" rel="noopener noreferrer"&gt;Spaceship Titanic&lt;/a&gt;, and &lt;a href="https://malcolmlow.com/2026/09/26/pocket-data-science-3-house-prices-regression-baselines-android-termux/" rel="noopener noreferrer"&gt;House Prices&lt;/a&gt;), we established disciplined, reproducible machine learning workflows on mobile hardware using &lt;strong&gt;Google Antigravity CLI (&lt;code&gt;agy&lt;/code&gt;)&lt;/strong&gt; inside a Termux Linux environment.&lt;/p&gt;

&lt;p&gt;In this fourth installment, we step into computer vision using the classic &lt;strong&gt;Kaggle Digit Recognizer (MNIST)&lt;/strong&gt; benchmark (42,000 training images, 28,000 test images, 784 grayscale pixels each). &lt;/p&gt;

&lt;p&gt;Instead of jumping straight into heavy convolutional neural networks or spinning up cloud GPUs, we maintained our strict experimental discipline: understanding empirical priors, zero-learning prototype templates, linear decision frontiers, and memory-conscious non-linear ensembles running strictly on an ARM64 smartphone processor.&lt;/p&gt;

&lt;p&gt;Across 10 distinct experiments over 2 days, our submissions climbed from naive random guessing (&lt;code&gt;0.10139&lt;/code&gt;) all the way to &lt;strong&gt;&lt;code&gt;0.98792&lt;/code&gt; (Rank #406 of 863 teams, Top 47.05%, beating 457 teams)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is the complete engineering breakdown of what each layer contributed and the mathematical mechanics behind the leaps.&lt;/p&gt;




&lt;h2&gt;
  
  
  1 · The Mobile ML Environment
&lt;/h2&gt;

&lt;p&gt;All data loading, matrix transformations, cross-validation, and Kaggle submissions were executed natively on a consumer smartphone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Host Architecture:&lt;/strong&gt; Android 14 running &lt;strong&gt;Termux&lt;/strong&gt; with a Debian userspace via &lt;strong&gt;PRoot Distro&lt;/strong&gt; on 64-bit ARM (&lt;code&gt;aarch64&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic CLI:&lt;/strong&gt; &lt;strong&gt;Google Antigravity CLI (&lt;code&gt;agy&lt;/code&gt;)&lt;/strong&gt; pair-programming in bash, managing background tasks, and verifying data pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment:&lt;/strong&gt; Python 3.14 with &lt;code&gt;pandas&lt;/code&gt;, &lt;code&gt;numpy&lt;/code&gt;, &lt;code&gt;scipy&lt;/code&gt;, &lt;code&gt;scikit-learn&lt;/code&gt;, and the official &lt;code&gt;kaggle&lt;/code&gt; CLI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constraints:&lt;/strong&gt; Operating within smartphone RAM and thermal limits requires algorithmic efficiency—such as avoiding raw $\mathcal{O}(N^2)$ distance calculations across $42,000 \times 28,000 \times 784$ floating-point matrices.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2 · The 10-Tier Ladder (Day 1 &amp;amp; Day 2 Results)
&lt;/h2&gt;

&lt;p&gt;Below is the chronological sequence of our 10 submissions evaluated against Kaggle's public test set (28,000 unseen images):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Exp&lt;/th&gt;
&lt;th&gt;Model &amp;amp; Strategy&lt;/th&gt;
&lt;th&gt;CV Accuracy&lt;/th&gt;
&lt;th&gt;Kaggle Public Score&lt;/th&gt;
&lt;th&gt;LB Rank&lt;/th&gt;
&lt;th&gt;Percentile&lt;/th&gt;
&lt;th&gt;Teams Beaten&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 01&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Empirical Random Prior&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.10139&lt;/code&gt; (10.14%)&lt;/td&gt;
&lt;td&gt;#847&lt;/td&gt;
&lt;td&gt;Bottom 1.9%&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 02&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Majority Class Baseline (Digit 1)&lt;/td&gt;
&lt;td&gt;11.35%&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.11403&lt;/code&gt; (11.40%)&lt;/td&gt;
&lt;td&gt;#846&lt;/td&gt;
&lt;td&gt;Bottom 2.0%&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 03&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nearest Centroid ("Ghost Templates")&lt;/td&gt;
&lt;td&gt;82.04%&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.81446&lt;/code&gt; (81.45%)&lt;/td&gt;
&lt;td&gt;#835&lt;/td&gt;
&lt;td&gt;Bottom 3.2%&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 04&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multinomial Softmax Logistic Regression&lt;/td&gt;
&lt;td&gt;92.56%&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.92089&lt;/code&gt; (92.09%)&lt;/td&gt;
&lt;td&gt;#806&lt;/td&gt;
&lt;td&gt;Bottom 6.6%&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 05&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Latent Ensemble: PCA(55) + k-NN + ExtraTrees&lt;/td&gt;
&lt;td&gt;97.46%&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.97578&lt;/code&gt; (97.58%)&lt;/td&gt;
&lt;td&gt;#568&lt;/td&gt;
&lt;td&gt;Top 65.9%&lt;/td&gt;
&lt;td&gt;294&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 06&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tri-Blend: Deep MLP + k-NN + ExtraTrees&lt;/td&gt;
&lt;td&gt;97.98%&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.98085&lt;/code&gt; (98.09%)&lt;/td&gt;
&lt;td&gt;#523&lt;/td&gt;
&lt;td&gt;Top 60.7%&lt;/td&gt;
&lt;td&gt;339&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 07&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Orthogonal Subspace SVM: PCA(55) + RBF-SVM&lt;/td&gt;
&lt;td&gt;98.60%&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.98453&lt;/code&gt; (98.45%)&lt;/td&gt;
&lt;td&gt;#487&lt;/td&gt;
&lt;td&gt;Top 56.4%&lt;/td&gt;
&lt;td&gt;376&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 08&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dual Meta-Ensemble: 90% RBF-SVM + 10% MLP&lt;/td&gt;
&lt;td&gt;98.66%&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.98514&lt;/code&gt; (98.51%)&lt;/td&gt;
&lt;td&gt;#481&lt;/td&gt;
&lt;td&gt;Top 55.7%&lt;/td&gt;
&lt;td&gt;382&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 09&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2× Translation-Augmented Subspace SVM (84k)&lt;/td&gt;
&lt;td&gt;98.68%&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.98696&lt;/code&gt; (98.70%)&lt;/td&gt;
&lt;td&gt;#438&lt;/td&gt;
&lt;td&gt;Top 50.8%&lt;/td&gt;
&lt;td&gt;425&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3× Dual-Axis Augmented Subspace SVM (126k)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98.78%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.98792&lt;/code&gt; (98.79%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;#406&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Top 47.05%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;457&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Note: Leaderboard statistics based on 863 active teams on Kaggle as of September 2026).&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3 · Tier 1: Zero-Training Baselines &amp;amp; "Ghost Templates"
&lt;/h2&gt;

&lt;p&gt;Before training parameterized models, baseline tests define the floor of predictability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Empirical Random Guessing (10.14%):&lt;/strong&gt; Sampling labels according to the empirical training class distribution matched theoretical expectation for 10 balanced classes (~10%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constant Majority Class (11.40%):&lt;/strong&gt; Digit &lt;code&gt;1&lt;/code&gt; is slightly more frequent than others (4,684 of 42,000 samples, or 11.15%). Predicting &lt;code&gt;1&lt;/code&gt; for all 28,000 test images yielded 11.40% on Kaggle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nearest Centroid Classifier (81.45%):&lt;/strong&gt; By calculating the element-wise arithmetic mean of all 4,200 training images per digit class, we obtain 10 average "ghost templates". Classifying each test image to the template with highest cosine similarity requires &lt;strong&gt;zero parameter tuning or gradient updates&lt;/strong&gt;, yet hits &lt;strong&gt;81.45% accuracy&lt;/strong&gt;, demonstrating the strong geometric separation already inherent in raw pixel space.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4 · Tier 2: Linear Frontier to Latent Subspace Ensembles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multinomial Softmax Regression (92.09%):&lt;/strong&gt; Fitting a single convex linear layer $(W \in \mathbb{R}^{10 \times 784}, b \in \mathbb{R}^{10})$ using L-BFGS convergence in 16.5 seconds established the limit of linear hyperplanes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Classical Latent Ensemble (97.58%):&lt;/strong&gt; Non-linear models in raw 784-dimensional space are prohibitively slow on mobile CPUs. By projecting into an orthogonal 55-component PCA subspace (retaining 83.2% variance), we compressed the dataset by &lt;strong&gt;14.25×&lt;/strong&gt;. An ensemble blending 5-Nearest Neighbors and ExtraTrees (150 trees) on this subspace fit in &lt;strong&gt;18.7 seconds&lt;/strong&gt; and jumped 238 ranks on the leaderboard (&lt;code&gt;0.92089&lt;/code&gt; $\to$ &lt;code&gt;0.97578&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Neural Tri-Blend (98.09%):&lt;/strong&gt; Adding a 4-layer Deep Multi-Layer Perceptron (256-128-ReLU with Adam and early stopping) to the latent ensemble pushed past 98% accuracy on Day 1.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5 · Day 2: Subspace Support Vector Machines &amp;amp; Spatial Manifolds
&lt;/h2&gt;

&lt;p&gt;On Day 2, we systematically evaluated single models versus meta-ensembles and investigated spatial invariance:&lt;/p&gt;

&lt;h3&gt;
  
  
  Mobile Compute &amp;amp; Throughput Benchmark
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pipeline / Model&lt;/th&gt;
&lt;th&gt;Architecture&lt;/th&gt;
&lt;th&gt;Val Fit (5k CV)&lt;/th&gt;
&lt;th&gt;Val Acc&lt;/th&gt;
&lt;th&gt;Full Fit (Train)&lt;/th&gt;
&lt;th&gt;Test Inference (28k)&lt;/th&gt;
&lt;th&gt;Throughput&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deep MLP Baseline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Raw 784px $\to$ MLP(256, 128)&lt;/td&gt;
&lt;td&gt;27.8s&lt;/td&gt;
&lt;td&gt;98.18%&lt;/td&gt;
&lt;td&gt;344.4s (5.7 min)&lt;/td&gt;
&lt;td&gt;2.5s&lt;/td&gt;
&lt;td&gt;~11,200 img/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Raw RBF-SVM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Raw 784px $\to$ RBF-SVC(C=5)&lt;/td&gt;
&lt;td&gt;148.6s&lt;/td&gt;
&lt;td&gt;98.24%&lt;/td&gt;
&lt;td&gt;~25 min (est.)&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;High latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subspace RBF-SVM (Exp 07)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PCA(55) $\to$ RBF-SVC(C=5)&lt;/td&gt;
&lt;td&gt;7.2s&lt;/td&gt;
&lt;td&gt;98.60%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;22.5s (42k train)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;19.6s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~1,425 img/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dual Meta-Ensemble (Exp 08)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;90% Subspace SVM + 10% MLP&lt;/td&gt;
&lt;td&gt;364.6s&lt;/td&gt;
&lt;td&gt;98.66%&lt;/td&gt;
&lt;td&gt;544.1s (9.1 min)&lt;/td&gt;
&lt;td&gt;36.7s&lt;/td&gt;
&lt;td&gt;~763 img/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Augmented Subspace SVM (Exp 09)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2× Spatial Jitter + PCA(55) + SVM&lt;/td&gt;
&lt;td&gt;50.8s (74k)&lt;/td&gt;
&lt;td&gt;98.68%&lt;/td&gt;
&lt;td&gt;51.4s (84k train)&lt;/td&gt;
&lt;td&gt;52.9s&lt;/td&gt;
&lt;td&gt;~529 img/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dual-Axis Aug SVM (Exp 10)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3× Spatial Jitter + PCA(55) + SVM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;91.8s (111k)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98.78%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;205.6s (3.4 min, 126k)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;168.9s (2.8 min)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~166 img/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Key Technical Insights
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Latent Space Denoising Win:&lt;/strong&gt;&lt;br&gt;
Projecting onto a 55-dimensional orthogonal subspace did not just accelerate training—it acted as an optimal low-pass filter against boundary pixel noise. Subspace SVM achieved &lt;strong&gt;98.60% validation accuracy&lt;/strong&gt; versus 98.24% on uncompressed 784 pixels while training &lt;strong&gt;17× faster&lt;/strong&gt; (7.2s vs 148.6s).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Dual-Axis Spatial Augmentation Breakthrough:&lt;/strong&gt;&lt;br&gt;
Standard RBF kernels have no native translation invariance—shifting a handwritten digit by just 1 pixel changes its Euclidean distance in pixel space significantly. In Experiment 10, tripling the training partition to &lt;strong&gt;126,000 samples&lt;/strong&gt; by generating systematic horizontal (±1px on the X-axis) and vertical (±1px on the Y-axis) translational shifts provided complete 2D shift-invariance.&lt;br&gt;
Fitting the 126,000-sample pipeline took just &lt;strong&gt;3.4 minutes on mobile CPU&lt;/strong&gt; and propelled our Kaggle score to &lt;strong&gt;&lt;code&gt;0.98792&lt;/code&gt; (Rank #406 / Top 47.05%, beating 457 teams)&lt;/strong&gt;!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  6 · Day 2 Milestone Achieved: Top 47.05% on Mobile Hardware (Rank #406 / 863)
&lt;/h2&gt;

&lt;p&gt;With Experiment 10 scoring &lt;strong&gt;0.98792&lt;/strong&gt;, we officially crossed the Top 50% cutoff (&lt;code&gt;0.98739&lt;/code&gt;, Rank #431) to claim &lt;strong&gt;Rank #406 out of 863 active teams&lt;/strong&gt; worldwide.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero GPU Resources:&lt;/strong&gt; The entire progression—from empirical random guessing (0.10139) to classical ensembles (0.97578) and 126k dual-axis augmented subspace SVM (0.98792)—was engineered, trained, and submitted entirely on an Android smartphone CPU via Termux and Antigravity CLI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Looking Ahead to Day 3:&lt;/strong&gt; With all 5 daily submissions successfully completed for Day 2, our next frontier is custom lightweight Convolutional Neural Networks (LeNet-5 &amp;amp; Modern Compact ResNets) built directly on PyTorch ARM64 to break into the Top 20%.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Pocket Data Science Series · Tested on Android 14 / Termux · Debian ARM64 PRoot · Google Antigravity CLI&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;All experiment scripts (&lt;code&gt;exp01_random_baseline.py&lt;/code&gt; through &lt;code&gt;exp10_dual_axis_augmented_svm.py&lt;/code&gt;) and submissions are archived locally in &lt;code&gt;/root/digit-recognizer/&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>python</category>
      <category>android</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Pocket Data Science: Exploring Regression Baselines and Ensembles on Android with Antigravity CLI</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Sat, 26 Sep 2026 04:48:28 +0000</pubDate>
      <link>https://dev.to/malcolmlow/pocket-data-science-exploring-regression-baselines-and-ensembles-on-android-with-antigravity-cli-4jp6</link>
      <guid>https://dev.to/malcolmlow/pocket-data-science-exploring-regression-baselines-and-ensembles-on-android-with-antigravity-cli-4jp6</guid>
      <description>&lt;p&gt;&lt;em&gt;A hands-on experiment exploring regression baselines, metric properties in log space, Ridge regression, and CatBoost on Kaggle's House Prices dataset using an Android phone running Termux and Google Antigravity CLI.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;In our previous articles in the &lt;strong&gt;Pocket Data Science&lt;/strong&gt; series (&lt;a href="https://malcolmlow.com/2026/09/22/pocket-data-science-training-10-fold-ensemble-android-termux-antigravity-kaggle/" rel="noopener noreferrer"&gt;Titanic&lt;/a&gt; and &lt;a href="https://malcolmlow.com/2026/09/24/pocket-data-science-2-spaceship-titanic-android-termux-antigravity-catboost/" rel="noopener noreferrer"&gt;Spaceship Titanic&lt;/a&gt;), we explored binary classification on mobile hardware using &lt;strong&gt;Google Antigravity CLI (&lt;code&gt;agy&lt;/code&gt;)&lt;/strong&gt; running inside an Android Linux environment.&lt;/p&gt;

&lt;p&gt;In this follow-up, we turn to tabular regression with another classic entry-level benchmark: &lt;strong&gt;Kaggle's House Prices: Advanced Regression Techniques&lt;/strong&gt; (based on the Ames, Iowa housing dataset compiled by Dean De Cock).&lt;/p&gt;

&lt;p&gt;Regression brings a distinct set of practical considerations compared to binary classification: target skewness, multicollinear continuous variables, and evaluation metrics with non-linear properties. Instead of jumping straight into complex models, we walked through a step-by-step progression:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Measuring the variance of an empirical random baseline.&lt;/li&gt;
&lt;li&gt;Deriving the mathematically optimal single-number constant under Root Mean Squared Logarithmic Error (RMSLE).&lt;/li&gt;
&lt;li&gt;Using simple piecewise constant lookups to see how far basic feature grouping can go.&lt;/li&gt;
&lt;li&gt;Applying standard regularized linear regression (Ridge) and gradient boosted trees (CatBoost).&lt;/li&gt;
&lt;li&gt;Combining both models with a basic geometric blend.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All steps were executed locally on an ARM64 Android device using &lt;strong&gt;Google Antigravity CLI (&lt;code&gt;agy&lt;/code&gt;)&lt;/strong&gt; inside a Termux PRoot environment. Across eight iterations, the predictions moved from a naive random score of &lt;code&gt;0.56940&lt;/code&gt; to an ensembled score of &lt;strong&gt;&lt;code&gt;0.12363&lt;/code&gt; (Rank #704 of 3,734, Top 18.8%)&lt;/strong&gt; on the public leaderboard.&lt;/p&gt;

&lt;p&gt;Here is an objective breakdown of what each step contributed and what the results tell us about tabular regression mechanics.&lt;/p&gt;




&lt;h2&gt;
  
  
  1 · The Local Mobile Setup
&lt;/h2&gt;

&lt;p&gt;The entire pipeline was run within a standard Linux userland hosted on an Android phone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Environment:&lt;/strong&gt; Android 14 running &lt;strong&gt;Termux&lt;/strong&gt; with a Debian userspace via &lt;strong&gt;PRoot Distro&lt;/strong&gt; on 64-bit ARM (&lt;code&gt;aarch64&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assistant / CLI:&lt;/strong&gt; &lt;strong&gt;Google Antigravity CLI (&lt;code&gt;agy&lt;/code&gt;)&lt;/strong&gt; used as an interactive terminal pair programmer to run commands, inspect logs, and manage submissions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Libraries:&lt;/strong&gt; Python 3.14 with &lt;code&gt;pandas&lt;/code&gt;, &lt;code&gt;numpy&lt;/code&gt;, &lt;code&gt;scikit-learn&lt;/code&gt;, &lt;code&gt;catboost&lt;/code&gt;, and the official &lt;code&gt;kaggle&lt;/code&gt; CLI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resources:&lt;/strong&gt; Execution was kept lightweight (under 2GB peak RAM usage) with 5-fold cross-validation running comfortably in a few seconds to a couple of minutes per model.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2 · Summary of Experiment Progression
&lt;/h2&gt;

&lt;p&gt;Below is the chronological sequence of submissions evaluated against Kaggle's public test set:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Exp&lt;/th&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Kaggle RMSLE&lt;/th&gt;
&lt;th&gt;LB Rank&lt;/th&gt;
&lt;th&gt;Percentile&lt;/th&gt;
&lt;th&gt;Teams Ahead / Behind&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;01&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Empirical Random&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sample with replacement from train &lt;code&gt;SalePrice&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.56940&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#3,586&lt;/td&gt;
&lt;td&gt;Bottom 4%&lt;/td&gt;
&lt;td&gt;148 beaten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;03&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Constant Mean&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single scalar: $180,921.20&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.42577&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#3,535&lt;/td&gt;
&lt;td&gt;Bottom 5%&lt;/td&gt;
&lt;td&gt;199 beaten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;02&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Constant Median&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single scalar: $163,000.00&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.41657&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#3,528&lt;/td&gt;
&lt;td&gt;Bottom 5%&lt;/td&gt;
&lt;td&gt;206 beaten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;04&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Geometric Mean&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single scalar: $166,716.73 ($\mathbb{E}[\ln Y]$ in log space)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.41637&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#3,527&lt;/td&gt;
&lt;td&gt;Bottom 5%&lt;/td&gt;
&lt;td&gt;207 beaten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;05a&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1D Piecewise Constant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10 values: log-mean by &lt;code&gt;OverallQual&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.22613&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#3,355&lt;/td&gt;
&lt;td&gt;Top 90%&lt;/td&gt;
&lt;td&gt;379 beaten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;05b&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2D Piecewise Constant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~170 values: log-mean by &lt;code&gt;Neighborhood&lt;/code&gt; $\times$ &lt;code&gt;OverallQual&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.20945&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#3,320&lt;/td&gt;
&lt;td&gt;Top 89%&lt;/td&gt;
&lt;td&gt;414 beaten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;06&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Ridge Regression&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5-Fold CV, Median Imputer, Scaler, One-Hot Encoding&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.13002&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#1,438&lt;/td&gt;
&lt;td&gt;Top 38.5%&lt;/td&gt;
&lt;td&gt;2,296 beaten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;07&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CatBoost Regressor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5-Fold CV, Native Categoricals, 1,500 trees&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.12601&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#992&lt;/td&gt;
&lt;td&gt;Top 26.6%&lt;/td&gt;
&lt;td&gt;2,742 beaten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;08&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Blended Ensemble&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;80% CatBoost + 20% Ridge in log space&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.12363&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#704&lt;/td&gt;
&lt;td&gt;Top 18.8%&lt;/td&gt;
&lt;td&gt;3,030 beaten&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Note: Leaderboard statistics based on 3,734 total active teams on Kaggle as of September 2026).&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3 · The Baseline Hierarchy: Why Constants Reduce Error
&lt;/h2&gt;

&lt;p&gt;Before training parameterized models, establishing a baseline hierarchy provides clear lower bounds on performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exp 01: The Empirical Random Baseline (&lt;code&gt;0.56940&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;In Experiment 01, we drew random samples from the training set's &lt;code&gt;SalePrice&lt;/code&gt; distribution ($34,900 to $755,000) for each test row. &lt;/p&gt;

&lt;p&gt;Because predictions were randomly assigned without regard to house features, prediction variance was high. A modest home could easily receive a $600,000 prediction, while a large home could receive $45,000. On the public leaderboard, this scored &lt;strong&gt;&lt;code&gt;0.56940&lt;/code&gt; (Rank #3,586)&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Constant Predictions Reduce Error Immediately
&lt;/h3&gt;

&lt;p&gt;In the classical bias-variance decomposition:&lt;br&gt;
$$\text{Expected Loss} = \text{Bias}^2 + \text{Variance} + \text{Irreducible Noise}$$&lt;/p&gt;

&lt;p&gt;A single constant prediction across the entire dataset has zero variance by definition ($\text{Var}(\hat{y}) = 0$). Even though the bias is substantial, eliminating prediction variance drops the error from &lt;code&gt;0.569&lt;/code&gt; to around &lt;code&gt;0.416–0.425&lt;/code&gt; (an immediate reduction of over 25%).&lt;/p&gt;


&lt;h2&gt;
  
  
  4 · Metric Alignment: Mean vs. Median vs. Geometric Mean
&lt;/h2&gt;

&lt;p&gt;Kaggle evaluates House Prices on &lt;strong&gt;Root Mean Squared Logarithmic Error (RMSLE)&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;$$\text{RMSLE} = \sqrt{\frac{1}{N} \sum_{i=1}^{N} \left(\ln(1 + \hat{y}_i) - \ln(1 + y_i)\right)^2}$$&lt;/p&gt;

&lt;p&gt;This metric changes which constant is optimal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Arithmetic Mean ($180,921.20 — Score: &lt;code&gt;0.42577&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The sample mean minimizes squared errors in &lt;em&gt;raw dollars&lt;/em&gt; ($\sum (y_i - C)^2$). However, because Ames home prices are right-skewed by a small number of expensive homes (up to $755,000), the mean is pulled upward away from the typical home. In log space, overpredicting typical homes incurs an asymmetric penalty.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Median ($163,000.00 — Score: &lt;code&gt;0.41657&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The median minimizes Mean Absolute Error (MAE) in dollars. Because it is robust to extreme outliers, it sits closer to the center of mass of the distribution, outperforming the arithmetic mean by 0.0092 RMSLE (+7 leaderboard spots).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Geometric Mean ($166,716.73 — Score: &lt;code&gt;0.41637&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Under RMSLE, the loss is standard mean squared error on $z_i = \ln(1 + y_i)$. Setting $\frac{\partial}{\partial \hat{z}} \sum (\hat{z} - z_i)^2 = 0$ yields:&lt;br&gt;
$$\hat{z}^* = \frac{1}{N} \sum_{i=1}^{N} z_i \implies C^* = \exp(\overline{\ln(1+y)}) - 1 \approx \mathbf{\$166,716.73}$$&lt;br&gt;
This is the theoretical minimizer in log space for a single scalar. On Kaggle's test set, it yielded &lt;code&gt;0.41637&lt;/code&gt;, slightly edging out the median.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  5 · The Conceptual Bridge: Piecewise Constant Models
&lt;/h2&gt;

&lt;p&gt;Before reaching for standard scikit-learn models, we tested a simple non-parametric idea: &lt;strong&gt;Piecewise Constant Lookup Tables&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In statistical theory, regression trees (CART) are essentially algorithms that automatically partition input space into rectangular piecewise constant regions. We can test this manually by grouping test instances by one or two key features:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1D Piecewise Constant: Grouping by Overall Quality (1 to 10)
&lt;/span&gt;&lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;log_y&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log1p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SalePrice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;qual_lookup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;OverallQual&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;log_y&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;pred_log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;OverallQual&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qual_lookup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SalePrice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expm1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pred_log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OverallQual Tier&lt;/th&gt;
&lt;th&gt;Train Count&lt;/th&gt;
&lt;th&gt;Median Price&lt;/th&gt;
&lt;th&gt;Geometric Mean&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;$50,150&lt;/td&gt;
&lt;td&gt;$48,962&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;$86,250&lt;/td&gt;
&lt;td&gt;$83,908&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;397&lt;/td&gt;
&lt;td&gt;$133,000&lt;/td&gt;
&lt;td&gt;$130,700&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;319&lt;/td&gt;
&lt;td&gt;$200,141&lt;/td&gt;
&lt;td&gt;$203,165&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;$345,000&lt;/td&gt;
&lt;td&gt;$359,787&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;$432,390&lt;/td&gt;
&lt;td&gt;$408,933&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exp 05a (1D Piecewise on &lt;code&gt;OverallQual&lt;/code&gt;):&lt;/strong&gt; Using just 10 discrete values dropped the score from &lt;code&gt;0.416&lt;/code&gt; to &lt;strong&gt;&lt;code&gt;0.22613&lt;/code&gt; (Rank #3,355)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exp 05b (2D Piecewise on &lt;code&gt;Neighborhood&lt;/code&gt; $\times$ &lt;code&gt;OverallQual&lt;/code&gt;):&lt;/strong&gt; Accounting for geographic area plus quality dropped the score further to &lt;strong&gt;&lt;code&gt;0.20945&lt;/code&gt; (Rank #3,320)&lt;/strong&gt;, placing ahead of 414 submissions without running any optimization algorithm.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6 · Machine Learning Baselines: Ridge Regression and CatBoost
&lt;/h2&gt;

&lt;p&gt;With baselines established, we trained two standard tabular models using 5-fold cross-validation. For both models, the target variable was transformed via $\ln(1 + y)$ so standard squared-error loss aligns directly with RMSLE.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model 1: Regularized Ridge Regression (Exp 06 — &lt;code&gt;0.13002&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Real estate data contains significant collinearity (e.g., &lt;code&gt;GarageCars&lt;/code&gt; vs &lt;code&gt;GarageArea&lt;/code&gt;, &lt;code&gt;TotalBsmtSF&lt;/code&gt; vs &lt;code&gt;1stFlrSF&lt;/code&gt;). Ordinary Least Squares (OLS) can produce erratic coefficient swings under collinear features.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pipeline:&lt;/strong&gt; Numeric features were median-imputed and standardized (&lt;code&gt;StandardScaler&lt;/code&gt;). Categorical features were imputed with a &lt;code&gt;"Missing"&lt;/code&gt; token and one-hot encoded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;code&gt;RidgeCV&lt;/code&gt; tested 50 regularization penalties ($\alpha \in [10^{-2}, 10^3]$), converging around $\alpha \approx 18–23$.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Results:&lt;/strong&gt; 5-fold Out-Of-Fold (OOF) RMSLE was &lt;strong&gt;0.15125&lt;/strong&gt;, scoring &lt;strong&gt;&lt;code&gt;0.13002&lt;/code&gt;&lt;/strong&gt; on the public test set (&lt;strong&gt;Rank #1,438, Top 38.5%&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Model 2: CatBoost Regressor (Exp 07 — &lt;code&gt;0.12601&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;The Ames dataset contains 44 categorical columns with varying cardinality. CatBoost natively computes ordered target statistics on categoricals without requiring expansive one-hot encodings.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Setup:&lt;/strong&gt; 1,500 trees, learning rate of 0.03, depth of 6, and L2 leaf regularization of 3.0, evaluated across 5 folds with early stopping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Results:&lt;/strong&gt; 5-fold OOF RMSLE was &lt;strong&gt;0.12803&lt;/strong&gt;, scoring &lt;strong&gt;&lt;code&gt;0.12601&lt;/code&gt;&lt;/strong&gt; on the public test set (&lt;strong&gt;Rank #992, Top 26.6%&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7 · Blending the Models (Exp 08 — &lt;code&gt;0.12363&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Because linear models and decision trees make structurally different assumptions, ensembling them often reduces residual variance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ridge models smooth global trends across continuous square footage and age.&lt;/li&gt;
&lt;li&gt;CatBoost captures localized non-linear thresholds and categorical interactions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the evaluation metric operates in log space, predictions should be combined via a &lt;strong&gt;geometric blend&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;$$\ln(\hat{y}&lt;em&gt;{\text{blend}}) = w \cdot \ln(\hat{y}&lt;/em&gt;{\text{Ridge}}) + (1 - w) \cdot \ln(\hat{y}_{\text{CatBoost}})$$&lt;/p&gt;

&lt;p&gt;$$\hat{y}&lt;em&gt;{\text{blend}} = \exp\left(0.20 \cdot \ln(1 + \hat{y}&lt;/em&gt;{\text{Ridge}}) + 0.80 \cdot \ln(1 + \hat{y}_{\text{CatBoost}})\right) - 1$$&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Final Score:&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;0.12363&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leaderboard Rank:&lt;/strong&gt; &lt;strong&gt;#704&lt;/strong&gt; of 3,734 competitors (&lt;strong&gt;Top 18.85%&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Net Improvement over CatBoost alone:&lt;/strong&gt; &lt;code&gt;-0.00238&lt;/code&gt; RMSLE (+288 leaderboard places).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8 · Practical Takeaways &amp;amp; Limitations
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Understand Metric Mechanics First:&lt;/strong&gt;
If an evaluation metric uses log-transformed targets, evaluating constant baselines and ensembling in log space is mathematically required. Optimizing in raw dollars shifts model attention toward high-priced outliers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextualizing Leaderboard Ranks:&lt;/strong&gt;
While reaching the top 19% (&lt;code&gt;0.12363&lt;/code&gt;) with simple scripts is encouraging, it is important to recognize that introductory Kaggle competitions feature many inactive or incomplete submissions. In a competitive setting, moving deeper into the top 10% (&lt;code&gt;&amp;lt; 0.121&lt;/code&gt;) typically requires detailed neighborhood clustering, outlier pruning (such as Frank Harrell's known &amp;gt;4,000 sq ft Ames outliers), and stacking multiple diverse architectures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Value of a Baseline Staircase:&lt;/strong&gt;
Moving methodically from Random (&lt;code&gt;0.569&lt;/code&gt;) $\to$ Constant (&lt;code&gt;0.416&lt;/code&gt;) $\to$ Piecewise Table (&lt;code&gt;0.209&lt;/code&gt;) $\to$ Linear Model (&lt;code&gt;0.130&lt;/code&gt;) $\to$ GBDT (&lt;code&gt;0.126&lt;/code&gt;) $\to$ Blend (&lt;code&gt;0.123&lt;/code&gt;) makes it easy to audit exactly where performance gains originate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feasibility on Mobile Userspace:&lt;/strong&gt;
Consumer mobile hardware running Termux and PRoot can comfortably execute 5-fold cross-validation and tabular pipelines using modern tools like CatBoost and scikit-learn without specialized cloud instances.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://malcolmlow.com/2026/09/26/pocket-data-science-3-house-prices-regression-baselines-android-termux/" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>python</category>
      <category>android</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Pocket Data Science II: Tackling Kaggle Spaceship Titanic on Android with Antigravity &amp; CatBoost</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Thu, 24 Sep 2026 14:34:16 +0000</pubDate>
      <link>https://dev.to/malcolmlow/pocket-data-science-ii-reaching-the-kaggle-spaceship-titanic-top-6-on-android-with-antigravity-p4a</link>
      <guid>https://dev.to/malcolmlow/pocket-data-science-ii-reaching-the-kaggle-spaceship-titanic-top-6-on-android-with-antigravity-p4a</guid>
      <description>&lt;p&gt;&lt;em&gt;Training a 10-fold cross-validated ensemble directly on an Android smartphone via Termux and Google Antigravity CLI, progressing from a random baseline to competitive standings on Kaggle Spaceship Titanic, and exploring deterministic domain rules versus threshold drift.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;In &lt;a href="https://malcolmlow.com/2026/09/22/pocket-data-science-training-10-fold-ensemble-android-termux-antigravity-kaggle/" rel="noopener noreferrer"&gt;Part 1 of this series&lt;/a&gt;, we gave an autonomous AI coding assistant—&lt;strong&gt;Google Antigravity CLI (&lt;code&gt;agy&lt;/code&gt;)&lt;/strong&gt;—direct bash terminal control inside an Android Linux environment to tackle Kaggle's classic Titanic benchmark. That experiment carried us to &lt;strong&gt;Rank #291 (Top 2.89% out of 10,058)&lt;/strong&gt;, but concluded with a critical lesson: historical benchmark competitions with real-world passenger lists are deeply vulnerable to data leakage.&lt;/p&gt;

&lt;p&gt;To test whether agentic mobile data science could conquer a benchmark with &lt;strong&gt;zero possibility of leakage&lt;/strong&gt;, we challenged Antigravity with its modern, sci-fi companion: &lt;strong&gt;Kaggle's Spaceship Titanic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With 12,970 passengers traveling aboard a luxury interstellar liner engulfed by a spacetime anomaly, this competition features rich tabular signals: cryogenic suspension, cabin deck layouts, five granular expenditure categories, planetary origins, and transit groups. &lt;/p&gt;

&lt;p&gt;Operating entirely on an Android phone, the autonomous agent engineered domain-specific spatial coordinates, discovered 100% deterministic imputation rules, managed multi-model cross-validation, and vaulted to &lt;strong&gt;Rank #98 out of 1,597 competitors (Top 6.14%)&lt;/strong&gt; using pure, uncompromised machine learning.&lt;/p&gt;




&lt;h2&gt;
  
  
  1 · The Pocket ML Architecture
&lt;/h2&gt;

&lt;p&gt;Executing high-iteration cross-validation pipelines on mobile hardware requires managing constrained CPU resources, memory footprint, and operating system permissions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Host Platform:&lt;/strong&gt; Android 14 running &lt;strong&gt;Termux&lt;/strong&gt; with an unprivileged Debian userspace via &lt;strong&gt;PRoot Distro&lt;/strong&gt; on 64-bit ARM (&lt;code&gt;aarch64&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic Orchestrator:&lt;/strong&gt; &lt;strong&gt;Google Antigravity CLI (&lt;code&gt;agy&lt;/code&gt;)&lt;/strong&gt; operating in asynchronous task mode. By configuring root command prefix allowlists in &lt;code&gt;settings.json&lt;/code&gt; (&lt;code&gt;command(find)&lt;/code&gt;, &lt;code&gt;command(python3)&lt;/code&gt;, &lt;code&gt;command(kaggle)&lt;/code&gt;), the agent executes shell commands, code updates, and background training runs with zero manual prompt friction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Algorithm Stack:&lt;/strong&gt; Python 3.14 with ARM64-optimized &lt;code&gt;catboost&lt;/code&gt;, &lt;code&gt;scikit-learn&lt;/code&gt; (&lt;code&gt;HistGradientBoostingClassifier&lt;/code&gt;), &lt;code&gt;pandas&lt;/code&gt;, &lt;code&gt;numpy&lt;/code&gt;, and the official &lt;code&gt;kaggle&lt;/code&gt; CLI.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+--------------------------------------------------------------+
|                     Android 14 (ARM64)                       |
|   +------------------------------------------------------+   |
|   |                 Termux / PRoot Distro                |   |
|   |   +----------------------------------------------+   |   |
|   |   |        Google Antigravity CLI (`agy`)        |   |   |
|   |   |  - Async Task Spawner  - Settings Allowlist  |   |   |
|   |   +----------------------+-----------------------+   |   |
|   |                          |                           |   |
|   |      +-------------------+-------------------+       |   |
|   |      v                                       v       |   |
|   |  [Feature Pipeline]                     [Kaggle CLI] |   |
|   |  - Deterministic Imputation             - Submissions|   |
|   |  - Spatial Coordinates &amp;amp; Spend          - Public LB  |   |
|   |      |                                               |   |
|   |      v                                               |   |
|   |  [10-Fold Stratified Cross-Validation]               |   |
|   |  - CatBoost (Ordered Boosting)                       |   |
|   |  - HistGradientBoosting (Histogram GBDT)             |   |
|   +------------------------------------------------------+   |
+--------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2 · The Experiment Progression: From Bottom 2% to Top 6%
&lt;/h2&gt;

&lt;p&gt;Over five iterative experiments, the mobile pipeline climbed from a blind coin-flip baseline to the top 6% of the global leaderboard:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Experiment&lt;/th&gt;
&lt;th&gt;Architecture &amp;amp; Strategy&lt;/th&gt;
&lt;th&gt;Local CV / OOF&lt;/th&gt;
&lt;th&gt;Public Score&lt;/th&gt;
&lt;th&gt;Leaderboard Rank&lt;/th&gt;
&lt;th&gt;Percentile&lt;/th&gt;
&lt;th&gt;Integrity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 01&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stratified Random Prior Baseline&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.51110&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#1,568&lt;/td&gt;
&lt;td&gt;Bottom 2%&lt;/td&gt;
&lt;td&gt;Anchor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 02&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CatBoost 80:20 Holdout Baseline&lt;/td&gt;
&lt;td&gt;0.8056&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.80009&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#902&lt;/td&gt;
&lt;td&gt;Top 56.48%&lt;/td&gt;
&lt;td&gt;Pure ML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 03&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5-Fold CatBoost + Domain Engineering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.8163&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.80967&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;#98&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Top 6.14%&lt;/strong&gt; 🏆&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Pure ML Peak&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 04&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10-Fold Blended Stack (Threshold Shift to 0.480)&lt;/td&gt;
&lt;td&gt;0.8205&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.80547&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#429&lt;/td&gt;
&lt;td&gt;Top 26.86%&lt;/td&gt;
&lt;td&gt;Overfit Threshold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 05&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10-Fold Tuned CatBoost (Prior Cutoff 0.500)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.8172&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.80757&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;#234&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Top 14.65%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pure ML&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3 · The Breakthrough: Deterministic Domain Deductions
&lt;/h2&gt;

&lt;p&gt;Before training any complex models, Antigravity conducted an exploratory audit of the dataset's logical structure. Tabular machine learning often stumbles when treating missing values as random noise (&lt;code&gt;NaN&lt;/code&gt;). In Spaceship Titanic, the data contains rigid domain laws that can be solved deterministically:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The 100% Purity Surname-to-Planet Law
&lt;/h3&gt;

&lt;p&gt;Each passenger name contains a surname (&lt;code&gt;Name.split()[-1]&lt;/code&gt;). An analysis across all 12,970 passengers revealed &lt;strong&gt;2,400 unique surnames&lt;/strong&gt;. Crucially:&lt;br&gt;
$$\text{Surnames with passengers from multiple home planets} = \mathbf{0}$$&lt;/p&gt;

&lt;p&gt;Every family surname belongs to exactly one planetary culture (Earth, Europa, or Mars). By creating a reverse dictionary of known surnames, the agent recovered &lt;strong&gt;271 missing &lt;code&gt;HomePlanet&lt;/code&gt; entries&lt;/strong&gt; with 100% mathematical certainty.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Physical Deck Constraints
&lt;/h3&gt;

&lt;p&gt;The spaceship's architecture enforces strict passenger zoning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decks A, B, C, and T:&lt;/strong&gt; Exclusively luxury European cabins (&lt;strong&gt;100% Europa&lt;/strong&gt;, 0 Earth, 0 Mars).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deck G:&lt;/strong&gt; Exclusively steerage Earth cabins (&lt;strong&gt;100% Earth&lt;/strong&gt;, 0 Europa, 0 Mars).&lt;/li&gt;
&lt;li&gt;If a passenger's &lt;code&gt;HomePlanet&lt;/code&gt; was missing but their cabin deck was known, their origin was imputed with zero error.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. The CryoSleep Expenditure Paradox
&lt;/h3&gt;

&lt;p&gt;Passengers in cryogenic suspension are frozen in sealed pods throughout the voyage:&lt;br&gt;
$$\text{Passengers in CryoSleep who spent money on amenities} = \mathbf{0}$$&lt;/p&gt;

&lt;p&gt;If a passenger has missing &lt;code&gt;CryoSleep&lt;/code&gt; data but logged spending $&amp;gt; 0$ on &lt;code&gt;RoomService&lt;/code&gt;, &lt;code&gt;FoodCourt&lt;/code&gt;, &lt;code&gt;ShoppingMall&lt;/code&gt;, &lt;code&gt;Spa&lt;/code&gt;, or &lt;code&gt;VRDeck&lt;/code&gt;, their &lt;code&gt;CryoSleep&lt;/code&gt; status &lt;strong&gt;must be &lt;code&gt;False&lt;/code&gt;&lt;/strong&gt;. This recovered 174 missing values instantly. Conversely, missing amenity values for passengers confirmed in CryoSleep were set directly to &lt;code&gt;0.0&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Deterministic domain imputation pipeline
# 1. CryoSleep resolution
&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;TotalSpend_raw&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CryoSleep&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;TotalSpend_raw&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CryoSleep&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Deck zoning resolution
&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Cabin_Deck&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;isin&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;B&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;C&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;T&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HomePlanet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Cabin_Deck&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;isin&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;B&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;C&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;T&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HomePlanet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Europa&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Cabin_Deck&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;G&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HomePlanet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Cabin_Deck&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;G&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HomePlanet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Earth&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Surname origin recovery
&lt;/span&gt;&lt;span class="n"&gt;surname_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dropna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Surname&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HomePlanet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;drop_duplicates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Surname&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;set_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Surname&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HomePlanet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;to_dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HomePlanet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HomePlanet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Surname&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;surname_map&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Earth&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Underage constraints (Children under 13 cannot spend; under 18 cannot be VIP)
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;amenity&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;RoomService&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;FoodCourt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ShoppingMall&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Spa&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;VRDeck&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CryoSleep&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amenity&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CryoSleep&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amenity&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amenity&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amenity&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;VIP&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;VIP&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HomePlanet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Earth&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;VIP&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HomePlanet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Earth&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;VIP&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;fillna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4 · Spatial Coordinates &amp;amp; The Luxury Spend Bifurcation
&lt;/h2&gt;

&lt;p&gt;Once missing values were repaired, Antigravity engineered two feature families that drove the leap to &lt;strong&gt;0.80967 (Top 6%)&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Spatial Cabin Coordinates (&lt;code&gt;Deck_Side&lt;/code&gt; and &lt;code&gt;Cabin_Num&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;The anomaly did not strike the ship uniformly. Splitting &lt;code&gt;Cabin&lt;/code&gt; into &lt;code&gt;Deck&lt;/code&gt;, numeric position &lt;code&gt;Cabin_Num&lt;/code&gt;, and &lt;code&gt;Side&lt;/code&gt; (Port vs Starboard) unlocked massive regional variance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deck B Starboard (&lt;code&gt;B_S&lt;/code&gt;):&lt;/strong&gt; &lt;strong&gt;78.4% Transported&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deck C Starboard (&lt;code&gt;C_S&lt;/code&gt;):&lt;/strong&gt; &lt;strong&gt;76.4% Transported&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deck E Port (&lt;code&gt;E_P&lt;/code&gt;):&lt;/strong&gt; &lt;strong&gt;34.3% Transported&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deck T Port (&lt;code&gt;T_P&lt;/code&gt;):&lt;/strong&gt; &lt;strong&gt;25.0% Transported&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A passenger's physical position along the ship's longitudinal axis (&lt;code&gt;Cabin_Region = Cabin_Num // 300&lt;/code&gt;) proved to be one of the top five most influential features in CatBoost's tree splits.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Luxury Service Spend vs. Subsistence Spend
&lt;/h3&gt;

&lt;p&gt;Aggregating total spending showed a huge division:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Spenders (&lt;code&gt;ZeroSpend == True&lt;/code&gt;):&lt;/strong&gt; &lt;strong&gt;78.6% Transported&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active Spenders (&lt;code&gt;ZeroSpend == False&lt;/code&gt;):&lt;/strong&gt; &lt;strong&gt;29.9% Transported&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More critically, spending type mattered intensely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service / Solitary Luxury (&lt;code&gt;RoomService&lt;/code&gt; + &lt;code&gt;Spa&lt;/code&gt; + &lt;code&gt;VRDeck&lt;/code&gt;):&lt;/strong&gt; Strong negative correlation ($-0.3561$) with transport.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social / Subsistence (&lt;code&gt;FoodCourt&lt;/code&gt; + &lt;code&gt;ShoppingMall&lt;/code&gt;):&lt;/strong&gt; Weakly positive correlation ($+0.0491$).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Passengers spending heavily in isolated spas or VR decks were overwhelmingly spared from the anomaly, while passengers gathered in public food courts shared the fate of the ship's general corridors.&lt;/p&gt;




&lt;h2&gt;
  
  
  5 · The Diagnostic: The Hazard of Threshold Overfitting (Exp 04 vs Exp 03)
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;Exp 04&lt;/strong&gt;, we expanded from 5 folds to a 10-fold blended ensemble combining &lt;strong&gt;CatBoost&lt;/strong&gt; (70%) and &lt;strong&gt;HistGradientBoosting&lt;/strong&gt; (30%). &lt;/p&gt;

&lt;p&gt;On local validation, the raw blend scored &lt;code&gt;0.8193&lt;/code&gt;. Seeking to squeeze out every drop of performance, we swept the decision threshold on Out-Of-Fold probabilities and found that shifting the threshold to &lt;strong&gt;&lt;code&gt;0.480&lt;/code&gt;&lt;/strong&gt; pushed our local cross-validation score to a peak &lt;strong&gt;&lt;code&gt;0.8205&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Yet when submitted to Kaggle, the public leaderboard score &lt;strong&gt;dropped from &lt;code&gt;0.80967&lt;/code&gt; to &lt;code&gt;0.80547&lt;/code&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Exp 03 (Thresh 0.500) -&amp;gt; Test Positive Rate: 51.62% -&amp;gt; Public LB: 0.80967 (Rank #98)
Exp 04 (Thresh 0.480) -&amp;gt; Test Positive Rate: 53.21% -&amp;gt; Public LB: 0.80547 (Rank #429)
                                             ^^^^^^
                                             Over-predicting True by +1.6%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Lesson: Empirical Prior Matching
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In balanced binary classification ($P(Y=1) \approx 0.5036$), tuning decision thresholds on small validation partitions risks overfitting to local sample variance.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;0.480&lt;/code&gt; cutoff caused the model to over-predict &lt;code&gt;True&lt;/code&gt; by 100 passengers (53.21% vs 51.62%).&lt;/li&gt;
&lt;li&gt;When we reverted to an anchored &lt;code&gt;0.500&lt;/code&gt; cutoff in &lt;strong&gt;Exp 05&lt;/strong&gt;, test balance was restored (51.04% True), and public accuracy rebounded immediately to &lt;code&gt;0.80757&lt;/code&gt; (Rank #234).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6 · The Integrity Check: The Clean Machine Learning Benchmark
&lt;/h2&gt;

&lt;p&gt;In our classic Titanic post, we analyzed how family groups spanned both train and test sets, enabling data leakage through ticket-level passenger lookups. &lt;/p&gt;

&lt;p&gt;Before celebrating our &lt;strong&gt;Rank #98&lt;/strong&gt; standing in Spaceship Titanic, we ran a verification check on group contamination:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GroupId&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PassengerId&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GroupId&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PassengerId&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;overlap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GroupId&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;intersection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GroupId&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Groups spanning both train and test:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# Output: 0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kaggle engineered Spaceship Titanic with &lt;strong&gt;Group-Stratified partitioning&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zero groups overlap between train and test.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Every travel group is either 100% in train or 100% in test.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This proves that our &lt;strong&gt;Top 6.14% standing (Rank #98 out of 1,597)&lt;/strong&gt; was achieved with &lt;strong&gt;100% genuine algorithmic generalization&lt;/strong&gt;, completely free of historical lookups or companion label leakage.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Engineering Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Deduction Beats Hyperparameter Tuning:&lt;/strong&gt; Recovering 271 &lt;code&gt;HomePlanet&lt;/code&gt; entries via surname purity and resolving &lt;code&gt;CryoSleep&lt;/code&gt; via expenditure constraints provided larger accuracy gains than days of Bayesian hyperparameter optimization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beware the Validation Threshold Trap:&lt;/strong&gt; Optimizing decision thresholds on out-of-fold predictions can distort test set priors on balanced datasets. In symmetrical problems, anchoring your threshold to the empirical training prior preserves leaderboard stability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autonomous Mobile Data Science is Maturing Fast:&lt;/strong&gt; Running &lt;strong&gt;Google Antigravity CLI&lt;/strong&gt; in an unprivileged PRoot userspace on Android 14 proved capable of managing complex 10-fold cross-validations, tracking experiments, diagnosing threshold drift, and reaching the top tier of competitive data science—entirely from a device that fits in your palm.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;All code, feature scripts (&lt;code&gt;exp01&lt;/code&gt; through &lt;code&gt;exp05&lt;/code&gt;), and submission files are archived locally in &lt;code&gt;/root/spaceship-titanic/&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  *
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Next in the Series: Pocket Data Science Part III
&lt;/h3&gt;

&lt;p&gt;In &lt;strong&gt;&lt;a href="https://dev.to/malcolmlow/pocket-data-science-exploring-regression-baselines-and-ensembles-on-android-with-antigravity-cli-4jp6"&gt;Pocket Data Science Part III&lt;/a&gt;&lt;/strong&gt; (also on &lt;a href="https://malcolmlow.com/2026/09/26/pocket-data-science-3-house-prices-regression-baselines-android-termux/" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;), we move from binary classification to tabular regression on &lt;strong&gt;Kaggle's House Prices&lt;/strong&gt; benchmark, exploring metric alignment in log space (RMSLE), constant baseline hierarchies, Ridge regression, and CatBoost ensembling.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://malcolmlow.com/2026/09/23/pocket-data-science-2-spaceship-titanic-android-termux-antigravity-catboost/" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>python</category>
      <category>android</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Pocket Data Science: Training a 10-Fold Blended Ensemble on Android via Termux, Antigravity CLI, and Kaggle</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Tue, 22 Sep 2026 01:39:32 +0000</pubDate>
      <link>https://dev.to/malcolmlow/pocket-data-science-training-a-10-fold-blended-ensemble-on-android-via-termux-antigravity-cli-515d</link>
      <guid>https://dev.to/malcolmlow/pocket-data-science-training-a-10-fold-blended-ensemble-on-android-via-termux-antigravity-cli-515d</guid>
      <description>&lt;p&gt;&lt;em&gt;Training a 10-fold blended ensemble on Android Termux with Google Antigravity CLI, reaching the Kaggle Titanic Top 3% (Rank #291 of 10,058), and navigating the boundary between pure algorithmic machine learning and historical data leakage.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;What happens when you give an agentic AI coding assistant direct terminal control inside a Linux userspace running entirely on an Android smartphone? &lt;/p&gt;

&lt;p&gt;We decided to find out by putting &lt;strong&gt;Google Antigravity CLI (&lt;code&gt;agy&lt;/code&gt;)&lt;/strong&gt; through one of competitive data science’s classic initiation rites: &lt;strong&gt;Kaggle's Titanic: Machine Learning from Disaster&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Starting from a blind coin-flip baseline, we allowed the agent to autonomously engineer relational features, validate multi-model ensembles, manage background training tasks, and submit predictions via the official Kaggle CLI. The pipeline reached &lt;strong&gt;Rank #291 (Top 2.89% out of 10,058 competitors)&lt;/strong&gt; using 100% pure machine learning—before an attempt to push into the Top 1% sparked a critical reality check on data leakage in historical benchmark competitions.&lt;/p&gt;




&lt;h2&gt;
  
  
  1 · The Mobile ML Stack: Linux in Your Pocket
&lt;/h2&gt;

&lt;p&gt;Running machine learning pipelines locally on mobile hardware requires bridging Android's security constraints with standard GNU/Linux compilation toolchains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Host Environment:&lt;/strong&gt; Android 14 running &lt;strong&gt;Termux&lt;/strong&gt; with a Debian/Ubuntu userspace via &lt;strong&gt;PRoot Distro&lt;/strong&gt; on 64-bit ARM (&lt;code&gt;aarch64&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic Orchestrator:&lt;/strong&gt; &lt;strong&gt;Google Antigravity CLI (&lt;code&gt;agy&lt;/code&gt;)&lt;/strong&gt; operating in background task execution mode, managing terminal sandboxing, file diffing, and iterative pipeline evaluation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python Toolchain:&lt;/strong&gt; Python 3.14 with ARM64-compiled &lt;code&gt;catboost&lt;/code&gt;, &lt;code&gt;scikit-learn&lt;/code&gt;, &lt;code&gt;pandas&lt;/code&gt;, &lt;code&gt;numpy&lt;/code&gt;, and the official &lt;code&gt;kaggle&lt;/code&gt; CLI.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2 · The Experiment Progression: From Bottom 5% to Top 3%
&lt;/h2&gt;

&lt;p&gt;Over six iterative experiments, Antigravity evolved the architecture from a random prior to a top-tier blended ensemble:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Experiment&lt;/th&gt;
&lt;th&gt;Architecture &amp;amp; Strategy&lt;/th&gt;
&lt;th&gt;CV / OOF Acc&lt;/th&gt;
&lt;th&gt;Public Score&lt;/th&gt;
&lt;th&gt;Leaderboard Rank&lt;/th&gt;
&lt;th&gt;Percentile&lt;/th&gt;
&lt;th&gt;Integrity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 01&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stratified Random Coin Flip&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.49760&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~#9,600&lt;/td&gt;
&lt;td&gt;Bottom 5%&lt;/td&gt;
&lt;td&gt;Pure ML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 02&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CatBoost 70:30 Holdout Validation&lt;/td&gt;
&lt;td&gt;0.8321&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.78229&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#2,449&lt;/td&gt;
&lt;td&gt;Top 24.35%&lt;/td&gt;
&lt;td&gt;Pure ML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 03&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5-Fold CatBoost + Group Survival Linking&lt;/td&gt;
&lt;td&gt;0.8698&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.79904&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#492&lt;/td&gt;
&lt;td&gt;Top 4.89%&lt;/td&gt;
&lt;td&gt;Pure ML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 04&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10-Fold Blended Ensemble (CatBoost+RF+ET)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.8698&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.80382&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;#291&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Top 2.89%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Pure ML Peak&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 05&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10-Fold Stack + Historical Passenger Overrides&lt;/td&gt;
&lt;td&gt;0.8709&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.83253&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;#98&lt;/td&gt;
&lt;td&gt;Top 0.96%&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Disqualified (Leakage)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exp 06&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10-Fold Decoupled WCG Ensemble (Zero Leaks)&lt;/td&gt;
&lt;td&gt;0.8698&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.80382&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;#291&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Top 2.89%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Pure ML Verified&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3 · The Turning Point: Relational Group Survival Target Encoding
&lt;/h2&gt;

&lt;p&gt;Standard tabular machine learning models assume each row is independent and identically distributed (I.I.D.). But passengers aboard the Titanic were &lt;strong&gt;not independent&lt;/strong&gt;; they traveled in family clusters and entourage groups sharing the same ticket number.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Relational Group Survival Rule:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If other women and children in a passenger's ticket group survived, the passenger's likelihood of reaching a lifeboat increases drastically. Conversely, if women and children in a third-class ticket group perished, the entire family was almost universally lost.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To prevent data leakage during training, Antigravity implemented &lt;strong&gt;Leave-One-Out (LOO) target encoding&lt;/strong&gt; across shared ticket groups:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Leak-free relational target encoding for ticket clusters
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grp&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;df_all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Ticket&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;known&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;grp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;grp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Survived&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;notna&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
        &lt;span class="n"&gt;wc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;known&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;known&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Sex&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;female&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;known&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IsChild&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;s_mean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Survived&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;grp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="c1"&gt;# Strictly decouple: adult males do not inherit 1.0 from women
&lt;/span&gt;                &lt;span class="nf"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df_all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Sex&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;female&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df_all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IsChild&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                    &lt;span class="n"&gt;df_all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Group_Survival&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s_mean&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4 · The 10-Fold Blended Architecture (Exp 04 — 0.80382)
&lt;/h2&gt;

&lt;p&gt;To stabilize variance and maximize generalization, Antigravity trained a 10-fold stratified heterogeneous ensemble combining three complementary tree architectures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CatBoost (60% weight, depth=4, L2 reg=4.0):&lt;/strong&gt; Handles categorical combinations (&lt;code&gt;Title&lt;/code&gt;, &lt;code&gt;Pclass&lt;/code&gt;, &lt;code&gt;Deck&lt;/code&gt;) via ordered target statistics without overfitting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Random Forest (25% weight, depth=5, min_samples_leaf=2):&lt;/strong&gt; Smooths variance across continuous dimensions like &lt;code&gt;Fare_Per_Person&lt;/code&gt; and &lt;code&gt;Age&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extra Trees (15% weight, depth=5):&lt;/strong&gt; Introduces randomized orthogonal cut points to prevent decision boundary distortion on rare title classes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Validation Results:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10-Fold OOF Accuracy: &lt;strong&gt;0.8698 (86.98%)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;10-Fold OOF ROC-AUC: &lt;strong&gt;0.9029&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Kaggle Public Score: &lt;strong&gt;0.80382 (Rank #291 of 10,058, Top 2.89%)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5 · The Plot Twist: "Is This Cheating Since You Knew the Result?"
&lt;/h2&gt;

&lt;p&gt;Aiming for the Top 2% threshold ($\ge$ &lt;code&gt;0.81100&lt;/code&gt;, requiring exactly 3 more correctly classified test passengers), Antigravity audited test cases where model probabilities fell between 0.45 and 0.55.&lt;/p&gt;

&lt;p&gt;It created a post-processing pass that corroborated borderline cases against historical inquiry records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flipping steerage tragedy families (Andersson, Peacock, Klasen, Lindell) where all members perished.&lt;/li&gt;
&lt;li&gt;Rescuing 9-year-old Artur Karl Olsen (&lt;code&gt;Pid 913&lt;/code&gt;), who was historically placed into Lifeboat 13.&lt;/li&gt;
&lt;li&gt;Correcting Col. John Jacob Astor IV (&lt;code&gt;Pid 1094&lt;/code&gt;), who died despite traveling in a wealthy 1st-class entourage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When submitted to Kaggle, the score jumped to &lt;strong&gt;&lt;code&gt;0.83253&lt;/code&gt;&lt;/strong&gt;, placing the submission at &lt;strong&gt;Rank #98 (Top 0.96% out of 10,058 competitors)&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Human Pair Programmer's Challenge:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;"is this cheating since u knew the result?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer was an unequivocal &lt;strong&gt;yes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In competitive machine learning, hardcoding individual test instance overrides (&lt;code&gt;if pid == 1094: died&lt;/code&gt;) completely invalidates the model. If a new passenger manifest from an unrecorded shipwreck arrived, those manual lookups would be entirely useless. We immediately disqualified Exp 05 and set a strict rule: &lt;em&gt;all predictions must be derived purely through algorithmic machine learning&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  6 · The Mathematical Information Ceiling of Tabular Data
&lt;/h2&gt;

&lt;p&gt;Why does pure machine learning hit an empirical ceiling around &lt;strong&gt;0.803–0.808&lt;/strong&gt; on Kaggle Titanic?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Missing Spatial Dynamics:&lt;/strong&gt; In 1912, lifeboat access was heavily dependent on physical location at 1:30 AM. First Officer Murdoch allowed men into starboard boats when no women were in sight; Second Officer Lightoller strictly enforced "women only" on the port side. The dataset contains no feature indicating which side of the boat deck a passenger stood on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entropy Limit:&lt;/strong&gt; Achieving &lt;code&gt;0.80382&lt;/code&gt; represents correctly predicting &lt;strong&gt;336 out of 418 test passengers&lt;/strong&gt;. The remaining 19% of outcomes represent chaotic real-world variance that cannot be resolved without overfitting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Final Pure ML Benchmark:&lt;/strong&gt; At &lt;strong&gt;0.80382 (Rank #291 out of 10,058)&lt;/strong&gt;, the automated mobile pipeline placed ahead of &lt;strong&gt;9,767 submissions on the leaderboard&lt;/strong&gt; through pure algorithmic feature engineering and multi-model stacking.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Engineering Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mobile Autonomous Agents are Production-Ready:&lt;/strong&gt; Running Google Antigravity inside Termux PRoot proved that full-lifecycle ML projects—from dependency compilation to 10-fold CV and API submissions—can execute reliably on consumer mobile devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relational Engineering Trumps Hyperparameters:&lt;/strong&gt; The single largest leap in genuine predictive accuracy came from capturing social and ticket group structures, not from hyperparameter grid searches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guard Your Validation Boundaries:&lt;/strong&gt; As autonomous coding agents become faster and more capable, human oversight remains vital to preserve ethical data boundaries and prevent subtle contamination.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  *
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Pocket Data Science Series
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Part I (This Article):&lt;/strong&gt; 10-Fold Ensembles on Titanic (Top 3%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part II:&lt;/strong&gt; &lt;a href="https://dev.to/malcolmlow/pocket-data-science-ii-reaching-the-kaggle-spaceship-titanic-top-6-on-android-with-antigravity-p4a"&gt;Spaceship Titanic with Domain Deductions &amp;amp; CatBoost (Top 6%)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part III:&lt;/strong&gt; &lt;a href="https://dev.to/malcolmlow/pocket-data-science-exploring-regression-baselines-and-ensembles-on-android-with-antigravity-cli-4jp6"&gt;House Prices Regression Baselines, Metric Alignment, and Ensembling (Top 19%)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://malcolmlow.com/2026/09/22/pocket-data-science-training-10-fold-ensemble-android-termux-antigravity-kaggle/" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>python</category>
      <category>android</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Running Google's Antigravity CLI on Termux: The Complete Workaround for Broken ARM64 Builds</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Sun, 20 Sep 2026 04:01:29 +0000</pubDate>
      <link>https://dev.to/malcolmlow/running-googles-antigravity-cli-on-termux-the-complete-workaround-for-broken-arm64-builds-2dp</link>
      <guid>https://dev.to/malcolmlow/running-googles-antigravity-cli-on-termux-the-complete-workaround-for-broken-arm64-builds-2dp</guid>
      <description>&lt;blockquote&gt;
&lt;h2&gt;
  
  
  *
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Field Tests &amp;amp; Applications: The Pocket Data Science Series
&lt;/h3&gt;

&lt;p&gt;See this Termux + Antigravity CLI workflow deployed across competitive machine learning benchmarks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Part I:&lt;/strong&gt; &lt;a href="https://dev.to/malcolmlow/pocket-data-science-training-a-10-fold-blended-ensemble-on-android-via-termux-antigravity-cli-515d"&gt;Training a 10-Fold Blended Ensemble on Titanic (Top 3%)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part II:&lt;/strong&gt; &lt;a href="https://dev.to/malcolmlow/pocket-data-science-ii-reaching-the-kaggle-spaceship-titanic-top-6-on-android-with-antigravity-p4a"&gt;Spaceship Titanic with Domain Deductions &amp;amp; CatBoost (Top 6%)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part III:&lt;/strong&gt; &lt;a href="https://dev.to/malcolmlow/pocket-data-science-exploring-regression-baselines-and-ensembles-on-android-with-antigravity-cli-4jp6"&gt;House Prices Regression Baselines, Metric Alignment, and Ensembling (Top 19%)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://malcolmlow.com/2026/09/18/run-google-antigravity-cli-termux-proot/" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Google's Antigravity CLI (&lt;code&gt;agy&lt;/code&gt;) provides powerful agentic pair programming and terminal workflows. However, running the official ARM64 binary directly inside Android Termux fails immediately because Android's Bionic libc rejects misaligned Thread-Local Storage (TLS) segments generated by modern GNU/Linux toolchains.&lt;/p&gt;

&lt;p&gt;By hosting the CLI inside an isolated glibc userspace via &lt;strong&gt;PRoot Distro&lt;/strong&gt;, you can run Antigravity flawlessly on Android. Below is the complete step-by-step setup—from bypassing the TLS bug and creating a 1-click Termux wrapper, to connecting the official WordPress.com MCP server, eliminating confirmation prompts with native read skills, and configuring Android so OAuth browser windows pop up automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  1 · Install PRoot Distro in Termux
&lt;/h2&gt;

&lt;p&gt;Termux provides &lt;code&gt;proot-distro&lt;/code&gt; to manage chroot-like Linux root filesystems without requiring device root privileges. Install it via &lt;code&gt;pkg&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkg update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pkg &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; proot-distro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2 · Install and Enter Ubuntu Chroot
&lt;/h2&gt;

&lt;p&gt;Deploy a minimal Ubuntu environment. This downloads the official ARM64 root filesystem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;proot-distro &lt;span class="nb"&gt;install &lt;/span&gt;ubuntu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the installation finishes, log into the Ubuntu rootfs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;proot-distro login ubuntu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3 · Install Dependencies &amp;amp; Antigravity CLI
&lt;/h2&gt;

&lt;p&gt;Minimal container images do not ship with SSL certificates or download utilities. Update the package lists and install &lt;code&gt;curl&lt;/code&gt; and &lt;code&gt;ca-certificates&lt;/code&gt; before running the installer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; curl ca-certificates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run Google's official Antigravity CLI installation script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://antigravity.google/cli/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installer detects the Linux ARM64 kernel architecture and writes the binary to &lt;code&gt;/root/.local/bin/agy&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4 · Add to PATH and Verify
&lt;/h2&gt;

&lt;p&gt;Ensure the binary is discoverable in your interactive shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="/root/.local/bin:$PATH"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify that the binary executes cleanly under glibc:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agy &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Type &lt;code&gt;exit&lt;/code&gt; when finished to return to the native Termux shell.&lt;/p&gt;




&lt;h2&gt;
  
  
  5 · Native Termux Wrapper Shortcut &amp;amp; Browser Bridge
&lt;/h2&gt;

&lt;p&gt;Opening the Ubuntu chroot manually every time you want to execute an agent command is tedious. You can create a transparent wrapper script directly in Termux's native binary path (&lt;code&gt;$PREFIX/bin/agy&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;' &amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;&lt;span class="sh"&gt;/bin/agy
#!/data/data/com.termux/files/usr/bin/bash
exec proot-distro login ubuntu -- agy "&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="sh"&gt;"
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x &lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/bin/agy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, configure the Android browser bridge inside Ubuntu so OAuth links and web preview commands pop open automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;' &amp;gt; /usr/local/bin/xdg-open
#!/bin/sh
exec /data/data/com.termux/files/usr/bin/termux-open-url "&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="sh"&gt;"
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /usr/local/bin/xdg-open
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Test the bridge immediately:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xdg-open &lt;span class="s2"&gt;"https://malcolmlow.com/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your default Android mobile browser (such as Chrome) will pop open into the foreground instantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  6 · Eliminating Prompt Fatigue: The Native Read Skill &amp;amp; Sandboxed Python
&lt;/h2&gt;

&lt;p&gt;One of the biggest practical hurdles when running an autonomous AI pair programmer inside Android Termux is &lt;strong&gt;confirmation prompt fatigue&lt;/strong&gt;. In a mobile environment, having the agent pause every few seconds to ask for manual CLI approval completely breaks the autonomous flow.&lt;/p&gt;

&lt;p&gt;Three key configurations and architectural practices are absolute lifesavers for achieving a completely hands-off, prompt-free workflow:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Native Read Skill (Life Saver for File Inspection)
&lt;/h3&gt;

&lt;p&gt;Instead of executing terminal commands like &lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;head&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, or writing temporary Python scripts to inspect files—which trigger security confirmation prompts whenever commands attempt to run outside the sandbox—rely strictly on Antigravity's built-in &lt;strong&gt;native Read skill (&lt;code&gt;view_file&lt;/code&gt;)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The native read tool executes directly in-process without spawning subshells, making it 100% silent and immune to permission prompts. It reads source code, JSON configs, and conversation transcripts instantaneously using slice notation and byte offsets.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Standard Sandboxed Python Execution
&lt;/h3&gt;

&lt;p&gt;Avoid inline unsandboxed commands such as &lt;code&gt;python3 -c "..."&lt;/code&gt; with sandbox bypass flags (&lt;code&gt;BypassSandbox: true&lt;/code&gt;). In Android's Linux environment, running unsandboxed subprocesses repeatedly triggers confirmation dialogs and can fail under restricted system permissions (such as &lt;code&gt;fork/exec: operation not permitted&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Instructing the agent to execute all Python code &lt;strong&gt;strictly inside the standard sandbox&lt;/strong&gt; (and structuring logic into script files) allows it to run computations, data transformations, and tests completely autonomously without stopping for manual approvals.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Setting Permission to "Proceed in Sandbox" in Settings
&lt;/h3&gt;

&lt;p&gt;To ensure commands run seamlessly without manual prompts, enable the terminal sandbox and set the agent's tool execution policy to &lt;strong&gt;Proceed in Sandbox&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Option A: Via CLI Configuration File (&lt;code&gt;~/.gemini/antigravity-cli/settings.json&lt;/code&gt;)
&lt;/h4&gt;

&lt;p&gt;Add or update the following configuration in your Antigravity settings file (&lt;code&gt;~/.gemini/antigravity-cli/settings.json&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"enableTerminalSandbox"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"toolPermission"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"proceed-in-sandbox"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allowNonWorkspaceAccess"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trustedWorkspaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"/root"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"enableTerminalSandbox": true&lt;/code&gt;: Activates the secure sandbox execution environment for agent commands.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"toolPermission": "proceed-in-sandbox"&lt;/code&gt;: Instructs Antigravity to &lt;strong&gt;always proceed automatically&lt;/strong&gt; with commands running inside the sandbox without asking for manual confirmation. You will only be prompted if a command explicitly requests to bypass the sandbox.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"trustedWorkspaces"&lt;/code&gt;: Defines your working directories as trusted workspaces, preventing non-workspace path access prompts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Option B: In Antigravity Settings UI
&lt;/h4&gt;

&lt;p&gt;If you are using Antigravity IDE or the desktop UI:&lt;br&gt;
Navigate to &lt;strong&gt;Settings&lt;/strong&gt; (gear icon in sidebar) → &lt;strong&gt;Agent Settings &amp;amp; Permissions&lt;/strong&gt; → set &lt;strong&gt;Tool Execution Policy&lt;/strong&gt; to &lt;strong&gt;Proceed in Sandbox&lt;/strong&gt; (or &lt;code&gt;proceed-in-sandbox&lt;/code&gt;), and ensure &lt;strong&gt;Terminal Sandbox&lt;/strong&gt; is toggled &lt;strong&gt;On&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Pro Workflow Tip:&lt;/strong&gt; Combine the native file reader, sandboxed Python, &lt;code&gt;"toolPermission": "proceed-in-sandbox"&lt;/code&gt;, and native MCP servers (such as the official WordPress.com MCP server with &lt;code&gt;user_confirmed: true&lt;/code&gt;). This configuration turns Antigravity into a fully autonomous mobile workstation that inspects, codes, and publishes live to the web completely silently.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Technical Insights &amp;amp; FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why does the binary fail on native Termux?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Android's dynamic linker (Bionic) strictly validates Thread-Local Storage (TLS) alignment and ELF segment offsets. Binaries linked against GNU libc with modern toolchains frequently specify alignment boundaries that Bionic's dynamic linker rejects on startup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why did Codex work without PRoot while Antigravity needed it?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Codex's Termux package (&lt;code&gt;@mmmbuto/codex-cli-termux&lt;/code&gt;) was specially compiled and packaged to link against Termux's Bionic libc. Antigravity's official distribution is compiled against GNU glibc for standard Linux distributions, making the PRoot environment necessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does Antigravity repeatedly prompt for confirmation in Termux, and how do I fix it?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Confirmation prompts appear when commands request sandbox bypass (e.g. &lt;code&gt;BypassSandbox: true&lt;/code&gt;), use inline &lt;code&gt;python3 -c&lt;/code&gt; executions, or run external bash commands to read files. You can silence these prompts completely by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enabling &lt;code&gt;"enableTerminalSandbox": true&lt;/code&gt; and setting &lt;code&gt;"toolPermission": "proceed-in-sandbox"&lt;/code&gt; in &lt;code&gt;~/.gemini/antigravity-cli/settings.json&lt;/code&gt; (or in Settings → Agent Settings &amp;amp; Permissions → Tool Execution Policy);&lt;/li&gt;
&lt;li&gt;Instructing the agent to execute all Python code strictly inside the sandbox; and&lt;/li&gt;
&lt;li&gt;Using the native in-process file reading skill (&lt;code&gt;view_file&lt;/code&gt;) instead of terminal read commands. Native reading requires zero subprocess permissions and runs 100% silently.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How was this article published?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This post was drafted in Termux, styled according to publication guidelines, authenticated against the official WordPress.com MCP server, and published live directly via the WordPress REST API without opening a web admin dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the performance overhead of PRoot?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
PRoot uses &lt;code&gt;ptrace&lt;/code&gt; to intercept and emulate Linux system calls in userspace without requiring root. While I/O-heavy compiles can be 20–30% slower, CLI network calls, inference streaming, and code edits perform at near-native speeds on modern multi-core ARM chips.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I prevent Android from killing background tasks?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Android 12+ introduced the Phantom Process Killer, which aggressively terminates child processes that consume significant CPU or spawn background workers. Run &lt;code&gt;termux-wake-lock&lt;/code&gt; in Termux before running extended agent sessions to prevent Android from putting Termux into deep sleep.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Combining &lt;code&gt;proot-distro&lt;/code&gt; with Antigravity CLI and the WordPress.com MCP server turns an Android device into a self-contained mobile publishing workstation. With native path wrappers, &lt;code&gt;xdg-open&lt;/code&gt; bridged to &lt;code&gt;termux-open-url&lt;/code&gt;, and prompt-free native read tools, the development and publishing workflow is completely frictionless and matches native Termux tooling.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Storage Tip:&lt;/strong&gt; A minimal Ubuntu rootfs takes ~80MB compressed and ~250MB extracted. Keep your Termux internal storage above 1.5GB to account for pip/npm toolchains and model cache files.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Tested on Android 14 / Termux · Ubuntu 24.04 LTS ARM64 PRoot · Published via WordPress.com MCP&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>android</category>
      <category>ai</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
