On 04/08/17 15:51, Steve D'Aprano wrote:
Another hint: if you run this code:


for i in range(53, 1024):
     n = 2**i
     if isqrt_newton(n) != isqrt_float(n):
         print(n)
         break


you can find a much better upper bound for M:

     2**53 < M <= 2**105

which is considerable smaller that the earlier upper bound of 2**1024. But even
so, that's still 40564819207303331840695247831040 values to be tested.

On the assumption that we want a solution before the return of Halley's Comet,
how would you go about finding M?

I tried a variation of what you used to cut down the search space further:

for j in range(0, 53):
  for i in range(53, 105):
    n = 2**i + 2**j
    if isqrt_newton(n) != isqrt_float(n):
      print(n, i, j)
      sys.exit(1)

which gave me a new upper bound of 2**54+2**28. Reversing the order of the loops would probably have been more sensible, but what the heck. That's only (!) 9007199523176448 values to test, which my machine seemed to be quite happy with, but you could repeat the exercise with more layers if you really wanted to.

--
Rhodri James *-* Kynesim Ltd
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to