codexprobability-axioms-continuity-nested-limits.py
probability-axioms-continuity-nested-limits.py
"""Original exact fair-coin limit curves; Python 3.14, NumPy 2.3, Matplotlib 3.10.
Run from _media; writes its own PNG basename to the current working directory.
No sampling or experimental data: points are exact model probabilities.
"""
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
def main():
n = np.arange(1, 11)
tail = 2.0 ** (-n)
success = 1 - tail
blue, orange = '#246ca6', '#c76624'
fig, axes = plt.subplots(1, 2, figsize=(9, 4.7), dpi=100, facecolor='white')
fig.subplots_adjust(left=0.09, right=0.96, bottom=0.27, top=0.72, wspace=0.30)
fig.suptitle('Finite waiting horizons and the infinite limit', fontsize=16, y=0.97)
fig.text(0.5, 0.865, r'$A_n$: head by toss $n$; $B_n=A_n^c$: first $n$ tosses all tails',
ha='center', fontsize=12)
ax = axes[0]
ax.axhline(1, color=blue, linewidth=1, linestyle='--', alpha=0.65)
ax.axhline(0, color=orange, linewidth=1, linestyle='--', alpha=0.65)
ax.scatter(n, success, color=blue, label=r'$P(A_n)=1-2^{-n}$', s=30, zorder=3)
ax.scatter(n, tail, color=orange, label=r'$P(B_n)=2^{-n}$', s=30, zorder=3)
ax.set_title('One probability scale', fontsize=12)
ax.set_ylim(-0.045, 1.045)
ax.set_ylabel('Probability')
ax.legend(loc='center right', fontsize=10, framealpha=1)
ax = axes[1]
ax.scatter(n, tail, color=orange, s=30, zorder=3)
ax.set_yscale('log', base=2)
ax.set_ylim(2**-11, 1)
ax.set_yticks([2**-1, 2**-4, 2**-7, 2**-10], ['1/2', '1/16', '1/128', '1/1024'])
ax.set_title('Tail detail (logarithmic scale)', fontsize=12)
ax.set_ylabel(r'$P(B_n)$')
ax.annotate('Ten tosses: 1/1024', xy=(10, 2**-10), xytext=(4.0, 2**-9),
fontsize=10, arrowprops={'arrowstyle': '->', 'color': '#444444'})
for ax in axes:
ax.set_xlim(0.5, 10.5)
ax.set_xticks([1, 2, 4, 6, 8, 10])
ax.set_xlabel(r'Finite number of tosses $n$')
ax.grid(alpha=0.2)
ax.spines[['top', 'right']].set_visible(False)
fig.text(0.5, 0.10, r'As $n\to\infty$: $P(\bigcup_n A_n)=1$, $P(\bigcap_n B_n)=0$ (the all-tails sequence remains).',
ha='center', fontsize=11)
fig.text(0.5, 0.04, 'Independent fair-coin model. Dots are exact probabilities at integer n, not experimental observations.',
ha='center', fontsize=10, color='#444444')
fig.savefig(Path(__file__).stem + '.png', facecolor='white', transparent=False)
plt.close(fig)
if __name__ == '__main__':
main()