Compute the square root of a positive integer using binary searchInteger square root in x86 assembly (NASM)Epilogue to a binary search to find the range of matching indexesBinary search that gets ALL matching resultsBinary search of an integer arraySend a tweet to ISP when internet speed dropsNavigating over a square spiralSwiftly counting rooms in a floor planHashTable using C

How do the Durable and Dwarven Fortitude feats interact?

Are there any OR challenges that are similar to kaggle's competitions?

Why was ramjet fuel used as hydraulic fluid during Saturn V checkout?

What are some tips and tricks for finding the cheapest flight when luggage and other fees are not revealed until far into the booking process?

What would cause a nuclear power plant to break down after 2000 years, but not sooner?

From where do electrons gain kinetic energy through a circuit?

Designing a prison for a telekinetic race

When does The Truman Show take place?

Why is the battery jumpered to a resistor in this schematic?

Have made several mistakes during the course of my PhD. Can't help but feel resentment. Can I get some advice about how to move forward?

Programming a recursive formula into Mathematica and find the nth position in the sequence

Are there any rules on how characters go from 0th to 1st level in a class?

Why do aircraft leave cruising altitude long before landing just to circle?

Build a mob of suspiciously happy lenny faces ( ͡° ͜ʖ ͡°)

My new Acer Aspire 7 doesn't have a Legacy Boot option, what can I do to get it?

global variant of csname…endcsname

Why should P.I be willing to write strong LOR even if that means losing a undergraduate from his/her lab?

Did they ever see Truman doing any private things when filming him for 24 hours 7 days a week?

Trying to understand how Digital Certificates and CA are indeed secure

Gofer work in exchange for Letter of Recommendation

What's a good pattern to calculate a variable only when it is used the first time?

What is the best way to use errors in mathematica M12?

Is this bar slide trick shown on Cheers real or a visual effect?

The anatomy of an organic infrared generator



Compute the square root of a positive integer using binary search


Integer square root in x86 assembly (NASM)Epilogue to a binary search to find the range of matching indexesBinary search that gets ALL matching resultsBinary search of an integer arraySend a tweet to ISP when internet speed dropsNavigating over a square spiralSwiftly counting rooms in a floor planHashTable using C






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








3












$begingroup$


The requirement is to find the square root of a positive integer using binary search and the math property that square root of a number n is between 0 and n/2, and the required answer is "floored", meaning mySqrt(8) is to return 2.



Please comment on the efficiency, and if possible, the loop invariants in terms of correctness:



class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int

Loop invariant:

The answer is always in the range [low, high] inclusive,
except possibly:

1) low == high == mid, and mid * mid == x and
any of low, high, or mid can be returned as the answer.

2) if there is no exact answer and the floor is to be
returned, then low > high by 1. Since sq != x,
so either low or high is set inside the loop.

If low gets set and gets pushed up, it is pushed up too much.
So when low > high by 1, low - 1 is the answer and it is the same
as high, because low > high by 1.

If high gets set and gets pushed down, high can be
the correct answer. When low > high, it is by 1,
and high is the correct floor value to be returned.
(since there is no perfect square root and the floor is required)

0 <= low <= answer <= high <= n//2 + 1

where answer is floor(sqrt(x)) to be found,
except if low > high and the loop will exit.

Each loop iteration always makes the range smaller.

If the range is empty at the end, low is > high by 1, and high is
the correct floored value, and low is the ceiling value, so high is returned.
"""

low = 0;
high = x//2 + 1;

while (low <= high):
mid = low + (high - low) // 2;
sq = mid * mid;
if (sq == x):
return mid;
elif (sq > x):
high = mid - 1; # sq exceeds target, so mid cannot be the answer floored, but when high is set to mid - 1, then it can be the answer
else:
low = mid + 1; # (here sq < x, and mid might be the answer floored, so when low is set to mid + 1, then low might be too big, while high is correct)

return high;









share|improve this question











$endgroup$




















    3












    $begingroup$


    The requirement is to find the square root of a positive integer using binary search and the math property that square root of a number n is between 0 and n/2, and the required answer is "floored", meaning mySqrt(8) is to return 2.



    Please comment on the efficiency, and if possible, the loop invariants in terms of correctness:



    class Solution(object):
    def mySqrt(self, x):
    """
    :type x: int
    :rtype: int

    Loop invariant:

    The answer is always in the range [low, high] inclusive,
    except possibly:

    1) low == high == mid, and mid * mid == x and
    any of low, high, or mid can be returned as the answer.

    2) if there is no exact answer and the floor is to be
    returned, then low > high by 1. Since sq != x,
    so either low or high is set inside the loop.

    If low gets set and gets pushed up, it is pushed up too much.
    So when low > high by 1, low - 1 is the answer and it is the same
    as high, because low > high by 1.

    If high gets set and gets pushed down, high can be
    the correct answer. When low > high, it is by 1,
    and high is the correct floor value to be returned.
    (since there is no perfect square root and the floor is required)

    0 <= low <= answer <= high <= n//2 + 1

    where answer is floor(sqrt(x)) to be found,
    except if low > high and the loop will exit.

    Each loop iteration always makes the range smaller.

    If the range is empty at the end, low is > high by 1, and high is
    the correct floored value, and low is the ceiling value, so high is returned.
    """

    low = 0;
    high = x//2 + 1;

    while (low <= high):
    mid = low + (high - low) // 2;
    sq = mid * mid;
    if (sq == x):
    return mid;
    elif (sq > x):
    high = mid - 1; # sq exceeds target, so mid cannot be the answer floored, but when high is set to mid - 1, then it can be the answer
    else:
    low = mid + 1; # (here sq < x, and mid might be the answer floored, so when low is set to mid + 1, then low might be too big, while high is correct)

    return high;









    share|improve this question











    $endgroup$
















      3












      3








      3





      $begingroup$


      The requirement is to find the square root of a positive integer using binary search and the math property that square root of a number n is between 0 and n/2, and the required answer is "floored", meaning mySqrt(8) is to return 2.



      Please comment on the efficiency, and if possible, the loop invariants in terms of correctness:



      class Solution(object):
      def mySqrt(self, x):
      """
      :type x: int
      :rtype: int

      Loop invariant:

      The answer is always in the range [low, high] inclusive,
      except possibly:

      1) low == high == mid, and mid * mid == x and
      any of low, high, or mid can be returned as the answer.

      2) if there is no exact answer and the floor is to be
      returned, then low > high by 1. Since sq != x,
      so either low or high is set inside the loop.

      If low gets set and gets pushed up, it is pushed up too much.
      So when low > high by 1, low - 1 is the answer and it is the same
      as high, because low > high by 1.

      If high gets set and gets pushed down, high can be
      the correct answer. When low > high, it is by 1,
      and high is the correct floor value to be returned.
      (since there is no perfect square root and the floor is required)

      0 <= low <= answer <= high <= n//2 + 1

      where answer is floor(sqrt(x)) to be found,
      except if low > high and the loop will exit.

      Each loop iteration always makes the range smaller.

      If the range is empty at the end, low is > high by 1, and high is
      the correct floored value, and low is the ceiling value, so high is returned.
      """

      low = 0;
      high = x//2 + 1;

      while (low <= high):
      mid = low + (high - low) // 2;
      sq = mid * mid;
      if (sq == x):
      return mid;
      elif (sq > x):
      high = mid - 1; # sq exceeds target, so mid cannot be the answer floored, but when high is set to mid - 1, then it can be the answer
      else:
      low = mid + 1; # (here sq < x, and mid might be the answer floored, so when low is set to mid + 1, then low might be too big, while high is correct)

      return high;









      share|improve this question











      $endgroup$




      The requirement is to find the square root of a positive integer using binary search and the math property that square root of a number n is between 0 and n/2, and the required answer is "floored", meaning mySqrt(8) is to return 2.



      Please comment on the efficiency, and if possible, the loop invariants in terms of correctness:



      class Solution(object):
      def mySqrt(self, x):
      """
      :type x: int
      :rtype: int

      Loop invariant:

      The answer is always in the range [low, high] inclusive,
      except possibly:

      1) low == high == mid, and mid * mid == x and
      any of low, high, or mid can be returned as the answer.

      2) if there is no exact answer and the floor is to be
      returned, then low > high by 1. Since sq != x,
      so either low or high is set inside the loop.

      If low gets set and gets pushed up, it is pushed up too much.
      So when low > high by 1, low - 1 is the answer and it is the same
      as high, because low > high by 1.

      If high gets set and gets pushed down, high can be
      the correct answer. When low > high, it is by 1,
      and high is the correct floor value to be returned.
      (since there is no perfect square root and the floor is required)

      0 <= low <= answer <= high <= n//2 + 1

      where answer is floor(sqrt(x)) to be found,
      except if low > high and the loop will exit.

      Each loop iteration always makes the range smaller.

      If the range is empty at the end, low is > high by 1, and high is
      the correct floored value, and low is the ceiling value, so high is returned.
      """

      low = 0;
      high = x//2 + 1;

      while (low <= high):
      mid = low + (high - low) // 2;
      sq = mid * mid;
      if (sq == x):
      return mid;
      elif (sq > x):
      high = mid - 1; # sq exceeds target, so mid cannot be the answer floored, but when high is set to mid - 1, then it can be the answer
      else:
      low = mid + 1; # (here sq < x, and mid might be the answer floored, so when low is set to mid + 1, then low might be too big, while high is correct)

      return high;






      python algorithm mathematics binary-search






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 1 hour ago







      太極者無極而生

















      asked 9 hours ago









      太極者無極而生太極者無極而生

      1997 bronze badges




      1997 bronze badges























          1 Answer
          1






          active

          oldest

          votes


















          5












          $begingroup$

          • Your comments on the elif / else part are too long to be just after the statements


          • Don't use semicolons (;) in Python.


          • This is a refactored version of the code


          import math

          class Solution(object):
          def mySqrt(self, x):
          """
          :type x: int
          :rtype: int

          Returns floor(sqrt(x))
          """
          low = 0
          high = x//2 + 1

          """
          It is proved that 0 <= sqrt(x) <= x/2, so
          we run a dichotomic in [0, x/2] to find floor(sqrt(x))

          Loop analysis:
          * Initialization: low = 0 and high = x/2 + 1
          * Termination: |high-low| is reduced each iteration,
          as shown in lines high = mid - 1 and low = mid + 1.
          * Invariant: low <= floor(sqrt(x)) <= high.
          Let mid be (low + high)/2.
          - If mid^2 <= x < (mid+1)^2,
          then mid is floor(sqrt(x)) and just return it.
          - If mid^2 > x, search for values smaller than mid.
          - Otherwise, if mid^2 < x, search within higher values.
          """
          while (low <= high):
          mid = (low + high) // 2
          sq = mid * mid
          sq_next = (mid+1)*(mid+1)
          if (sq <= x < sq_next):
          return mid
          elif (sq > x):
          high = mid - 1
          else:
          low = mid + 1

          for i in range(1, 26):
          assert(math.floor(math.sqrt(i)) == Solution().mySqrt(i))





          share|improve this answer











          $endgroup$














          • $begingroup$
            I suppose if it is Python, it can be mid = (low + high) // 2 because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to become bignum, and then divided by 2 to make it back to a 32 bit or 64 bit int
            $endgroup$
            – 太極者無極而生
            9 hours ago







          • 1




            $begingroup$
            @太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
            $endgroup$
            – JnxF
            9 hours ago











          • $begingroup$
            you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider how low or high gets set... interesting... it looks like it can make it simpler loop invariants
            $endgroup$
            – 太極者無極而生
            8 hours ago











          • $begingroup$
            how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
            $endgroup$
            – 太極者無極而生
            8 hours ago










          • $begingroup$
            @太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
            $endgroup$
            – JnxF
            8 hours ago













          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "196"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f226340%2fcompute-the-square-root-of-a-positive-integer-using-binary-search%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          5












          $begingroup$

          • Your comments on the elif / else part are too long to be just after the statements


          • Don't use semicolons (;) in Python.


          • This is a refactored version of the code


          import math

          class Solution(object):
          def mySqrt(self, x):
          """
          :type x: int
          :rtype: int

          Returns floor(sqrt(x))
          """
          low = 0
          high = x//2 + 1

          """
          It is proved that 0 <= sqrt(x) <= x/2, so
          we run a dichotomic in [0, x/2] to find floor(sqrt(x))

          Loop analysis:
          * Initialization: low = 0 and high = x/2 + 1
          * Termination: |high-low| is reduced each iteration,
          as shown in lines high = mid - 1 and low = mid + 1.
          * Invariant: low <= floor(sqrt(x)) <= high.
          Let mid be (low + high)/2.
          - If mid^2 <= x < (mid+1)^2,
          then mid is floor(sqrt(x)) and just return it.
          - If mid^2 > x, search for values smaller than mid.
          - Otherwise, if mid^2 < x, search within higher values.
          """
          while (low <= high):
          mid = (low + high) // 2
          sq = mid * mid
          sq_next = (mid+1)*(mid+1)
          if (sq <= x < sq_next):
          return mid
          elif (sq > x):
          high = mid - 1
          else:
          low = mid + 1

          for i in range(1, 26):
          assert(math.floor(math.sqrt(i)) == Solution().mySqrt(i))





          share|improve this answer











          $endgroup$














          • $begingroup$
            I suppose if it is Python, it can be mid = (low + high) // 2 because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to become bignum, and then divided by 2 to make it back to a 32 bit or 64 bit int
            $endgroup$
            – 太極者無極而生
            9 hours ago







          • 1




            $begingroup$
            @太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
            $endgroup$
            – JnxF
            9 hours ago











          • $begingroup$
            you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider how low or high gets set... interesting... it looks like it can make it simpler loop invariants
            $endgroup$
            – 太極者無極而生
            8 hours ago











          • $begingroup$
            how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
            $endgroup$
            – 太極者無極而生
            8 hours ago










          • $begingroup$
            @太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
            $endgroup$
            – JnxF
            8 hours ago















          5












          $begingroup$

          • Your comments on the elif / else part are too long to be just after the statements


          • Don't use semicolons (;) in Python.


          • This is a refactored version of the code


          import math

          class Solution(object):
          def mySqrt(self, x):
          """
          :type x: int
          :rtype: int

          Returns floor(sqrt(x))
          """
          low = 0
          high = x//2 + 1

          """
          It is proved that 0 <= sqrt(x) <= x/2, so
          we run a dichotomic in [0, x/2] to find floor(sqrt(x))

          Loop analysis:
          * Initialization: low = 0 and high = x/2 + 1
          * Termination: |high-low| is reduced each iteration,
          as shown in lines high = mid - 1 and low = mid + 1.
          * Invariant: low <= floor(sqrt(x)) <= high.
          Let mid be (low + high)/2.
          - If mid^2 <= x < (mid+1)^2,
          then mid is floor(sqrt(x)) and just return it.
          - If mid^2 > x, search for values smaller than mid.
          - Otherwise, if mid^2 < x, search within higher values.
          """
          while (low <= high):
          mid = (low + high) // 2
          sq = mid * mid
          sq_next = (mid+1)*(mid+1)
          if (sq <= x < sq_next):
          return mid
          elif (sq > x):
          high = mid - 1
          else:
          low = mid + 1

          for i in range(1, 26):
          assert(math.floor(math.sqrt(i)) == Solution().mySqrt(i))





          share|improve this answer











          $endgroup$














          • $begingroup$
            I suppose if it is Python, it can be mid = (low + high) // 2 because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to become bignum, and then divided by 2 to make it back to a 32 bit or 64 bit int
            $endgroup$
            – 太極者無極而生
            9 hours ago







          • 1




            $begingroup$
            @太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
            $endgroup$
            – JnxF
            9 hours ago











          • $begingroup$
            you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider how low or high gets set... interesting... it looks like it can make it simpler loop invariants
            $endgroup$
            – 太極者無極而生
            8 hours ago











          • $begingroup$
            how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
            $endgroup$
            – 太極者無極而生
            8 hours ago










          • $begingroup$
            @太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
            $endgroup$
            – JnxF
            8 hours ago













          5












          5








          5





          $begingroup$

          • Your comments on the elif / else part are too long to be just after the statements


          • Don't use semicolons (;) in Python.


          • This is a refactored version of the code


          import math

          class Solution(object):
          def mySqrt(self, x):
          """
          :type x: int
          :rtype: int

          Returns floor(sqrt(x))
          """
          low = 0
          high = x//2 + 1

          """
          It is proved that 0 <= sqrt(x) <= x/2, so
          we run a dichotomic in [0, x/2] to find floor(sqrt(x))

          Loop analysis:
          * Initialization: low = 0 and high = x/2 + 1
          * Termination: |high-low| is reduced each iteration,
          as shown in lines high = mid - 1 and low = mid + 1.
          * Invariant: low <= floor(sqrt(x)) <= high.
          Let mid be (low + high)/2.
          - If mid^2 <= x < (mid+1)^2,
          then mid is floor(sqrt(x)) and just return it.
          - If mid^2 > x, search for values smaller than mid.
          - Otherwise, if mid^2 < x, search within higher values.
          """
          while (low <= high):
          mid = (low + high) // 2
          sq = mid * mid
          sq_next = (mid+1)*(mid+1)
          if (sq <= x < sq_next):
          return mid
          elif (sq > x):
          high = mid - 1
          else:
          low = mid + 1

          for i in range(1, 26):
          assert(math.floor(math.sqrt(i)) == Solution().mySqrt(i))





          share|improve this answer











          $endgroup$



          • Your comments on the elif / else part are too long to be just after the statements


          • Don't use semicolons (;) in Python.


          • This is a refactored version of the code


          import math

          class Solution(object):
          def mySqrt(self, x):
          """
          :type x: int
          :rtype: int

          Returns floor(sqrt(x))
          """
          low = 0
          high = x//2 + 1

          """
          It is proved that 0 <= sqrt(x) <= x/2, so
          we run a dichotomic in [0, x/2] to find floor(sqrt(x))

          Loop analysis:
          * Initialization: low = 0 and high = x/2 + 1
          * Termination: |high-low| is reduced each iteration,
          as shown in lines high = mid - 1 and low = mid + 1.
          * Invariant: low <= floor(sqrt(x)) <= high.
          Let mid be (low + high)/2.
          - If mid^2 <= x < (mid+1)^2,
          then mid is floor(sqrt(x)) and just return it.
          - If mid^2 > x, search for values smaller than mid.
          - Otherwise, if mid^2 < x, search within higher values.
          """
          while (low <= high):
          mid = (low + high) // 2
          sq = mid * mid
          sq_next = (mid+1)*(mid+1)
          if (sq <= x < sq_next):
          return mid
          elif (sq > x):
          high = mid - 1
          else:
          low = mid + 1

          for i in range(1, 26):
          assert(math.floor(math.sqrt(i)) == Solution().mySqrt(i))






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 8 hours ago

























          answered 9 hours ago









          JnxFJnxF

          4384 silver badges13 bronze badges




          4384 silver badges13 bronze badges














          • $begingroup$
            I suppose if it is Python, it can be mid = (low + high) // 2 because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to become bignum, and then divided by 2 to make it back to a 32 bit or 64 bit int
            $endgroup$
            – 太極者無極而生
            9 hours ago







          • 1




            $begingroup$
            @太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
            $endgroup$
            – JnxF
            9 hours ago











          • $begingroup$
            you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider how low or high gets set... interesting... it looks like it can make it simpler loop invariants
            $endgroup$
            – 太極者無極而生
            8 hours ago











          • $begingroup$
            how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
            $endgroup$
            – 太極者無極而生
            8 hours ago










          • $begingroup$
            @太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
            $endgroup$
            – JnxF
            8 hours ago
















          • $begingroup$
            I suppose if it is Python, it can be mid = (low + high) // 2 because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to become bignum, and then divided by 2 to make it back to a 32 bit or 64 bit int
            $endgroup$
            – 太極者無極而生
            9 hours ago







          • 1




            $begingroup$
            @太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
            $endgroup$
            – JnxF
            9 hours ago











          • $begingroup$
            you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider how low or high gets set... interesting... it looks like it can make it simpler loop invariants
            $endgroup$
            – 太極者無極而生
            8 hours ago











          • $begingroup$
            how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
            $endgroup$
            – 太極者無極而生
            8 hours ago










          • $begingroup$
            @太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
            $endgroup$
            – JnxF
            8 hours ago















          $begingroup$
          I suppose if it is Python, it can be mid = (low + high) // 2 because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to become bignum, and then divided by 2 to make it back to a 32 bit or 64 bit int
          $endgroup$
          – 太極者無極而生
          9 hours ago





          $begingroup$
          I suppose if it is Python, it can be mid = (low + high) // 2 because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to become bignum, and then divided by 2 to make it back to a 32 bit or 64 bit int
          $endgroup$
          – 太極者無極而生
          9 hours ago





          1




          1




          $begingroup$
          @太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
          $endgroup$
          – JnxF
          9 hours ago





          $begingroup$
          @太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
          $endgroup$
          – JnxF
          9 hours ago













          $begingroup$
          you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider how low or high gets set... interesting... it looks like it can make it simpler loop invariants
          $endgroup$
          – 太極者無極而生
          8 hours ago





          $begingroup$
          you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider how low or high gets set... interesting... it looks like it can make it simpler loop invariants
          $endgroup$
          – 太極者無極而生
          8 hours ago













          $begingroup$
          how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
          $endgroup$
          – 太極者無極而生
          8 hours ago




          $begingroup$
          how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
          $endgroup$
          – 太極者無極而生
          8 hours ago












          $begingroup$
          @太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
          $endgroup$
          – JnxF
          8 hours ago




          $begingroup$
          @太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
          $endgroup$
          – JnxF
          8 hours ago

















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f226340%2fcompute-the-square-root-of-a-positive-integer-using-binary-search%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Invision Community Contents History See also References External links Navigation menuProprietaryinvisioncommunity.comIPS Community ForumsIPS Community Forumsthis blog entry"License Changes, IP.Board 3.4, and the Future""Interview -- Matt Mecham of Ibforums""CEO Invision Power Board, Matt Mecham Is a Liar, Thief!"IPB License Explanation 1.3, 1.3.1, 2.0, and 2.1ArchivedSecurity Fixes, Updates And Enhancements For IPB 1.3.1Archived"New Demo Accounts - Invision Power Services"the original"New Default Skin"the original"Invision Power Board 3.0.0 and Applications Released"the original"Archived copy"the original"Perpetual licenses being done away with""Release Notes - Invision Power Services""Introducing: IPS Community Suite 4!"Invision Community Release Notes

          Canceling a color specificationRandomly assigning color to Graphics3D objects?Default color for Filling in Mathematica 9Coloring specific elements of sets with a prime modified order in an array plotHow to pick a color differing significantly from the colors already in a given color list?Detection of the text colorColor numbers based on their valueCan color schemes for use with ColorData include opacity specification?My dynamic color schemes

          Ласкавець круглолистий Зміст Опис | Поширення | Галерея | Примітки | Посилання | Навігаційне меню58171138361-22960890446Bupleurum rotundifoliumEuro+Med PlantbasePlants of the World Online — Kew ScienceGermplasm Resources Information Network (GRIN)Ласкавецькн. VI : Літери Ком — Левиправивши або дописавши її