Thread: February 2017
View Single Post
Old 2017-03-02, 23:13   #2
R. Gerbicz
R. Gerbicz's Avatar
"Robert Gerbicz"
Oct 2005

2·3·11·23 Posts

The official solution is here:

Just a small note: since the total search space (2^42) is not that large, semi-bruteforce routine with a sample c code (without dirty optimizations, avx2 etc.) is possible: use the mod 7 trick, precompute 6+s*(5+s*s*s*(2+s*(3+s))) + b*(5+s*(5+s*(6+s*s*(3+s*6)))) for b=0..1,s=0..6, then the problem is solvable in roughly 3 days on a a fast i7 using 1 core, or in say a week on a slow core i3. Ofcourse the distribution of the problem to all cores/threads is trivial if you want a faster (bruteforce) solution.

My sent solution (not for the star):
The answer is:

A dynamic programming solution in PARI-GP:
Here fun(42) gives the answer for 42 bits.
The complexity of the above algorithm is O(L^2) for L bits, much faster then the almost trivial O(2^L*L) algorithm.
In general if we need the answer for L bits, then for every sequence and in each step r will be in [-L,L] interval and it is enough to know s mod 7. For a given v if we know r and (s mod 7) when we process the bit's of v, then we can get the value of r at the end of the function. So count only the number of possible sequences of length i bits for that we have r and (s mod 7), for the next bit we have 2 possibilities b=0 or 1, for all these sequences we have the same new
r2 and (s2 mod 7) values if we fix the bit. After i=L we get the number of sequences with L bits for each (possible) r and (s mod 7).

In the code: we store the number of sequences in the matrix A, in A[k,l] we see the number of sequences that has s=k mod 7 and r=l-(L+1), in this way the size of matrix is 7X(2*L+1).
At the end, after we processed all L bits, the number of sequences that return a zero value is just sum(i=1,7,A[i,L+1]), so the number of sequences for a non-zero return value is just 2^L-sum(i=1,7,A[i,L+1]).
R. Gerbicz is offline   Reply With Quote