Probably of at least one occurrence for very small probabilities I know how to calculate the odds of at least one event, but I can't do it for very small probabilities and I was wondering if there was a formula for approximating this or maybe you can point me to an online tool that can handle these numbers.
I'm trying to calculate chance of hash collision over many attempts.
Let p_bad = 1.75E-69, chance of hash collision
Let p_good = 1-p_bad, chance of no collision for 1 attempt
Let p_good_all = p_good^20000, chance of no collision for 20k attempts
Let p_at_least_one_bad = 1-g_good_all, chance of at least 1 collision among 20k attempts.

I believe that is the right probability logic, but I have no way of calculating the result with these numbers.
Is there another reformulation that makes this problem tractable or is there a tool that lets me calculate this?
 A: For small $p$, $1-(1-p)^n \approx np$.  
You can see this from the Binomial Theorem:
$$1-(1-p)^n = 1 - \left(1 -np + \binom{n}{2}p^2 - \dots \pm p^n \right)$$
If $p$ is small then we can neglect all the terms involving $p^2$ or higher, with the result
$$1-(1-p)^n \approx 1 - (1 - np) = np$$
In your case, you have $p = 1.75 \times 10^{-69}$ and $n = 20,000$.
Situations like this are quite common in numerical calculation.  In this case in particular, if you try to compute $1-p$ you end up with $1$ due to the limits of floating point calculation.  The trick is to recognize this situation when it occurs and replace the exact computation with a suitable approximation.
A: If $p=1.75\cdot10^{-69}$ then $\log(1-p) \approx -p$.  Therefore, $\log(1-p)^{20000}\approx -3.5\cdot10^{-64}$ and $(1-p)^{20000}\approx \exp(-3.5\cdot10^{-64})\approx 1-3.5\cdot10^{-64}$.  
A: actually birthday paradox states that P(all_good) = $\frac{!start}{!stop}\frac{1}{start^{start-stop}}$ where start is number of all good values at beginning and stop is number of all good values at end of process  https://en.wikipedia.org/wiki/Birthday_problem
so algorithm is like this
res = 1.
for i in start..(stop+1):
    res = res * i / start
return res

