### In the great tradition of nibbling at the edges...

...and because I am still puzzling over why

Let's remind ourselves of

This is a special case of the Newton-Raphson method that was known to the ancient Greeks. We treat zero specially to avoid one of the gotchas of Newton-Raphson, but aside from that, this particular example is well-behaved, and has what they call

**pairsum**is grabbing so much RAM, let's contemplate**floorSqrt**. We're just calling it 2,000 times, and yet it's collectively taking up over six percent of the CPU time and five percent of allocation?!Let's remind ourselves of

**floorSqrt**(tweaked because I forgot that I'd memoized powers of two)**floorSqrt :: Integer -> Integer**

floorSqrt 0 = 0

floorSqrt n = floorSqrt' (twoToThe ((1 + bitsIn n) `div` 2))

where floorSqrt' x =

let y = (x + n `div` x) `div` 2

in if y >= x then x else floorSqrt' yfloorSqrt 0 = 0

floorSqrt n = floorSqrt' (twoToThe ((1 + bitsIn n) `div` 2))

where floorSqrt' x =

let y = (x + n `div` x) `div` 2

in if y >= x then x else floorSqrt' y

This is a special case of the Newton-Raphson method that was known to the ancient Greeks. We treat zero specially to avoid one of the gotchas of Newton-Raphson, but aside from that, this particular example is well-behaved, and has what they call

*quadratic convergence*: once you're sufficiently close, each successive guess is good to twice as many digits as the one before. Our first guess is …