# Code adapted from the Bitcoin whitepaper at https://bitcoin.org/bitcoin.pdf
from math import exp, pow
def AttackerSuccessProbability(q: float, z: int):
p = 1.0 - q
poisson_lambda = z * (q / p)
sum = 1.0
for k in range(z+1):
poisson = exp(-poisson_lambda)
for i in range(1, k+1):
poisson = poisson * poisson_lambda / i
sum = sum - poisson * (1 - pow(q / p, z - k))
return sum
q = 0.1
print("q =", q)
for z in range(10):
print("z =", z, "\t Prob =", format(AttackerSuccessProbability(q, z),"1.7f"))
print("")
q = 0.3
print("q =", q)
for z in range(0, 55, 5):
print("z =", z, "\t Prob =", format(AttackerSuccessProbability(q, z),"1.7f"))
q = 0.1
z = 0 Prob = 1.0000000
z = 1 Prob = 0.2045873
z = 2 Prob = 0.0509779
z = 3 Prob = 0.0131722
z = 4 Prob = 0.0034552
z = 5 Prob = 0.0009137
z = 6 Prob = 0.0002428
z = 7 Prob = 0.0000647
z = 8 Prob = 0.0000173
z = 9 Prob = 0.0000046
q = 0.3
z = 0 Prob = 1.0000000
z = 5 Prob = 0.1773523
z = 10 Prob = 0.0416605
z = 15 Prob = 0.0101008
z = 20 Prob = 0.0024804
z = 25 Prob = 0.0006132
z = 30 Prob = 0.0001522
z = 35 Prob = 0.0000379
z = 40 Prob = 0.0000095
z = 45 Prob = 0.0000024
z = 50 Prob = 0.0000006