Thinking about this more:

If shift < 0, that means we are moving by ``shift`` towards the ``lower``, from ``central``.  Checking some cases:

```
shift = 0, value = 1
shift = 1, value = (lower / central - 1) + 1 =  lower/central
```
So looks good to me. I figured out why it was like that before - in the C++ version they later take an ABS value, and multiply it by shift, so I missed an (un)negation when I ported.  Just one thing to check - if there is no pull at all, it comes out as shift=0, not one, correct?  Maybe add a print the first time you run just to check.