Minor cleanup.

This commit is contained in:
Simon Forman 2022-10-06 18:11:24 -07:00
parent bad1a909c7
commit 92ffefd6f0
1 changed files with 19 additions and 5 deletions

View File

@ -18,17 +18,31 @@ def lil_divmod(A, B):
def find_greatest(low, high, f):
'''
Return the highest number n: low <= n <= high
for which f(n) and not f(n+1) is True.
The greatest n which makes f(n) True.
Return the highest number n: low <= n <= high for which:
for all i in low..n f(i) is True
-and-
for all i in (n+1)..high f(i) is False.
If the function f::int->bool doesn't behave like above
then I don't know what this function will do.
There must be some number in the range or this function will
fail with an assertion error. (If you turn off assertions
it will succeed and return low in such a case.)
'''
assert low <= high
if f(high):
return high
pivot = (low + high) >> 1
# If there isn't a pivot between low and high that means there's only
# two numbers it could be: low or high, and we already know it isn't
# high from the test above so it must be low.
if low == pivot:
assert f(low) and not f(low + 1)
return low
assert low < pivot < high
return (
low
if low == pivot else
find_greatest(pivot, high - 1, f)
if f(pivot) else
find_greatest(low, pivot - 1, f)