Math/programming puzzle
news.povray.org
news.povray.org
The last 100 digits are: 7378277516597614839875462720152687058107692252615041788608016076116764404775402901225862901549498368
As a mailing list comment points out, the effect of applying the for(c...) part to an n is:
fc(n) = n * (2 ^ n) * (2 ^ (n * (2 ^ n))
So the first iteration of the d variable sets n = fc(n), then the second sets it to fc(fc(n)), which is the answer. fc(2) = 2 * (2 ^ 2) * (2 ^ (2 * (2 ^ 2)) = 2048
so we want to find fc(2048) mod (10 ^ 10).
Consider a simpler question, what are the last two digits, i.e. fc(2048) mod 100
We need one fact here to help, the periodicity of 2 ^ k mod 100 is 20, i.e. 2 ^ (20q + r) = 2 ^ r mod 100
So: fc(2048) mod 100
= 2048 * (2 ^ 2048) * (2 ^ (2048 * (2 ^ 2048)) =
= 48 * (2 ^ 8) * (2 ^ ( 8 * (2 ^ 8)) [we can reduce all exponents mod 20, same in all below lines]
= 48 * 256 * (2 ^ ( 8 * 256 ) )
= 48 * 56 * (2 ^ 2048)
= 48 * 56 * (2^8)
= 28 * 56 * 56
= 150528
= 28.
So I think that the last two digits should be 28. I don't know what the answer is for the last 10 digits though.This is not true. You need to apply the following formula n times, not 2 times (in this case n=2048).
n <- n*2^nDerivation comes next. DO NOT READ IF YOU WANT TO TRY IT FOR YOURSELF.
The program is
n = 2
n times:
n times:
n times:
n times:
n++
=> n = 2
n times:
n times:
n times:
n = 2*n
=> n = 2
n times:
n times:
n = n*2^n
=> n = 2
2 times:
n times:
n = n*2^n
=> n = 2
2 times:
n = n*2^n
n times:
n = n*2^n
=> n = 2
n = n*2^n
n = n*2^n
n times:
n = n*2^n
=> n = 2048
2048 times:
n = n*2^n
Now we use the fact that we only need the last 10 digits. n = 2048
2048 times:
n = (n*2^n) % 10^10
=> n = 2048
2048 times:
n = (n*(2^n % 10^10)) % 10^10
=> n = 2048
2048 times:
n = (n*modexp(2,n,10^10)) % 10^10
Where modexp(k,n,a) computes k^n % a by repeated squaring and internally modding intermediate values: modexp(k,2*n,a) = modexp(k,n,a)**2 % a
modexp(k,2*n+1,a) = k*modexp(k,2*n,a) % a
When we run this we get the answer 1549498368. This algorithm can also compute more digits efficiently by setting 10^10 higher. Computing 100 digits takes a couple of seconds in Ruby. n = 2048
2048 times:
n = n*2^n
Now we use the fact that we only need the last 10 digits.
n = 2048
2048 times:
n = (n*2^n) % 10^10
CHEAT! x^y mod N is not necessarily the same as x^(y mod N) mod N.In this case it happens to be true, but you really should explain why.
Edit: I determined this by trying a logarithmic approach, while not really thinking about what that meant.
n = 11 # 1 << 11 == 2048
for i in range(2048):
print i, n
n += 2 ** n
At any point, 1 << n is equivalent to the same thing calculated via n = 2 * n. This works because n is always a power of 2, but it's really only gets you one step closer to the answer. With how many bits are involved here, I can't see how you could possibly calculate this in our universe.You couldn't store the number explicitly in this universe, but perhaps you could find a relatively cheap formula for the n-th digit of the number.
Dim a As Integer, b As Integer, c As Integer, d As Integer, n As Integer
n = II For b = n To I Step -I For c = n To I Step -I For d = n To I Step -I n = n + I Debug.Print n Next d Next c Next b
And the answer is MMXCVIII