A отрицательное основание (или отрицательное основание ) может быть используется для построения нестандартной позиционной системы счисления. Подобно другим системам с позиционными ценностями, каждая позиция имеет мощность, кратную соответствующей мощности основы системы; но это основание отрицательное, то есть основание b равно −r для некоторого натурального числа r (r ≥ 2).
В системах с отрицательным основанием могут использоваться все те же числа, что и в стандартных системах с разрядными значениями, но как положительные, так и отрицательные числа представлены без использования знака минус (или, в компьютерном представлении, знаковый бит ); этому преимуществу противостоит повышенная сложность арифметических операций. Необходимость хранить информацию, обычно содержащуюся в отрицательном знаке, часто приводит к тому, что отрицательное базовое число оказывается на одну цифру длиннее, чем его эквивалент с положительным основанием.
Общие имена для позиционных систем счисления с отрицательным основанием образуются с помощью префикса отрицательного- к имени соответствующей системы с положительным основанием; например, негадецимальный (основание -10) соответствует десятичному (основанию 10), негабаритному (основание -2) к двоичному ( основание 2), отрицательное (основание -3) до тройное (основание 3) и отрицательное (основание -4) до четвертичное (основание 4).
Рассмотрим, что подразумевается под представлением 12243 в негадецимальной системе с основанием b -10:
(-10) = 10,000 | (-10) = -1,000 | (−10) = 100 | (−10) = −10 | (−10) = 1 |
1 | 2 | 2 | 4 | 3 |
Поскольку 10000 + (−2000) + 200 + (−40) + 3 = 8,163, представление 12,243 −10 в негадецимальной системе счисления эквивалентно 8,163 10 в десятичной системе счисления, тогда как -8,163 10 в десятичной системе счисления будет записано 9,977 -10 в негадецимальной системе счисления.
Отрицательные числовые основы были впервые рассмотрены Витторио Грюнвальдом в монографии 1885 года, опубликованной в Giornale di Matematiche di Battaglini. Грюнвальд дал алгоритмы для выполнения сложения, вычитания, умножения, деления, извлечения корня, проверки делимости и преобразования системы счисления. Отрицательные основания были позже упомянуты мимоходом А. Я. Кемпнер в 1936 г. и более подробно изученный Здиславом Павляком и А. Вакуличем в 1957 г.
Negabinary был реализован в раннем польском компьютере ( и UMC ), построенный в 1957–59 гг. на основе идей З. Павляка и А. Лазаркевича из Варшавы. С тех пор реализации были редкостью.
Обозначая основание как -r, каждое целое число a может быть записано однозначно как
, где каждая цифра d k является целым числом от 0 до r - 1, а первая цифра d n равна>0 (если n = 0). Расширение base -r a затем задается строкой d ndn-1... d 1d0.
Таким образом, системы с отрицательным основанием можно сравнить с представлениями цифр со знаком, например, сбалансированный троичный, где основание системы счисления положительное, но цифры берутся из частично отрицательного диапазона. (В таблице ниже цифра значения -1 записана как одиночный символ T.)
Некоторые числа имеют такое же представление в базе -r, что и в базе r. Например, числа от 100 до 109 имеют одно и то же представление в десятичной и негадецимальной системе. Аналогичным образом
и представлен 10001 в двоичном и 10001 в негабинарном.
Некоторые числа с их расширениями в число положительных и соответствующих отрицательных оснований:
Десятичное | Негадецимальное | Двоичное | Отрицательное | Тернар | Негатернар | Сбалансированный тройной | Отрицательный сбалансированный тройной | Четвертичный | Негатернарный |
---|---|---|---|---|---|---|---|---|---|
−15 | 25 | −1111 | 110001 | −120 | 1220 | T110 | 11T0 | −33 | 1301 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
−5 | 15 | −101 | 1111 | −12 | 21 | T11 | TT1 | −11 | 23 |
−4 | 16 | −100 | 1100 | −11 | 22 | TT | 1T | −10 | 10 |
−3 | 17 | −11 | 1101 | - 10 | 10 | T0 | 10 | −3 | 11 |
−2 | 18 | −10 | 10 | −2 | 11 | T1 | 11 | −2 | 12 |
−1 | 19 | −1 | 11 | −1 | 12 | T | T | −1 | 13 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | 2 | 10 | 110 | 2 | 2 | 1T | TT | 2 | 2 |
3 | 3 | 11 | 111 | 10 | 120 | 10 | T0 | 3 | 3 |
4 | 4 | 100 | 100 | 11 | 121 | 11 | T1 | 10 | 130 |
5 | 5 | 101 | 101 | 12 | 122 | 1TT | 11T | 11 | 131 |
6 | 6 | 110 | 11010 | 20 | 110 | 1T0 | 110 | 12 | 132 |
7 | 7 | 111 | 11011 | 21 | 111 | 1T1 | 111 | 13 | 133 |
8 | 8 | 1000 | 11000 | 22 | 112 | 10T | 10T | 20 | 120 |
9 | 9 | 1001 | 11001 | 100 | 100 | 100 | 100 | 21 | 121 |
10 | 190 | 1010 | 11110 | 101 | 101 | 101 | 101 | 22 | 122 |
11 | 191 | 1011 | 11111 | 102 | 102 | 11T | 1TT | 23 | 123 |
12 | 192 | 1100 | 11100 | 110 | 220 | 110 | 1T0 | 30 | 110 |
13 | 193 | 1101 | 11101 | 111 | 221 | 111 | 1T1 | 31 | 111 |
14 | 194 | 1110 | 10010 | 112 | 222 | 1TTT | TT1T | 32 | 112 |
15 | 195 | 1111 | 10011 | 120 | 210 | 1TT0 | TT10 | 33 | 113 |
16 | 196 | 10000 | 10000 | 121 | 211 | 1TT1 | TT11 | 100 | 100 |
17 | 197 | 10001 | 10001 | 122 | 212 | 1T0T | TT0T | 101 | 101 |
18 | 198 | 10010 | 10110 | 200 | 200 | 1T10 | TTT0 | 102 | 102 |
Обратите внимание, что, за исключением отрицательно-симметричной тройной, базовая - r разложения отрицательных целых чисел имеют четное число цифр, в то время как разложения неотрицательных целых чисел по основанию −r имеют нечетное число цифр.
Расширение числа по основанию −r можно найти повторным делением на −r, записав неотрицательные остатки в и объединение этих остатков, начиная с последнего. Обратите внимание: если a / b равно c с остатком d, то bc + d = a и, следовательно, d = a - bc. Чтобы получить правильное преобразование, значение c должно быть выбрано таким, чтобы d было неотрицательным и минимальным. Это проиллюстрировано в четвертой строке следующего примера, где –5 ÷ –3 должно быть выбрано, чтобы равняться 2 остатку 1 вместо 1 остатка 2.
Например, чтобы преобразовать 146 из десятичного числа в отрицательное:
Читая остатки назад, мы получаем отрицательное представление 146 10 : 21102 –3.
Обратите внимание, что в большинстве языков программирования результат (в целочисленной арифметике) деления отрицательного номер по имени Отрицательное число округляется до 0, обычно оставляя отрицательный остаток. В таком случае имеем a = (−r) c + d = (−r) c + d - r + r = (−r) (c + 1) + (d + r). Потому что | d | < r, (d + r) is the positive remainder. Therefore, to get the correct result in such case, computer implementations of the above algorithm should add 1 and r to the quotient and remainder respectively.
статическая строка ToNegabinary (int value) {string result = string.Empty; while (значение! = 0) {int остаток = значение% -2; значение = значение / -2; if (остаток < 0) { remainder += 2; value += 1; } result = remainder.ToString() + result; } return result; }
auto to_negabinary (int value) {std :: bitsetresult; std :: size_t bit_position = 0; while (value! = 0) {const auto div_result = std :: div (value, -2); if (div_result.rem < 0) value = div_result.quot + 1; else value = div_result.quot; result.set(bit_position, div_result.rem != 0); ++bit_position; } return result; }
static string negaternary (int value) {string result = string.Empty; while (value! = 0) { int остаток = значение% -3; значение = значение / -3; if (остаток < 0) { remainder += 3; value += 1; } result = remainder.ToString() + result; } return result; }
Частная общая функция ToNegaternary (значение как целое число) Как строка Тусклый результат Как String = String.Empty While value <>0 Размыть остаток как целое число = значение Mod -3 значение / = -3 Если остаток < 0 Then remainder += 3 value += 1 End If result = remainder.ToString() result End While Return result End Function
def negaternary (i: int) ->str: "" "От десятичного до отрицательного." "" If i = = 0: digits = ["0"] else: digits = while i! = 0: i, остаток = divmod (i, -3), если остаток < 0: i, remainder = i + 1, remainder + 3 digits.append(str(remainder)) return "".join(digits[::-1])
>>>negaternary (1000) '2212001'
(defun negaternary (i) (if (zerop i) "0" (let ((digits "") (rem 0)) (loop while (not (zerop i)) do (progn (multi-value- setq (i rem) (усечь i -3)) (когда (minusp re m) (incf i) (incf rem 3)) (setf digits (concatenate 'string (write-to-string rem) digits)))) digits)))
public String negativeBase (int integer, int base) {String result = ""; int число = целое число; в то время как (число! = 0) {int я = число% базы; число / = база; if (i < 0) { i += Math.abs(base); number++; } result = i + result; } return result; }
из [-10-2] интервала:
(defun negabase (num baz / dig rst) ;; NUM - любое число. BAZ - любое число в интервале [ -10, -2]. ;; ;; NUM и BAZ будут усечены до целого числа, если они являются числами с плавающей запятой (например, 14,25 ;; будет усечено до 14, -123456789,87 до -123456789 и т. Д.). (If (и (numberp num) (numberp baz) (<= (fix baz) -2) (>(fix baz) -11)) (progn (setq baz (float (fix baz)) num (float (fix num)) dig (if (= num 0) "0 "" ")) (while (/ = num 0) (setq rst (- num (* baz (setq num (fix (/ num baz)))))) (if (minusp rst) (setq num (1+ num) rst (- rst baz))) (setq dig (strcat (itoa (fix rst)) dig))) dig) (progn (prompt (cond ((and (not (numberp num)) (not (numberp baz))) "\ nНеверный номер и негабаза.") ((not (numberp num)) "\ nНеверный номер.") ((not (not (numberp baz)) "\ nНеверный негабаза.") (t "\ nНегабаза должна быть внутри [- 10 -2] interval. "))) (Princ))))
Преобразование целого числа в некоторую отрицательную базу:
функция toNegativeBase ($ no, $ base) {$ digits = массив (); $ base = intval ($ base); в то время как ($ no! = 0) {$ temp_no = $ no; $ no = intval ($ temp_no / $ base); $ остаток = ($ temp_no% $ base); if ($ остаток < 0) { $remainder += abs($base); $no++; } array_unshift($digits, $remainder); } return $digits; }
Функция toNegativeBase (число как целое число, основание как целое число) Как System.Collections.Generic.List (Of Integer) Тусклые цифры как новые System.Collections.Generic.List (Of Целое число), а число <>0 Затемнить остаток как целое число = число Модифицировать базовое число = CInt (число / основание), если остаток < 0 then remainder += system.math.abs(base) Number+=1 end if digits.Insert(0, remainder) end while return digits end function
Следующие алгоритмы предполагают, что
Преобразование в негабинарный (основание -2; цифры в ) позволяет использовать замечательный ярлык (реализация C):
unsigned int toNegaBinary (unsigned int value) // ввод в стандартном двоичном формате {unsigned int Schroeppel2 = 0xAAAAAAAA; // = 2/3 * ((2 * 2) ^ 16-1) =... 1010 return (value + Schroeppel2) ^ Schroeppel2; // исключающее ИЛИ // результирующее целое число без знака интерпретируется как строка элементов ε {0,1} (биты)}
Благодаря Д. Либрику (Судзик). Часть побитового XOR изначально связана с Schroeppel (1972).
портом JavaScript для того же вычисления ярлыка:
function toNegaBinary (number) {var Schroeppel2 = 0xAAAAAAAA; // Преобразование в отрицательную двоичную строку return ((число + Schroeppel2) ^ Schroeppel2).toString (2); }
Преобразование в четвертичный (основание -4; цифры в ) позволяет аналогичный ярлык (реализация C):
unsigned int toNegaQuaternary (unsigned int value) // ввод в стандартном двоичном формате {unsigned int Schroeppel4 = 0xCCCCCCCC; // = 4/5 * ((2 * 4) ^ 8-1) =... 11001100 =... 3030 return (value + Schroeppel4) ^ Schroeppel4; // исключающее ИЛИ // результирующее целое число без знака, которое будет интерпретировано как строка элементов ε {0,1,2,3} (пары битов)}
Порт JavaScript для того же вычисления ярлыка:
function toNegaQuaternary (number) {var Schroeppel4 = 0xCCCCCCCC; // Преобразование в NegaQuaternary String return ((number + Schroeppel4) ^ Schroeppel4).toString (4); }
Ниже описаны арифметические операции для негабинарных чисел; вычисления в более крупных базах аналогичны.
Добавление отрицательных чисел происходит поразрядно, начиная с младших значащих битов ; биты из каждого слагаемого суммируются с переносом (сбалансированной троичной системы ) из предыдущего бита (0 в младшем разряде). Эта сумма затем разлагается на выходной бит и переносится для следующей итерации, как показано в таблице:
Sum | Output | Comment | |||
---|---|---|---|---|---|
Bit | Carry | ||||
−2 | 010 −2 | 0 | 1 | 01−2 | −2 встречается только при вычитании. |
−1 | 011 −2 | 1 | 1 | 01−2 | |
0 | 000 −2 | 0 | 0 | 00−2 | |
1 | 001 −2 | 1 | 0 | 00−2 | |
2 | 110 −2 | 0 | −1 | 11−2 | |
3 | 111 −2 | 1 | −1 | 11−2 | 3 встречается только во время сложения. |
Вторая строка этой таблицы, например, выражает тот факт, что −1= 1+ 1× −2; в пятой строке указано 2= 0+ −1× −2; и т. д.
В качестве примера, чтобы добавить 1010101 −2 (1 + 4 + 16 + 64 = 85) и 1110100 −2 (4 + 16-32 + 64 = 52),
Перенести: 1 −1 0 −1 1 −1 0 0 0 Первое слагаемое: 1 0 1 0 1 0 1 Второе слагаемое: 1 1 1 0 1 0 0 + --- ----------------------- Число: 1 −1 2 0 3 −1 2 0 1 Бит (результат): 1 1 0 0 1 1 0 0 1 Перенести: 0 1 −1 0 −1 1 −1 0 0
, поэтому результат будет 110011001 −2 (1-8 + 16-128 + 256 = 137).
При добавлении двух отрицательных чисел каждый раз, когда создается перенос, дополнительный перенос должен передаваться на следующий бит. Рассмотрим тот же пример, что и выше
Дополнительный перенос: 1 1 0 1 0 0 0 Перенос: 1 0 1 1 0 1 0 0 0 Первое добавление: 1 0 1 0 1 0 1 Второе добавление: 1 1 1 0 1 0 0 + -------------------------- Ответ: 1 1 0 0 1 1 0 0 1
A схема полного сумматора может быть сконструирована для сложения чисел в отрицательной системе. Следующая логика используется для вычисления суммы и переносов:
Увеличение отрицательного числа может выполняется по следующей формуле:
Чтобы вычесть, умножьте каждый бит второго числа на -1 и сложите числа, используя ту же таблицу, что и выше.
В качестве примера для вычисления 1101001 −2 (1-8-32 + 64 = 25) минус 1110100 −2 (4 + 16-32 + 64 = 52),
Перенести: 0 1 −1 1 0 0 0 Первое число: 1 1 0 1 0 0 1 Второе число: −1 −1 −1 0 −1 0 0 + ----- --------------- Число: 0 1 −2 2 −1 0 1 Бит (результат): 0 1 0 0 1 0 1 Перенести: 0 0 1 −1 1 0 0
, поэтому результат будет 100101 −2 (1 + 4 −32 = −27).
Унарное отрицание, −x, может быть вычислено как двоичное вычитание из нуля, 0 - x.
Сдвиг влево умножается на -2, сдвиг вправо делится на -2.
Для умножения умножайте как обычные десятичные или двоичные числа, но используя негабинарные правила для добавления переноса при сложении чисел.
Первое число: 1 1 1 0 1 1 0 Второе число: 1 0 1 1 0 1 1 × ----------------------- -------------- 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 + ------------------------------------- Перенести: 0 −1 0 −1 −1 −1 - 1 −1 0 −1 0 0 Число: 1 0 2 1 2 2 2 3 2 0 2 1 0 Бит (результат): 1 0 0 1 0 0 0 1 0 0 0 1 0 Перенести: 0 −1 0 −1 - 1 -1 -1 -1 0 -1 0 0
Для каждого столбца добавьте перенос к числу и разделите сумму на -2, чтобы получить новый перенос и полученный бит в качестве остатка.
Можно сравнивать отрицательные числа, немного отрегулировав обычный беззнаковый двоичный компаратор . При сравнении чисел и инвертируйте каждый нечетный бит обоих чисел. После этого сравните и с помощью стандартного компаратора без знака.
Базовое представление -r, конечно, может быть перенесено за пределы точки счисления, что позволяет представлять нецелые числа.
Как и в системах с положительным основанием, завершающие представления соответствуют дробям, в которых знаменатель является степенью основания; повторяющиеся представления соответствуют другим рациональным числам и по той же причине.
В отличие от систем с положительным основанием, в которых целые числа и завершающие дроби имеют неуникальные представления (например, в десятичном формате 0,999... = 1 ) в системах с отрицательной базой целые числа имеют только одно представление. Однако существуют рациональные числа с неуникальными представлениями. Для цифр {0, 1,..., t } с самая большая цифра и
у нас
Итак, каждое число с конечной дробью added имеет два различных представления.
Например, в негативном, т.е. и , есть
Такие неуникальные представления можно найти, рассматривая наибольшее и наименьшее возможные представления с целыми частями 0 и 1 соответственно, а затем отмечая, что они равны. (В самом деле, это работает с любой системой с целочисленным основанием.) Таким образом, не однозначно выражаемыми являются рациональные числа формы
с
Так же, как использование отрицательной основы позволяет представлять отрицательные числа без явного отрицательного знака, используя мнимую base позволяет представление целых чисел Гаусса. Дональд Кнут предложил четвертичное мнимое основание (основание 2i) в 1955 году.