<?php /** * Negabase * To convert a decimal to negative base. * Divide the number by the negative base. * Acquire the whole number quotient and remainder. * If the remainder is negative, add 1 to the quotient and add the absolute value of the base to the remainder. * Divide the quotient by the negative base... rinse and repeat until the quotient is 0. * Aggregate the remainders in reverse (as a stack), and you have your negative base representation. */ function negative_base ($decimal, $base) { // initialise a digit stack $digits = []; // divide the decimal by the base repeatedly until the quotient is 0 while ($decimal != 0) { // how many of the base exist in the quotient? $quotient = intval($decimal / $base); // modulus can return negative numbers $remainder = $decimal % $base; // negative base numbers do not have negative digits // if we get a negative remainder from the modulus // all we have to do is increment the quotient // and add the absolute value of the base to the remainder // This works because: // (a/b = q r) -> (b*q + r = a) where // a => numerator, // b => denominator, // q => quotient, // r => remainder // If we get a negative remainder, we can just increment the quotient multiplying the denominator // giving us a number greater than the numerator // Subtracting this number from the numerator gives us a positive remainder // For example: (-5 / -2) => (2 r:-1) => (3 r:1) because [3 * -2 = -6 -> -6 + 1 -5 -> r:1] if ($remainder < 0) { $quotient += 1; $remainder += (-1 * $base); } // repeat the division using the new quotient $decimal = $quotient; // push the current number onto the stack array_unshift($digits, $remainder); } return $digits; } $number = 42; $base = -2; $negative_base_number = negative_base($number, $base);