When working on this question regarding the divisibility of the sum of factorials, I decided to write some code to test "small values" of the problem using the following code.
f[p_] := Total[Mod[#!, p] & /@ Range[p - 1]]; Table[Mod[f@Prime@i, Prime@i], {i, 1, 500}] Basically, what the code does is sum up all the factorials $$1!+2!+3!+\dots+(p-1)!$$
and find the remainder modulo $p$, for prime $p$.
Unfortunately, my code as written takes a very long time to run. Checking the first 500 primes takes 88.280966 seconds on my computer, but checking the first 2000 primes took me about 4 hours.
Is there any way to improve the code, or is it already the best we can do?
As for optimizations not involving the code, I used Wilson's Theorem, which states that for all primes $p$,
$$(p-1)!\equiv-1 \bmod p$$
Using the above theorem, we can modify the code as follows.
h[p_] := Total@Flatten[{Mod[#!, p], PowerMod[(# - 1)!*(-1)^(#), -1, p]} & /@ Range[(p - 1)/2]]; Table[Mod[h@Prime@i, Prime@i], {i, 1, 500}] This is considerably faster than the previous code, since checking the first 500 primes takes only 25.896166 seconds. However, checking the first 2000 primes still takes an inordinately long time.