You can represent any integer, *z*,

…, -3, -2, -1, 0, 1, 2, 3, …

as a natural number,

0, 1, 2, 3, …

All infinitely many of them. Map nonnegative integers to even numbers 2*z* and negative numbers to odd numbers -2*z* – 1.

So 1 goes to 2, 2 goes to 4, 3 goes to 6, and so on, and -1 goes to 1, -2 goes to 3, -3 goes to 5. Zero stays put.

Now, I know what you’re wondering. How can we define subtraction in this world, assuming we already know how to do arithmetic on natural numbers?

I tried doing it a hilariously convoluted way using… linear regression 🙂 . R code over here.

The regression models “wrote” the *case_when* below automatically. I haven’t tried to simplify any of it but, e.g., the

0 + 0 * x_pz + 0 * y_pz

can probably safely be reduced to 0, and

1 + 1 * x_pz + 1 * y_pz

to

1 + x_pz + y_pz

pz_sub <- function(x_pz, y_pz) { x_abs_pz <- ifelse(even(x_pz), x_pz, x_pz + 1) y_abs_pz <- ifelse(even(y_pz), y_pz, y_pz + 1) case_when( even(x_pz) & even(y_pz) & x_abs_pz < y_abs_pz ~ -1 + -1 * x_pz + 1 * y_pz , odd(x_pz) & odd(y_pz) & x_abs_pz > y_abs_pz ~ -1 + 1 * x_pz + -1 * y_pz , odd(x_pz) & odd(y_pz) & x_abs_pz < y_abs_pz ~ 0 + -1 * x_pz + 1 * y_pz , odd(x_pz) & odd(y_pz) & x_abs_pz == y_abs_pz ~ 0 + 0 * x_pz + 0 * y_pz , even(x_pz) & even(y_pz) & x_abs_pz == y_abs_pz ~ 0 + 0 * x_pz + 0 * y_pz , even(x_pz) & even(y_pz) & x_abs_pz > y_abs_pz ~ 0 + 1 * x_pz + -1 * y_pz , odd(x_pz) & even(y_pz) & x_abs_pz > y_abs_pz ~ 0 + 1 * x_pz + 1 * y_pz , odd(x_pz) & even(y_pz) & x_abs_pz < y_abs_pz ~ 0 + 1 * x_pz + 1 * y_pz , even(x_pz) & odd(y_pz) & x_abs_pz == y_abs_pz ~ 0 + 2 * x_pz + 0 * y_pz , even(x_pz) & odd(y_pz) & x_abs_pz < y_abs_pz ~ 1 + 1 * x_pz + 1 * y_pz , even(x_pz) & odd(y_pz) & x_abs_pz > y_abs_pz ~ 1 + 1 * x_pz + 1 * y_pz , odd(x_pz) & even(y_pz) & x_abs_pz == y_abs_pz ~ 1 + 2 * x_pz + 0 * y_pz ) }