Find the nth digit of Euler's number
Python 2, 34 32 bytes
Solution provided by @l4m2
-2 bytes thanks to @xnor
lambda n:`(100**n+1)**100**n`[n]
Try it online!
Very, very slow.
Verification up to \$166\$ digits. The idea for this verification comes from @l4m2: calculates \$x^{100^n}\$ by calculating x=x**10
repeatedly (\$2n\$ times), each time truncating \$x\$ to a few left most digits (the TIO link uses \$500\$ digits). By changing the truncation to round down or up, we obtain the lower and upper bound for the result. If the lower and upper bound agree to \$n\$ leftmost digits, we know that the exact calculation will also result in those \$n\$ digits.
I have verified that this solution works up to \$n = 333\$, using MAX_DIGITS = 1000
.
How
This solution uses the following well known approximation of \$e\$: $$ e = \lim_{x \to \infty} \left(1 + \frac{1}{x} \right)^{x}$$ Substituting \$x = 100^n\$, we have: $$ e = \lim_{n \to \infty} \left(1 + \frac{1}{100^n} \right)^{100^n} = \lim_{n \to \infty} \frac{\left(100^n + 1 \right)^{100^n}}{\left(100^n\right)^{100^n}}$$ Since the denominator is a power of \$10\$, we can ignore it entirely.
According to this analysis on Math SE, the worst case error of this approximation is: $$ \Delta < \frac{3}{x} = \frac{3}{100^n}$$ which means roughly that every time \$n\$ increases by \$1\$, we gains 2 digits of precision.
05AB1E, 4 bytes
žtsè
Pretty convenient builtin ¯\_(ツ)_/¯
Try it online or verify the first ten digits or output the infinite list of digits.
Explanation:
žt # Push the infinite list of decimal value of e (including leading 2)
sè # And 0-based index the input-integer into it
# (after which the result is output implicitly)
dc, 66 bytes
I?dF+k^1sF2sE2sN[q]sR[1lNlF*dsF/d0=RlE+sElN1+sNlLx]dsLx+lE*0k1/I%p
Try it online!
Or print more than 800 digits before TIO times out after a minute.
I've verified these 800 digits against the published value at a NASA web page with 2 million digits of e.
(It may be possible to shorten the code a bit by keeping some of the variables on the stack and accessing them via stack manipulation instead of using dc's registers.)
Explanation
I # 10.
? # Input value.
d # Push on stack for later.
F+k # Add 15 and make that the number of decimal places to calculate.
^ # 10 ^ input value, saved on stack for use at end.
1sF # 1!, stored in F.
2sE # 2 is starting value for e.
2sN # for (N=2; ... )
[q]sR # Macro R will be used to end loop.
[ # Start loop L.
1 # Push 1 for later.
lNlF*dsF # F = N! and push on stack.
/d # 1 / N!, duplicate on stack
0=R # If 1/N! == 0 (to the number of decimal places being computed), end loop.
lE+sE # Otherwise e += 1/N!
lN1+sN # N++
lLx # Go back to start of loop L
]dsLx # End macro, save it in L, and execute it.
+ # Get rid of extra 0 on stack.
lE # e, computed with sufficient accuracy
* # Multiply by 10^input value, which was saved on the stack early on.
0k1/ # Truncate to integer.
I% # Mod by 10 to get desired digit.
p # Print digit.