<?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>Multi-Class Log Loss Explained: Math, MLE &amp; Python Code</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Mon, 26 Oct 2026 04:33:21 +0000</pubDate>
      <link>https://dev.to/malcolmlow/multi-class-log-loss-explained-math-mle-python-code-3nok</link>
      <guid>https://dev.to/malcolmlow/multi-class-log-loss-explained-math-mle-python-code-3nok</guid>
      <description>&lt;p&gt;&lt;em&gt;A comprehensive technical guide to Multi-Class Logarithmic Loss (Log Loss / Categorical Cross-Entropy): why lower loss indicates superior probabilistic calibration, how Maximum Likelihood Estimation requires the negative sign, why logarithms prevent floating-point underflow on large datasets, and how asymmetric penalties punish overconfident mispredictions.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1 · The Mathematical Formula &amp;amp; Variable Definitions
&lt;/h2&gt;

&lt;p&gt;For a dataset containing &lt;code&gt;N&lt;/code&gt; samples evaluated across &lt;code&gt;C&lt;/code&gt; mutually exclusive classes, Multi-Class Logarithmic Loss is defined as:&lt;/p&gt;

&lt;p&gt;$$L = -\frac{1}{N} \sum_{i=1}^N \sum_{c=1}^C y_{i,c} \ln(p_{i,c})$$&lt;/p&gt;

&lt;p&gt;Every symbol and variable in this formulation serves a distinct mathematical role:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symbol / Variable&lt;/th&gt;
&lt;th&gt;Domain / Value&lt;/th&gt;
&lt;th&gt;Formal Definition &amp;amp; Mathematical Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;N&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Positive integer&lt;/td&gt;
&lt;td&gt;Total number of observations or samples in the evaluation dataset.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;C&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Integer $\ge 2$&lt;/td&gt;
&lt;td&gt;Total number of discrete candidate classes in the classification task.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;y_{i,c}&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{0, 1}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Binary one-hot indicator: equals 1 if observation &lt;code&gt;i&lt;/code&gt; belongs to class &lt;code&gt;c&lt;/code&gt;, and 0 otherwise.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;p_{i,c}&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(0.0, 1.0)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Model's predicted probability that observation &lt;code&gt;i&lt;/code&gt; belongs to class &lt;code&gt;c&lt;/code&gt;, where $\sum_c p_{i,c} = 1.0$.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;\ln&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mathematical operator&lt;/td&gt;
&lt;td&gt;The natural logarithm (base $e \approx 2.71828$). In information theory, base 2 is often used, measuring loss in bits.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  2 · Why is Lower Better?
&lt;/h2&gt;

&lt;p&gt;In statistical learning, loss functions quantify the divergence between prediction and reality. Multi-class log loss is strictly &lt;strong&gt;lower is better&lt;/strong&gt; due to two fundamental conventions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Target Value (Zero Loss):&lt;/strong&gt; A theoretically perfect model assigns a probability of exactly &lt;code&gt;1.0&lt;/code&gt; to the true class and &lt;code&gt;0.0&lt;/code&gt; to all other classes. Because $\ln(1.0) = 0$, the resulting log loss for a perfect prediction is exactly &lt;code&gt;0.0&lt;/code&gt;. As predictions become less certain or more erroneous, the loss value grows toward positive infinity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimization Convention in Optimization:&lt;/strong&gt; Machine learning algorithms (such as stochastic gradient descent, Adam, or tree splitting criteria) are designed to minimize an objective cost function. Formulating log loss so that 0 represents perfection allows standard gradient descent algorithms to iteratively step downhill toward minimum error.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3 · Why the Negative Sign? From MLE to Gradient Descent
&lt;/h2&gt;

&lt;p&gt;The negative sign at the front of the formula is required by the mathematical relationship between probabilities and logarithms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Probabilities are Fractions Less Than or Equal to 1:&lt;/strong&gt; Valid probabilities &lt;code&gt;p&lt;/code&gt; satisfy $0 &amp;lt; p \le 1$. The natural logarithm of any fraction between 0 and 1 is strictly negative (for example, $\ln(0.5) \approx -0.693$, and $\ln(0.1) \approx -2.302$).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maximum Likelihood Estimation (MLE):&lt;/strong&gt; In classical statistics, generative and discriminative models are trained by maximizing the likelihood of observing the training data: $\max \prod_i P(y_i \mid x_i)$. Taking the natural logarithm converts this into maximizing the log-likelihood: $\max \sum_i \ln(P(y_i \mid x_i))$.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flipping Maximization into Minimization:&lt;/strong&gt; Because log-likelihood is negative, multiplying by &lt;code&gt;-1&lt;/code&gt; flips the sign from negative to positive. Maximizing the positive likelihood of the data is mathematically identical to minimizing the Negative Log-Likelihood (NLL). The negative sign transforms statistical MLE into a convex loss surface that gradient descent can minimize.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4 · Why the Need for a Logarithm?
&lt;/h2&gt;

&lt;p&gt;The logarithm is not an arbitrary mathematical choice; it solves two practical challenges in computation and model calibration:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Converting Products into Sums (Preventing Numerical Underflow)
&lt;/h3&gt;

&lt;p&gt;Assuming independent data points, the joint probability of an entire dataset is the product of individual probabilities:&lt;/p&gt;

&lt;p&gt;$$P_{\text{joint}} = P_1 \times P_2 \times \dots \times P_N$$&lt;/p&gt;

&lt;p&gt;When multiplying thousands of floating-point numbers smaller than 1.0 (such as $0.8^{1000}$), the result approaches zero so quickly that standard 64-bit IEEE floating-point numbers experience arithmetic underflow (the computer rounds the value to absolute zero).&lt;/p&gt;

&lt;p&gt;Applying the logarithm exploits the logarithmic identity $\ln(a \cdot b) = \ln(a) + \ln(b)$. This transforms product chains into numerically stable sums of negative numbers that CPUs can accumulate without precision loss.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Penalty Amplification for Overconfident Mistakes
&lt;/h3&gt;

&lt;p&gt;The logarithmic curve acts as an asymmetric penalty amplifier. Because $\lim_{p \to 0} \ln(p) = -\infty$, the loss penalty escalates steeply as the predicted probability for the true class approaches zero:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Predicted Probability for True Class &lt;code&gt;p_{true}&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;Instance Log Loss Penalty &lt;code&gt;-\ln(p_{true})&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;Practical Model Diagnosis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.99&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.01005&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Near-perfect prediction with high confidence.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.80&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.22314&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Accurate prediction with moderate certainty.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.50&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.69315&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uncertain coin-flip assignment.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.10&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2.30259&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Significant error: model favored alternative classes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.01&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4.60517&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Severe mistake: model was 99% confident in wrong classes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.0001&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;9.21034&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Catastrophic penalty: one such prediction can wreck a batch average.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5 · Worked Numerical Example: 3-Class Animal Classifier
&lt;/h2&gt;

&lt;p&gt;Consider a 3-class image classification model evaluating an image containing a &lt;strong&gt;Cat&lt;/strong&gt; across three possible categories: &lt;code&gt;[Cat, Dog, Bird]&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;True Ground Truth Label:&lt;/strong&gt; &lt;code&gt;y = [1, 0, 0]&lt;/code&gt; (Class 0 is Cat).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Baseline Model Prediction:&lt;/strong&gt; &lt;code&gt;p = [0.80, 0.10, 0.10]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Applying the multi-class formula for this single sample:&lt;/p&gt;

&lt;p&gt;$$\text{Loss} = - [ 1 \cdot \ln(0.80) + 0 \cdot \ln(0.10) + 0 \cdot \ln(0.10) ]$$&lt;br&gt;
$$\text{Loss} = - [ -0.22314 + 0 + 0 ] = \mathbf{0.22314}$$&lt;/p&gt;

&lt;p&gt;Now consider two alternative prediction scenarios on the exact same sample:&lt;/p&gt;
&lt;h3&gt;
  
  
  Scenario A: High-Confidence Correct Prediction
&lt;/h3&gt;

&lt;p&gt;The model predicts &lt;code&gt;P(Cat) = 0.95&lt;/code&gt;, &lt;code&gt;P(Dog) = 0.03&lt;/code&gt;, &lt;code&gt;P(Bird) = 0.02&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;$$\text{Loss} = -\ln(0.95) \approx \mathbf{0.05129} \quad (\text{Lower is better})$$&lt;/p&gt;
&lt;h3&gt;
  
  
  Scenario B: Confident Mistake (Misclassified as Dog)
&lt;/h3&gt;

&lt;p&gt;The model erroneously predicts that the animal is a Dog with 90% confidence, leaving only &lt;code&gt;P(Cat) = 0.05&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;$$\text{Loss} = -\ln(0.05) \approx \mathbf{2.99573} \quad (\text{Over 13x higher penalty than baseline})$$&lt;/p&gt;

&lt;p&gt;Because the logarithm curves sharply toward infinity near zero, a single confident misprediction in Scenario B produces a penalty larger than twenty accurate predictions combined.&lt;/p&gt;


&lt;h2&gt;
  
  
  6 · Robust Python Implementation (NumPy &amp;amp; PyTorch)
&lt;/h2&gt;

&lt;p&gt;In software engineering, implementing &lt;code&gt;-np.log(p)&lt;/code&gt; directly is dangerous: if the model outputs a probability of exactly &lt;code&gt;0.0&lt;/code&gt;, &lt;code&gt;np.log(0.0)&lt;/code&gt; produces &lt;code&gt;-inf&lt;/code&gt;, poisoning the entire dataset score with &lt;code&gt;NaN&lt;/code&gt;. To prevent this, standard implementations clip probabilities by an epsilon threshold (typically &lt;code&gt;1e-15&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;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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;multiclass_log_loss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_pred&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1e-15&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Clip probabilities to [eps, 1 - eps]
&lt;/span&gt;    &lt;span class="n"&gt;y_pred_clipped&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;clip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_pred&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;eps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Renormalize rows so probabilities sum strictly to 1.0
&lt;/span&gt;    &lt;span class="n"&gt;y_pred_clipped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y_pred_clipped&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;y_pred_clipped&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keepdims&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="c1"&gt;# Compute cross-entropy across all elements, normalized by sample count N
&lt;/span&gt;    &lt;span class="n"&gt;loss&lt;/span&gt; &lt;span class="o"&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;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_true&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_pred_clipped&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;y_true&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&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="k"&gt;return&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;loss&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Verification with sample data
&lt;/span&gt;&lt;span class="n"&gt;y_true&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="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="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;y_pred&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="mf"&gt;0.80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.05&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;Log Loss: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;multiclass_log_loss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_pred&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;f&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;# Output: 0.16425
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PyTorch Equivalent
&lt;/h3&gt;

&lt;p&gt;In deep learning frameworks like PyTorch, &lt;code&gt;nn.CrossEntropyLoss&lt;/code&gt; combines &lt;code&gt;LogSoftmax&lt;/code&gt; and &lt;code&gt;NLLLoss&lt;/code&gt; into a single numerically stable fused kernel, operating directly on unnormalized model logits:&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;torch&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.nn&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;

&lt;span class="c1"&gt;# Raw unnormalized model logits for 2 samples across 3 classes
&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;],&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="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;

&lt;span class="c1"&gt;# Ground truth class indices (Class 0, Class 1)
&lt;/span&gt;&lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&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;criterion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CrossEntropyLoss&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;criterion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&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;PyTorch Loss: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;f&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;h2&gt;
  
  
  7 · Practical Takeaways for Machine Learning Competitions
&lt;/h2&gt;

&lt;p&gt;When competing on Kaggle or deploying probability models in production (such as our ongoing investigation in &lt;a href="https://malcolmlow.com/2026/10/25/pocket-data-science-9-kaggle-llm-classification-non-ml-baselines-android-termux/" rel="noopener noreferrer"&gt;Pocket Data Science IX on Chatbot Arena LLM Evaluation&lt;/a&gt;), log loss demands distinct strategic behaviors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Never Predict Absolute Certainty:&lt;/strong&gt; Unless a physical law guarantees an outcome, never predict &lt;code&gt;1.0&lt;/code&gt; or &lt;code&gt;0.0&lt;/code&gt;. If an outlier or annotation ambiguity reverses the label, a single zero probability will result in infinite loss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prior-Based Initialization:&lt;/strong&gt; Initializing model biases or baseline logits to the natural logarithm of training class frequencies $\ln(p_c)$ guarantees optimal default calibration, preventing severe penalties on ambiguous queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temperature &amp;amp; Platt Scaling:&lt;/strong&gt; When ensembling deep learning models or tree-based boosters, apply post-processing probability calibration (such as temperature scaling or isotonic regression) to prevent overconfident softmax peaks.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>machinelearning</category>
      <category>python</category>
      <category>mathematics</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Po-Shen Loh Quadratic Method: Solve Equations via Symmetry</title>
      <dc:creator>Malcolm Low</dc:creator>
      <pubDate>Sun, 11 Oct 2026 07:49:11 +0000</pubDate>
      <link>https://dev.to/malcolmlow/po-shen-loh-quadratic-method-solve-equations-via-symmetry-3njp</link>
      <guid>https://dev.to/malcolmlow/po-shen-loh-quadratic-method-solve-equations-via-symmetry-3njp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://malcolmlow.com/2019/12/16/po-shen-loh-a-different-way-to-solve-quadratic-equations/" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt; as part of the Foundational Mathematics &amp;amp; Algorithms series.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For four millennia—spanning Babylonian clay tablets, Renaissance cryptanalysts, and modern classroom algebra—solving quadratic equations has been synonymous with two unappealing extremes: &lt;strong&gt;brute-force factor guessing&lt;/strong&gt; or &lt;strong&gt;blind formula memorization&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;In December 2019, Professor &lt;strong&gt;Po-Shen Loh&lt;/strong&gt; of Carnegie Mellon University introduced a method that bypasses both. By decomposing the monic quadratic into its parabolic axis of symmetry and computing an offset distance via Vieta's relations, any quadratic equation—whether its roots are integer, irrational, or complex—can be solved intuitively with simple mental arithmetic.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The 4,000-Year-Old Algebra Trap: Factoring Guesswork vs. Formula Memorization
&lt;/h2&gt;

&lt;p&gt;Traditional secondary school mathematics approaches quadratic equations &lt;code&gt;ax^2 + bx + c = 0&lt;/code&gt; through two standard techniques, each suffering from pedagogical and practical flaws:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Guess-and-Check Factoring:&lt;/strong&gt; Students search by mental trial-and-error for two numbers that multiply to &lt;code&gt;c&lt;/code&gt; and add to &lt;code&gt;b&lt;/code&gt;. When coefficients are large, negative, or fractional, this devolves into frustrating combinatorial guessing. When roots are irrational or complex, factoring fails completely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blind Formula Memorization:&lt;/strong&gt; When factoring fails, students recite the quadratic formula:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x = (-b ± √(b^2 - 4ac)) / (2a)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While algebraically valid, the classical formula functions as an opaque black box. Students plug numbers mechanically into nested signs, radical bars, and denominators. A single misplaced negative sign inside &lt;code&gt;b^2 - 4ac&lt;/code&gt; or forgotten &lt;code&gt;2a&lt;/code&gt; in the denominator leads to silent arithmetic errors.&lt;/p&gt;

&lt;p&gt;In December 2019, Professor &lt;strong&gt;Po-Shen Loh&lt;/strong&gt;—a mathematics professor at Carnegie Mellon University and national coach of the USA International Mathematical Olympiad (IMO) team—published a paper showing that this dichotomy is unnecessary. Rather than discovering new mathematics, he combined two centuries-old mathematical principles into an algorithm that makes root-finding intuitive and computationally robust.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Who Was Vieta? The Royal Cryptanalyst Behind the Root Formulas
&lt;/h2&gt;

&lt;p&gt;To understand how the method works, we turn to the Renaissance thinker who first unlocked the relationships between polynomial roots and their coefficients: &lt;strong&gt;François Viète&lt;/strong&gt; (latinized as &lt;strong&gt;Franciscus Vieta&lt;/strong&gt;, 1540–1603).&lt;/p&gt;

&lt;p&gt;Viète was a distinguished French jurist, privy councillor to King Henry III and King Henry IV of France, and a master cryptanalyst. During the French Wars of Religion, King Philip II of Spain utilized a cipher with over 500 characters, believing it unbreakable. Viète cracked the Spanish royal code, allowing France to intercept Spain's military strategies for over two years—to the extent that Philip II complained to the Pope that the French were using black magic.&lt;/p&gt;

&lt;p&gt;In mathematics, Viète earned immortality as the &lt;strong&gt;"Father of Modern Algebraic Notation"&lt;/strong&gt; by introducing the systematic use of letters to represent both knowns and unknowns. In his 1591 treatise &lt;em&gt;In artem analyticem isagoge&lt;/em&gt;, he discovered the universal relations that bear his name: &lt;strong&gt;Vieta's Formulas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For a monic quadratic equation where the leading coefficient is normalized to &lt;code&gt;1&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(x - r_1)(x - r_2) = x^2 - (r_1 + r_2)x + r_1 * r_2 = 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Equating this expansion to &lt;code&gt;x^2 + Bx + C = 0&lt;/code&gt; reveals two exact invariant equations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sum of roots:&lt;/strong&gt; &lt;code&gt;r_1 + r_2 = -B&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product of roots:&lt;/strong&gt; &lt;code&gt;r_1 * r_2 = C&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Vieta's Core Principle:&lt;/strong&gt; You never need to calculate individual roots beforehand to know their exact sum and product. They are directly encoded into the polynomial's linear and constant terms.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. The Core Mathematical Breakthrough: Parabolic Symmetry &amp;amp; Root Offsets
&lt;/h2&gt;

&lt;p&gt;Every standard quadratic equation &lt;code&gt;x^2 + Bx + C = 0&lt;/code&gt; graphs as a vertical parabola &lt;code&gt;y = x^2 + Bx + C&lt;/code&gt;. A parabola possesses bilateral symmetry across its vertical axis of symmetry passing through its vertex.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Axis of Symmetry (Midpoint): m = -B / 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because Vieta's formula proves that the sum of the two roots is &lt;code&gt;-B&lt;/code&gt;, their arithmetic mean (midpoint) must be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Midpoint m = (r_1 + r_2) / 2 = -B / 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since the roots are symmetrically spaced around the midpoint &lt;code&gt;m&lt;/code&gt;, we can represent them as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;r_1 = m - u = -B/2 - u
r_2 = m + u = -B/2 + u
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where &lt;code&gt;u&lt;/code&gt; is the horizontal offset distance from the axis of symmetry to each root.&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%2Fl6ev7g8k063sn5oa0lfk.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%2Fl6ev7g8k063sn5oa0lfk.png" alt="Geometric symmetry of the quadratic curve y = x^2 - 8x + 12" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figure 1:&lt;/strong&gt; Geometric symmetry of the quadratic curve &lt;code&gt;y = x^2 - 8x + 12&lt;/code&gt;. The axis of symmetry sits at &lt;code&gt;m = -(-8)/2 = 4&lt;/code&gt;. The roots &lt;code&gt;x = 2&lt;/code&gt; and &lt;code&gt;x = 6&lt;/code&gt; lie symmetrically at &lt;code&gt;4 - 2&lt;/code&gt; and &lt;code&gt;4 + 2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now comes the breakthrough: Vieta's second relation tells us that the product of the two roots equals &lt;code&gt;C&lt;/code&gt;. Substituting our symmetric expressions yields a difference of squares:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(m - u)(m + u) = C
m^2 - u^2 = C
u^2 = m^2 - C
u = √(m^2 - C)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Symmetry Solution:&lt;/strong&gt; Once we compute &lt;code&gt;u&lt;/code&gt;, the roots are immediately &lt;code&gt;m - u&lt;/code&gt; and &lt;code&gt;m + u&lt;/code&gt;. No quadratic formula memorization, no cross-multiplication, and no trial-and-error guessing required.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. The 3-Step Po-Shen Loh Algorithm
&lt;/h2&gt;

&lt;p&gt;Whenever you solve a quadratic equation, execute these three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Normalize to Monic Form:&lt;/strong&gt; If the equation has a leading coefficient &lt;code&gt;a != 1&lt;/code&gt;, divide the entire equation by &lt;code&gt;a&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   x^2 + Bx + C = 0,   where B = b/a, C = c/a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compute the Midpoint:&lt;/strong&gt; Calculate &lt;code&gt;m = -B / 2&lt;/code&gt;. The roots are &lt;code&gt;m - u&lt;/code&gt; and &lt;code&gt;m + u&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solve for Offset &lt;code&gt;u&lt;/code&gt;:&lt;/strong&gt; Set &lt;code&gt;m^2 - u^2 = C&lt;/code&gt;, which gives:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   u^2 = m^2 - C  ==&amp;gt;  u = √(m^2 - C)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The roots are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   x = m ± u
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why Sign Errors Vanish:&lt;/strong&gt; In the traditional formula, negative signs interact inside &lt;code&gt;b^2 - 4ac&lt;/code&gt; and across division by &lt;code&gt;2a&lt;/code&gt;. In Po-Shen Loh's method, the midpoint &lt;code&gt;m = -B/2&lt;/code&gt; is evaluated independently, and &lt;code&gt;m^2&lt;/code&gt; is always positive. You only perform a clean subtraction &lt;code&gt;m^2 - C&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5. The Three Geometric Realities of the Offset &lt;code&gt;u^2&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;In traditional algebra, students memorize the discriminant &lt;code&gt;Δ = b^2 - 4ac&lt;/code&gt; to determine root regimes. In Po-Shen Loh's method, the value of &lt;code&gt;u^2 = m^2 - C&lt;/code&gt; directly reveals the geometric relationship between the parabola and the x-axis:&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 1: Positive Offset (&lt;code&gt;u^2 &amp;gt; 0&lt;/code&gt;) — Two Distinct Real Roots
&lt;/h3&gt;

&lt;p&gt;When &lt;code&gt;m^2 &amp;gt; C&lt;/code&gt;, &lt;code&gt;u^2&lt;/code&gt; is positive. Geometrically, the vertex of the parabola lies below the x-axis (&lt;code&gt;vertex_y &amp;lt; 0&lt;/code&gt;). The parabola cuts the x-axis at two distinct real points: &lt;code&gt;m - u&lt;/code&gt; and &lt;code&gt;m + u&lt;/code&gt;.&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%2F5fidbkrox7yk60191azx.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%2F5fidbkrox7yk60191azx.png" alt="Case 1: Positive offset showing two distinct real roots" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; Case 1 (&lt;code&gt;u^2 &amp;gt; 0&lt;/code&gt;). The parabola &lt;code&gt;y = x^2 - 4x + 3&lt;/code&gt; dips below the x-axis (&lt;code&gt;m = 2&lt;/code&gt;, &lt;code&gt;u^2 = 1&lt;/code&gt;, &lt;code&gt;u = 1&lt;/code&gt;), yielding distinct real roots at &lt;code&gt;x = 1&lt;/code&gt; and &lt;code&gt;x = 3&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 2: Zero Offset (&lt;code&gt;u^2 = 0&lt;/code&gt;) — One Repeated Real Root
&lt;/h3&gt;

&lt;p&gt;When &lt;code&gt;m^2 = C&lt;/code&gt;, &lt;code&gt;u^2 = 0&lt;/code&gt; so &lt;code&gt;u = 0&lt;/code&gt;. The vertex of the parabola touches the x-axis tangent at &lt;code&gt;y = 0&lt;/code&gt;. Both roots collapse to the midpoint &lt;code&gt;x = m&lt;/code&gt;.&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%2Fpe43qj5ofhf0leq9ve5w.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%2Fpe43qj5ofhf0leq9ve5w.png" alt="Case 2: Zero offset showing one repeated real root" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; Case 2 (&lt;code&gt;u^2 = 0&lt;/code&gt;). The vertex of &lt;code&gt;y = x^2 - 4x + 4&lt;/code&gt; is tangent to the x-axis at &lt;code&gt;(2, 0)&lt;/code&gt;. The root is a single repeated value &lt;code&gt;x = 2&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 3: Negative Offset (&lt;code&gt;u^2 &amp;lt; 0&lt;/code&gt;) — Two Complex Conjugate Roots
&lt;/h3&gt;

&lt;p&gt;When &lt;code&gt;m^2 &amp;lt; C&lt;/code&gt;, &lt;code&gt;u^2&lt;/code&gt; is negative. The vertex floats entirely above the x-axis (&lt;code&gt;vertex_y &amp;gt; 0&lt;/code&gt;), never intersecting it in the real plane. The square root produces an imaginary offset &lt;code&gt;u = i * √(|u^2|)&lt;/code&gt;, yielding complex conjugate roots &lt;code&gt;m ± i * √(|u^2|)&lt;/code&gt;.&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%2Fxfaq13c98b493xvsk7vv.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%2Fxfaq13c98b493xvsk7vv.png" alt="Case 3: Negative offset showing two complex conjugate roots" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figure 4:&lt;/strong&gt; Case 3 (&lt;code&gt;u^2 &amp;lt; 0&lt;/code&gt;). The parabola &lt;code&gt;y = x^2 - 4x + 7&lt;/code&gt; floats above the x-axis (&lt;code&gt;m = 2&lt;/code&gt;, &lt;code&gt;u^2 = -3&lt;/code&gt;, &lt;code&gt;u = i√3&lt;/code&gt;). The roots are complex conjugates &lt;code&gt;2 - i√3&lt;/code&gt; and &lt;code&gt;2 + i√3&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Step-by-Step Worked Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Standard Integer Roots (Eliminating Guesswork)
&lt;/h3&gt;

&lt;p&gt;Solve: &lt;code&gt;x^2 - 8x + 12 = 0&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Coefficients:&lt;/strong&gt; Monic equation with &lt;code&gt;B = -8&lt;/code&gt; and &lt;code&gt;C = 12&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Midpoint:&lt;/strong&gt; &lt;code&gt;m = -(-8) / 2 = 4&lt;/code&gt;. The roots are &lt;code&gt;4 - u&lt;/code&gt; and &lt;code&gt;4 + u&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offset:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   4^2 - u^2 = 12
   16 - u^2 = 12
   u^2 = 4  ==&amp;gt;  u = 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Roots:&lt;/strong&gt; &lt;code&gt;x = 4 - 2 = 2&lt;/code&gt; and &lt;code&gt;x = 4 + 2 = 6&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 2: Irrational Roots (Where Factoring Fails)
&lt;/h3&gt;

&lt;p&gt;Solve: &lt;code&gt;x^2 - 4x - 1 = 0&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Coefficients:&lt;/strong&gt; Monic with &lt;code&gt;B = -4&lt;/code&gt; and &lt;code&gt;C = -1&lt;/code&gt;. Factoring fails as no rational factors multiply to &lt;code&gt;-1&lt;/code&gt; and add to &lt;code&gt;-4&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Midpoint:&lt;/strong&gt; &lt;code&gt;m = -(-4) / 2 = 2&lt;/code&gt;. The roots are &lt;code&gt;2 - u&lt;/code&gt; and &lt;code&gt;2 + u&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offset:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   2^2 - u^2 = -1
   4 - u^2 = -1
   u^2 = 5  ==&amp;gt;  u = √5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Roots:&lt;/strong&gt; &lt;code&gt;x = 2 - √5&lt;/code&gt; and &lt;code&gt;x = 2 + √5&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 3: Complex / Imaginary Roots
&lt;/h3&gt;

&lt;p&gt;Solve: &lt;code&gt;x^2 - 6x + 25 = 0&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Coefficients:&lt;/strong&gt; Monic with &lt;code&gt;B = -6&lt;/code&gt; and &lt;code&gt;C = 25&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Midpoint:&lt;/strong&gt; &lt;code&gt;m = -(-6) / 2 = 3&lt;/code&gt;. Roots are &lt;code&gt;3 - u&lt;/code&gt; and &lt;code&gt;3 + u&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offset:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   3^2 - u^2 = 25
   9 - u^2 = 25
   u^2 = -16  ==&amp;gt;  u = √(-16) = 4i
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Roots:&lt;/strong&gt; &lt;code&gt;x = 3 - 4i&lt;/code&gt; and &lt;code&gt;x = 3 + 4i&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 4: Leading Coefficient &lt;code&gt;a != 1&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Solve: &lt;code&gt;2x^2 + 5x - 3 = 0&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Normalize to Monic:&lt;/strong&gt; Divide by &lt;code&gt;2&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   x^2 + (5/2)x - 3/2 = 0   ==&amp;gt;   B = 5/2, C = -3/2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Midpoint:&lt;/strong&gt; &lt;code&gt;m = -(5/2) / 2 = -5/4&lt;/code&gt;. Roots are &lt;code&gt;-5/4 - u&lt;/code&gt; and &lt;code&gt;-5/4 + u&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offset:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   (-5/4)^2 - u^2 = -3/2
   25/16 - u^2 = -24/16
   u^2 = 49/16  ==&amp;gt;  u = 7/4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Roots:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x = -5/4 - 7/4 = -12/4 = -3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x = -5/4 + 7/4 = 2/4 = 1/2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Method Comparison: Traditional Formula vs. Po-Shen Loh
&lt;/h2&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;Traditional Quadratic Formula&lt;/th&gt;
&lt;th&gt;Po-Shen Loh Method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cognitive Load&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High memorization (&lt;code&gt;-b ± √(b^2 - 4ac) / 2a&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Low (midpoint &lt;code&gt;m = -B/2&lt;/code&gt; + difference of squares)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Arithmetic Traps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nested negative signs inside radical &amp;amp; denominator&lt;/td&gt;
&lt;td&gt;Separated midpoint; &lt;code&gt;m^2&lt;/code&gt; is guaranteed non-negative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Geometric Insight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Abstract algebraic manipulation&lt;/td&gt;
&lt;td&gt;Directly leverages parabolic axis of symmetry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complex Numbers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Negative discriminant requires radical refactoring&lt;/td&gt;
&lt;td&gt;Negative &lt;code&gt;u^2&lt;/code&gt; directly yields imaginary offset `i * √(&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  8. Numerical Computing &amp;amp; Floating-Point Stability Implications
&lt;/h2&gt;

&lt;p&gt;Beyond secondary education, Po-Shen Loh's formulation holds important computational benefits for numerical programmers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Catastrophic Cancellation Avoidance:&lt;/strong&gt; In standard IEEE 754 floating-point arithmetic, evaluating {% raw %}&lt;code&gt;-b + √(b^2 - 4ac)&lt;/code&gt; when &lt;code&gt;b &amp;gt; 0&lt;/code&gt; and &lt;code&gt;4ac &amp;lt;&amp;lt; b^2&lt;/code&gt; results in catastrophic subtraction of nearly equal numbers, wiping out significant precision digits. Numerical libraries (such as NumPy, LAPACK, and Boost) compute the vertex midpoint &lt;code&gt;m&lt;/code&gt; and root offset independently, switching formulas based on the sign of &lt;code&gt;b&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ray-Sphere Intersections in Computer Graphics:&lt;/strong&gt; Ray tracers compute ray-sphere collisions via quadratic equations. Expressing the equation via midpoint and offset distance computes the closest approach distance along the ray (&lt;code&gt;m&lt;/code&gt;) before evaluating whether the ray pierces the sphere radius (&lt;code&gt;u&lt;/code&gt;), allowing early-out branching without computing square roots.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. Python Implementation &amp;amp; Verifiable Test Suite
&lt;/h2&gt;

&lt;p&gt;Below is a complete, self-contained Python 3 implementation that unifies all three root regimes with robust string formatting:&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;math&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;solve_po_shen_loh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&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="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Solves ax^2 + bx + c = 0 using the Po-Shen Loh method.
    Returns (r1, r2, regime)
    &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;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&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;Leading coefficient &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="s"&gt; cannot be zero.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Step 1: Normalize to monic form x^2 + Bx + C = 0
&lt;/span&gt;    &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
    &lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;

    &lt;span class="c1"&gt;# Step 2: Compute midpoint m = -B / 2
&lt;/span&gt;    &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;

    &lt;span class="c1"&gt;# Step 3: Compute offset squared u^2 = m^2 - C
&lt;/span&gt;    &lt;span class="n"&gt;u_squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m&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;C&lt;/span&gt;

    &lt;span class="k"&gt;if&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;u_squared&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;1e-12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Case 2: One repeated real root (u = 0)
&lt;/span&gt;        &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Repeated Real Root&lt;/span&gt;&lt;span class="sh"&gt;"&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;u_squared&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="c1"&gt;# Case 1: Two distinct real roots
&lt;/span&gt;        &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;math&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="n"&gt;u_squared&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Two Distinct Real Roots&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="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Case 3: Two complex conjugate roots
&lt;/span&gt;        &lt;span class="n"&gt;u_imag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;math&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="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u_squared&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;complex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u_imag&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;complex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u_imag&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Two Complex Conjugate Roots&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;format_root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&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;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;complex&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&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;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;real&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imag&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&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;j&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&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;r&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Run verification test cases
&lt;/span&gt;&lt;span class="n"&gt;test_cases&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="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;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&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^2 - 8x + 12 = 0&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="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;4&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x^2 - 4x - 1 = 0&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="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;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&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^2 - 6x + 25 = 0&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;5&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="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2x^2 + 5x - 3 = 0&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="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;4&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x^2 - 4x + 4 = 0&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="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;{:20} | {:15} | {:15} | {}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Equation&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;Root 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;Root 2&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;Regime&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;75&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;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&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="n"&gt;label&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;test_cases&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;solve_po_shen_loh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&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;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;{:20} | {:15} | {:15} | {}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&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="nf"&gt;format_root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;format_root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;regime&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verifiable Terminal Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Equation             | Root 1          | Root 2          | Regime
---------------------------------------------------------------------------
x^2 - 8x + 12 = 0    | 2.0000          | 6.0000          | Two Distinct Real Roots
x^2 - 4x - 1 = 0     | -0.2361         | 4.2361          | Two Distinct Real Roots
x^2 - 6x + 25 = 0    | 3.0-4.0j        | 3.0+4.0j        | Two Complex Conjugate Roots
2x^2 + 5x - 3 = 0    | -3.0000         | 0.5000          | Two Distinct Real Roots
x^2 - 4x + 4 = 0     | 2.0000          | 2.0000          | Repeated Real Root
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Symmetry Replaces Factoring:&lt;/strong&gt; Instead of guessing factor pairs of &lt;code&gt;C&lt;/code&gt; that sum to &lt;code&gt;-B&lt;/code&gt;, we start at the midpoint &lt;code&gt;m = -B/2&lt;/code&gt; and find the distance &lt;code&gt;u&lt;/code&gt; to both roots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vieta's Formulas Form the Backbone:&lt;/strong&gt; The method relies directly on 16th-century relations: &lt;code&gt;r_1 + r_2 = -B&lt;/code&gt; and &lt;code&gt;r_1 * r_2 = C&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All Three Root Regimes Unified:&lt;/strong&gt; Whether roots are distinct real (&lt;code&gt;u^2 &amp;gt; 0&lt;/code&gt;), repeated real (&lt;code&gt;u^2 = 0&lt;/code&gt;), or complex conjugates (&lt;code&gt;u^2 &amp;lt; 0&lt;/code&gt;), the procedure is identical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign Errors Eliminated:&lt;/strong&gt; Isolating the midpoint calculation &lt;code&gt;m = -B/2&lt;/code&gt; prevents negative sign slip-ups inside radical fractions.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;strong&gt;Does the Po-Shen Loh method replace the quadratic formula?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Mathematically, the Po-Shen Loh method is equivalent to the quadratic formula—in fact, carrying out the method with general variables &lt;code&gt;a, b, c&lt;/code&gt; produces the classical formula. Its advantage lies in mental calculation, intuition, and reducing algebraic manipulation errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who was Vieta and what is his connection to this method?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
François Viète (1540–1603), known as Vieta, was a 16th-century French royal cryptanalyst and mathematician who established that the sum of the roots of a monic quadratic equals &lt;code&gt;-B&lt;/code&gt; and their product equals &lt;code&gt;C&lt;/code&gt;. The Po-Shen Loh method combines Vieta's formulas with parabolic symmetry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why was this method only popularized in 2019?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
While Babylonian mathematicians utilized related geometric area arguments and Vieta published root relations in 1591, textbook curricula historically converged on memorizing the completed-square formula. Professor Po-Shen Loh synthesized these steps into an accessible algorithmic framework for students and educators in December 2019.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does the method handle complex or imaginary roots?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
When &lt;code&gt;m^2 &amp;lt; C&lt;/code&gt;, the offset squared &lt;code&gt;u^2&lt;/code&gt; is negative. Taking the square root directly yields an imaginary offset &lt;code&gt;u = i * √(|u^2|)&lt;/code&gt;, giving the complex conjugate root pair &lt;code&gt;m ± i * √(|u^2|)&lt;/code&gt; without changing the workflow.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Malcolm Low&lt;/strong&gt; is an Associate Professor at the Singapore Institute of Technology, writing on mathematics, algorithms, and applied computing.&lt;br&gt;&lt;br&gt;
Website: &lt;a href="https://malcolmlow.com" rel="noopener noreferrer"&gt;malcolmlow.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>math</category>
      <category>python</category>
      <category>algorithms</category>
      <category>computerscience</category>
    </item>
    <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>
  </channel>
</rss>
