Questions arise when I type in these expressions to Python 3.3.0
-10 // 3 # -4
-10 % 3 # 2
10 // -3 # -4
10 % -3 # -2
-10 // -3 # 3
a = (a // b) * b + (a % b)a: -10b: 3a // b: -4a % b: 2
Substitute in magic formula: -10 = -4 * 3 + 2 = -12 + 2 = -10
a: 10
b: -3a // b: -4a % b: -2
In magic formula: 10 = -4 * -3 - 2 = 12 - 2 = 10
So the magic formula seems to be correct.
If you define a // b as floor(a / b) (which it is), a % b should be a - floor(a / b) * b. Let's see:
a: -10b: 3a % b = a - floor(a / b) * b = -10 - floor(-3.33) * 3 = -10 + 4 * 3 = 2
The fact that a // b is always floored is pretty easy to remember (please read Cthulhu's first link, it's an explanation by the creator of Python). For negative a in a % b.. try to imagine a table of numbers that starts at 0 and has b columns:
b = 3:
0 1 2
3 4 5
6 7 8
9 10 11
...
If a is the number in a cell, a % b would be the column number:
a a % b
_______________
0 1 2 0 1 2
3 4 5 0 1 2
6 7 8 0 1 2
9 10 11 0 1 2
Now extend the table back in the negatives:
a a % b
__________________
-12 -11 -10 0 1 2
-9 -8 -7 0 1 2
-6 -5 -4 0 1 2
-3 -2 -1 0 1 2
0 1 2 0 1 2
3 4 5 0 1 2
6 7 8 0 1 2
9 10 11 0 1 2
-10 % 3 would be 2. Negative a in a % b would come up in these sorts of context. a % b with negative b doesn't come up much.