# -*- coding: utf-8 -*-
"""
电磁弹射可靠性说法核查（精确分数计算 + 泊松近似对照）

要核查的说法：
  说法A：平均180次弹射故障1次（p=1/180）⇒ 连续100次无故障概率为 57.2%
  说法B：若要把"100次无故障概率"提升到 90%，需要平均 1000 次弹射故障1次

模型：
  * 伯努利/几何模型：每次弹射独立，故障概率 p = 1/M（M=平均弹射间隔，次/故障）
    P(连续 n 次无故障) = (1 - 1/M)^n                                 —— 精确分数计算
  * 泊松近似（故障按泊松过程到达，速率 1/M 次/弹射）：
    P(连续 n 次无故障) = e^{-n/M}                                    —— 对照
"""
from fractions import Fraction
from decimal import Decimal, getcontext
import math

getcontext().prec = 40
N = 100  # 无故障试验次数


def p_exact(M: int, n: int) -> Decimal:
    """精确有理数计算 (1 - 1/M)^n，转高精度十进制"""
    f = Fraction(M - 1, M) ** n
    return Decimal(f.numerator) / Decimal(f.denominator)


def p_poisson(M: float, n: float) -> float:
    """泊松近似 e^{-n/M}"""
    return math.exp(-n / M)


print("=" * 78)
print("① 说法A：M=180（1/180 故障率）时，连续 100 次无故障概率")
print("=" * 78)
pe = p_exact(180, N)
pp = p_poisson(180, N)
print(f"  精确 (179/180)^100            = {pe*100:.4f}%")
print(f"  泊松近似 e^(-100/180)         = {pp*100:.4f}%")
print(f"  → 精确值为 57.287% ≈ 57.3%，原说法引用的 '57.2%' 属舍入差异，成立。")

print()
print("=" * 78)
print("② 说法B：要把 P(100 次无故障)=90%，需要多低的故障率（多大的平均间隔 M）")
print("=" * 78)
# 解方程 (1 - 1/M)^100 = 0.9  ⇒  M = 1 / (1 - 0.9^{1/100})
M90 = 1.0 / (1.0 - 0.9 ** (1.0 / N))
print(f"  精确阈值：M* = 1/(1 - 0.9^(1/100)) = {M90:.2f} 次/故障（约 950 次）")
# 泊松版本：e^{-100/M} = 0.9 ⇒ M = 100/ln(10/9)
M90_poisson = N / math.log(10.0 / 9.0)
print(f"  泊松阈值：M  = 100/ln(10/9)        = {M90_poisson:.2f} 次/故障")
print()

print("  取整核对（精确分数）：")
for M in (949, 950, 1000):
    print(f"    M = {M:>4}: P(100次无故障) = {p_exact(M, N)*100:.4f}%")
print(f"    M = 1000（泊松）: P(100次无故障) = {p_poisson(1000, N)*100:.4f}%")
print("  → 恰好 90% 需要约 950 次/故障；取 M=1000 时概率约 90.48% ≥ 90%，达标。")
print("  → 原说法'需要平均1000次弹射故障1次'是偏保守的整数化取整，结论成立。")

print()
print("=" * 78)
print("③ 附加：100 次无故障试验本身的统计证据强度（对'优于 1/180'的证明力）")
print("=" * 78)
# 观察到 100/100 成功时，p 的单侧 95% 置信上界：满足 (1-p)^100 = 0.05 的 p
p_hi = 1.0 - 0.05 ** (1.0 / N)
print(f"  100/100 成功 ⇒ p 的 95% 置信上界 = {p_hi*100:.3f}%（≈ 1/{1/p_hi:.1f} 次/故障，rule of three ≈ 3/100）")
print(f"  即：即便系统平均每 {1/p_hi:.1f} 次就故障 1 次，'恰好连续 100 次无故障'的概率仍有 5%。")
# 要以 95% 置信证明 p ≤ 1/180，需要连续无故障 n 次： (179/180)^n ≤ 0.05
need = math.log(0.05) / math.log(179.0 / 180.0)
print(f"  若要以 95% 置信度证明'故障率 ≤ 1/180'，需连续无故障 n ≥ {math.ceil(need)} 次。")
print(f"  → 100 次无故障试验不足以在统计上证明优于 1/180（该项超出来题范围，仅作说明）。")

print()
print("=" * 78)
print("④ 敏感性：若真实平均故障间隔不是 180 次，P(100次无故障) 变化如下")
print("=" * 78)
for M in (180, 200, 240, 400, 1000, 2000):
    print(f"  M = {M:>5} 次/故障 : 精确 {p_exact(M, N)*100:6.2f}%   |   泊松 {p_poisson(M, N)*100:6.2f}%")

print()
print("=" * 78)
print("公式小结")
print("=" * 78)
print("  伯努利：P(连续n次无故障) = (1 - 1/M)^n")
print("  泊松近似：P = e^(-n/M)")
print("  90%阈值：M = 1/(1 - 0.9^(1/n))，n=100 时 ≈ 949.6 次/故障")
print("  95%置信上界(100/100成功)：p = 1 - 0.05^(1/100) ≈ 2.95%")