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

What was the intention with the Commodore 128?

Did Michelle Obama have a staff of 23; and Melania have a staff of 4?

How to use the passive form to say "This flower was watered."

What is the opposite of "hunger level"?

What should I do with the stock I own if I anticipate there will be a recession?

Gofer work in exchange for Letter of Recommendation

A Magic Diamond

Polar contour plot in Mathematica?

Meaning and structure of headline "Hair it is: A List of ..."

Unsolved Problems due to Lack of Computational Power

When does The Truman Show take place?

How to render "have ideas above his station" into German

Is it alright to say good afternoon Sirs and Madams in a panel interview?

Existence of a certain set of 0/1-sequences without the Axiom of Choice

Unconventional examples of mathematical modelling

How do I cope with haze for the photos containing sky and trees at a distance?

Heyawacky: Ace of Cups

Designing a prison for a telekinetic race

What happened after the end of the Truman Show?

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

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

What exactly happened to the 18 crew members who were reported as "missing" in "Q Who"?

A reccomended structured approach to self studying music theory for songwriting

Output with the same length always



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.

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.

    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.

      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.

      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 6 hours ago







      太極者無極而生

















      asked 8 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$
            – 太極者無極而生
            8 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
            7 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$
            – 太極者無極而生
            7 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$
            – 太極者無極而生
            7 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
            7 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$
            – 太極者無極而生
            8 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
            7 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$
            – 太極者無極而生
            7 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$
            – 太極者無極而生
            7 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
            7 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$
            – 太極者無極而生
            8 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
            7 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$
            – 太極者無極而生
            7 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$
            – 太極者無極而生
            7 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
            7 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 7 hours ago

























          answered 8 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$
            – 太極者無極而生
            8 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
            7 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$
            – 太極者無極而生
            7 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$
            – 太極者無極而生
            7 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
            7 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$
            – 太極者無極而生
            8 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
            7 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$
            – 太極者無極而生
            7 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$
            – 太極者無極而生
            7 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
            7 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$
          – 太極者無極而生
          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$
          – 太極者無極而生
          8 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
          7 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
          7 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$
          – 太極者無極而生
          7 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$
          – 太極者無極而生
          7 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$
          – 太極者無極而生
          7 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$
          – 太極者無極而生
          7 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
          7 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
          7 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

          ParseJSON using SSJSUsing AMPscript with SSJS ActivitiesHow to resubscribe a user in Marketing cloud using SSJS?Pulling Subscriber Status from Lists using SSJSRetrieving Emails using SSJSProblem in updating DE using SSJSUsing SSJS to send single email in Marketing CloudError adding EmailSendDefinition using SSJS

          Кампала Садржај Географија Географија Историја Становништво Привреда Партнерски градови Референце Спољашње везе Мени за навигацију0°11′ СГШ; 32°20′ ИГД / 0.18° СГШ; 32.34° ИГД / 0.18; 32.340°11′ СГШ; 32°20′ ИГД / 0.18° СГШ; 32.34° ИГД / 0.18; 32.34МедијиПодациЗванични веб-сајту

          19. јануар Садржај Догађаји Рођења Смрти Празници и дани сећања Види још Референце Мени за навигацијуу