Отрицательная база - Negative base
Системы счисления |
---|
Индусско-арабская система счисления |
Восточная Азия |
Европейский |
Американец |
По алфавиту |
Бывший |
Позиционные системы от база |
Нестандартные позиционные системы счисления |
Список систем счисления |
А отрицательная база (или отрицательный основание ) может использоваться для построения нестандартная позиционная система счисления. Подобно другим системам с позиционными ценностями, каждая позиция имеет мощность, кратную соответствующей мощности основы системы; но это основание отрицательное, то есть основание б равно −r для некоторого натурального числа р (г ≥ 2).
Системы с отрицательным основанием могут содержать все те же числа, что и стандартные системы с разрядными значениями, но как положительные, так и отрицательные числа представлены без использования знак минус (или, в компьютерном представлении, знаковый бит ); этому преимуществу противостоит повышенная сложность арифметических операций. Необходимость хранить информацию, обычно содержащуюся в отрицательном знаке, часто приводит к тому, что отрицательное базовое число оказывается на одну цифру длиннее, чем его положительный эквивалент.
Общие названия для позиционных систем счисления с отрицательным основанием образованы префикс отрицательный названию соответствующей положительно-базовой системы; Например, негадецимальный (основание -10) соответствует десятичная дробь (база 10), негабаритный (по основанию −2) в двоичный (база 2), отрицательный (основание −3) до тройной (база 3), и четвертичный (основание -4) до четвертичный (база 4).[1][2]
пример
Рассмотрим, что подразумевается под представлением 12243 в негадецимальной системе, основание которой б равно -10:
(−10)4 = 10,000 | (−10)3 = −1,000 | (−10)2 = 100 | (−10)1 = −10 | (−10)0 = 1 |
1 | 2 | 2 | 4 | 3 |
Поскольку 10,000 + (−2,000) + 200 + (−40) + 3 = 8,163, представление 12,243−10 в негадецимальной системе счисления эквивалентно 8,16310 в десятичной системе счисления, а −8,16310 в десятичной форме будет написано 9,977−10 в негадецимальной системе.
История
Отрицательные числовые основы впервые были рассмотрены Витторио Грюнвальд в монографии 1885 г., опубликованной в Математические площади Баттаглини.[3] Грюнвальд дал алгоритмы для выполнения сложения, вычитания, умножения, деления, извлечения корня, проверки делимости и преобразования системы счисления. Отрицательные основания позже упоминались мимоходом. А. Дж. Кемпнер в 1936 г.[4] и более подробно изучен Здислав Павляк и А. Вакулич в 1957 г.[5]
Negabinary был реализован в начале Польский компьютер BINEG (и UMC ), построенный в 1957–59 гг. по идеям З. Павляка и А. Лазаркевича из Математический институт в Варшава.[6] С тех пор реализации были редкостью.
Обозначения и использование
Обозначая базу как −r, каждые целое число а можно записать однозначно как
где каждая цифра dk целое число от 0 до р − 1 и первая цифра dп является > 0 (если только п = 0). База −r расширение а затем задается строкой dпdп−1...d1d0.
Таким образом, системы с отрицательной базой можно сравнить с представление цифр со знаком, такие как сбалансированный тройной, где система счисления положительна, но цифры взяты из частично отрицательного диапазона. (В таблице ниже цифра значения -1 записана как одиночный символ T.)
Некоторые числа имеют одинаковое представление в базе −r как в базе р. Например, числа от 100 до 109 имеют одно и то же представление в десятичной и негадецимальной системе. Так же,
и представлен 10001 в двоичном и 10001 в негабинарном.
Некоторые числа с их разложениями в ряд положительных и соответствующих отрицательных оснований:
Десятичная дробь | Негадецимальный | Двоичный | Негабаритный | Троичный | Негативный | Сбалансированный троичный | Отрицательный сбалансированный троичный | Четвертичный | Negaquaternary |
---|---|---|---|---|---|---|---|---|---|
−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 | 1Т | −10 | 10 |
−3 | 17 | −11 | 1101 | −10 | 10 | T0 | 10 | −3 | 11 |
−2 | 18 | −10 | 10 | −2 | 11 | Т1 | 11 | −2 | 12 |
−1 | 19 | −1 | 11 | −1 | 12 | Т | Т | −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 | 1Т | TT | 2 | 2 |
3 | 3 | 11 | 111 | 10 | 120 | 10 | T0 | 3 | 3 |
4 | 4 | 100 | 100 | 11 | 121 | 11 | Т1 | 10 | 130 |
5 | 5 | 101 | 101 | 12 | 122 | 1TT | 11 т | 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 | 10 т | 10 т | 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 | 11 т | 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, записывая неотрицательные остатки в , и объединение этих остатков, начиная с последнего. Обратите внимание, что если а / б является c с остатком d, тогда до н.э + d = а и поэтому d = а − до н.э. Чтобы получить правильную конверсию, значение для c должен быть выбран так, чтобы d неотрицательна и минимальна. Это проиллюстрировано в четвертой строке следующего примера, в котором –5 ÷ –3 должно быть выбрано, чтобы равняться 2 остатку 1 вместо 1 остатка 2.
Например, чтобы преобразовать 146 из десятичной дроби в отрицательную:
Читая остатки назад, мы получаем отрицательное представление 14610: 21102–3.
- Доказательство: (((2 · (–3) + 1) · (–3) + 1) · (–3) + 0) · (–3) + 2 = 14610.
Обратите внимание, что в большинстве языки программирования, результат (в целочисленной арифметике) деления отрицательного числа на отрицательное число округляется до 0, обычно оставляя отрицательный остаток. В таком случае мы имеем а = (−р)c + d = (−р)c + d − р + р = (−р)(c + 1) + (d + р). Потому что |d| < р, (d + р) положительный остаток. Следовательно, чтобы получить правильный результат в таком случае, компьютерные реализации вышеуказанного алгоритма должны добавить 1 и р к частному и остатку соответственно.
Пример кода реализации
В негабинарный
C #
статический строка ToNegabinary(int ценность){ строка результат = строка.Пустой; в то время как (ценность != 0) { int остаток = ценность % -2; ценность = ценность / -2; если (остаток < 0) { остаток += 2; ценность += 1; } результат = остаток.Нанизывать() + результат; } вернуть результат;}
C ++
авто to_negabinary(int ценность){ стандартное::битсет<размер(int) * CHAR_BIT > результат; стандартное::size_t bit_position = 0; в то время как (ценность != 0) { const авто div_result = стандартное::div(ценность, -2); если (div_result.rem < 0) ценность = div_result.quot + 1; еще ценность = div_result.quot; результат.набор(bit_position, div_result.rem != 0); ++bit_position; } вернуть результат;}
К отрицательному
C #
статический строка отрицательный(int ценность){ строка результат = строка.Пустой; в то время как (ценность != 0) { int остаток = ценность % -3; ценность = ценность / -3; если (остаток < 0) { остаток += 3; ценность += 1; } результат = остаток.Нанизывать() + результат; } вернуть результат;}
Visual Basic .NET
Частный Общий Функция ToNegaternary(ценность Так как Целое число) Так как Строка Тусклый результат Так как Строка = Строка.Пустой В то время как ценность <> 0 Тусклый остаток Так как Целое число = ценность Мод -3 ценность /= -3 Если остаток < 0 потом остаток += 3 ценность += 1 Конец Если результат = остаток.Нанизывать() & результат Конец В то время как Вернуть результатКонец Функция
Python
def отрицательный(я: int) -> ул: "" "От десятичной дроби к отрицательной." "" если я == 0: цифры = ["0"] еще: цифры = [] в то время как я != 0: я, остаток = divmod(я, -3) если остаток < 0: я, остаток = я + 1, остаток + 3 цифры.добавить(ул(остаток)) вернуть "".присоединиться(цифры[::-1])
>>> отрицательный(1000)'2212001'
Common Lisp
(defun отрицательный (я) (если (нулевой я) "0" (позволять ((цифры "") (rem 0)) (петля в то время как (не (нулевой я)) делать (прогноз (набор с несколькими значениями (я rem) (обрезать я -3)) (когда (минус rem) (incf я) (incf rem 3)) (setf цифры (соединять 'строка (запись в строку rem) цифры)))) цифры)))
К любой отрицательной базе
Ява
общественный Строка negativeBase(int целое число, int база) { Строка результат = ""; int количество = целое число; в то время как (количество != 0) { int я = количество % база; количество /= база; если (я < 0) { я += Математика.пресс(база); количество++; } результат = я + результат; } вернуть результат;}
AutoLisp
из интервала [-10 -2]:
(defun негабаза (число баз / копать землю первый) ;; NUM - любое число. BAZ - любое число в интервале [-10, -2]. ;; ;; NUM и BAZ будут усечены до целого числа, если они являются плавающими (например, 14.25 ;; будет усечено до 14, -123456789,87 до -123456789 и т. д.). (если (и (числоp число) (числоp баз) (<= (исправить баз) -2) (> (исправить баз) -11)) (прогноз (setq баз (плавать (исправить баз)) число (плавать (исправить число)) копать землю (если (= число 0) "0" "")) (в то время как (/= число 0) (setq первый (- число (* баз (setq число (исправить (/ число баз)))))) (если (минус первый) (setq число (1+ число) первый (- первый баз))) (setq копать землю (strcat (итоа (исправить первый)) копать землю))) копать землю) (прогноз (незамедлительный (cond ((и (не (числоp число)) (не (числоp баз))) «Неправильный номер и негабаза».) ((не (числоp число)) "Неправильный номер.") ((не (числоp баз)) "Неправильная негабаза".) (т «Негабаза должна быть внутри интервала [-10 -2]».))) (принц))))
PHP
Преобразование целого числа в некоторую отрицательную базу:
функция toNegativeBase($ нет, $ base){ $ цифры = массив(); $ base = Intval($ base); в то время как ($ нет != 0) { $ temp_no = $ нет; $ нет = Intval($ temp_no / $ base); $ остаток = ($ temp_no % $ base); если ($ остаток < 0) { $ остаток += пресс($ base); $ нет++; } array_unshift($ цифры, $ остаток); } вернуть $ цифры;}
Visual Basic .NET
Функция toNegativeBase(Число Так как Целое число , база Так как Целое число) Так как Система.Коллекции.Универсальный.Список(Из Целое число) Тусклый цифры Так как Новый Система.Коллекции.Универсальный.Список(Из Целое число) в то время как Число <> 0 Тусклый остаток Так как Целое число= Число Мод база Число = CInt(Число / база) если остаток < 0 тогда остаток += система.математика.пресс(база) Число+=1 конец если цифры.Вставить(0, остаток) конец в то время как вернуть цифрыконец функция
Расчет ярлыка
Следующие алгоритмы предполагают, что
- вход доступен в биты и закодирован в (основание +2; цифры в ) (как и в большинстве современных цифровых компьютеров),
- есть операции добавления (+) и xor (^), которые работают с такими битовыми строками (как в большинстве современных цифровых компьютеров),
- набор выходных цифр стандартное, т.е. е. с базой ,
- вывод кодируется в том же формате битовой строки, но значение мест другое.
В негабинарный
Преобразование в негабаритный (основание −2; цифры в ) позволяет замечательный ярлык (реализация C):
беззнаковый int toNegaBinary(беззнаковый int ценность) // ввод в стандартном двоичном формате{ беззнаковый int Schroeppel2 = 0xAAAAAAAA; // = 2/3*((2*2)^16-1) = ...1010 вернуть (ценность + Schroeppel2) ^ Schroeppel2; // Эксклюзивный или // результирующее целое число без знака интерпретируется как строка элементов ε {0,1} (биты)}
Благодаря Д. Либрику (Судзику). Поразрядная часть XOR изначально связана с Schroeppel (1972).[7]
Порт JavaScript для того же вычисления ярлыка:
функция toNegaBinary(количество) { вар Schroeppel2 = 0xAAAAAAAA; // преобразовать в отрицательную двоичную строку вернуть ( ( количество + Schroeppel2 ) ^ Schroeppel2 ).нанизывать(2);}
К четвертичным
Преобразование в четвертичный (основание −4; цифры в ) позволяет аналогичный ярлык (реализация C):
беззнаковый int toNegaQuaternary(беззнаковый int ценность) // ввод в стандартном двоичном формате{ беззнаковый int Schroeppel4 = 0xCCCCCCCC; // = 4/5*((2*4)^8-1) = ...11001100 = ...3030 вернуть (ценность + Schroeppel4) ^ Schroeppel4; // Эксклюзивный или // результирующее целое число без знака интерпретируется как строка элементов ε {0,1,2,3} (пары битов)}
Порт JavaScript для того же вычисления ярлыка:
функция toNegaQuaternary(количество) { вар Schroeppel4 = 0xCCCCCCCC; // Преобразовать в NegaQuaternary String вернуть ( ( количество + Schroeppel4 ) ^ Schroeppel4 ).нанизывать(4);}
Арифметические операции
Ниже описаны арифметические операции для негабинарных чисел; вычисления в более крупных базах аналогичны.
Дополнение
Сложение негабинарных чисел происходит поразрядно, начиная с младшие значащие биты; биты из каждого слагаемого суммируются с (сбалансированный тройной ) переносятся из предыдущего бита (0 в младшем разряде). Эта сумма затем разлагается на выходной бит и переносится на следующую итерацию, как показано в таблице:
Сумма | Вывод | Комментарий | |||
---|---|---|---|---|---|
Немного | Нести | ||||
−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
Негабинарный полный сумматор
А полный сумматор Схема может быть разработана для сложения чисел в отрицательной системе. Для расчета суммы и переносов используется следующая логика:[8]
Увеличение негабинарных чисел
Увеличение негабинарного числа можно выполнить по следующей формуле:[9]
Вычитание
Чтобы вычесть, умножьте каждый бит второго числа на -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).
Унарное отрицание, −Икс, может быть вычислено как двоичное вычитание из нуля, 0 − Икс.
Умножение и деление
Сдвиг влево умножается на -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, чтобы получить новый нести, а полученный бит - как остаток.
Сравнение негабинарных чисел
Можно сравнить негабинарные числа, немного изменив обычное беззнаковое число. двоичный компаратор. При сравнении чисел и , инвертируйте каждый нечетный бит обоих чисел. и с использованием стандартного компаратора без знака.[10]
Дробные числа
База −r представление, конечно, может осуществляться за пределы точка счисления, позволяющий представлять нецелые числа.
Как и в случае систем с положительным основанием, завершающие представления соответствуют дробям, знаменатель которых является степенью основания; повторяющиеся представления соответствуют другим рациональным числам и по той же причине.
Неуникальные представления
В отличие от систем с положительным основанием, где целые числа и завершающие дроби имеют неуникальные представления (например, в десятичном 0.999... = 1 ) в системах с отрицательной базой целые числа имеют только одно представление. Однако существуют рациональные числа с неуникальными представлениями. Для цифр {0, 1, ..., т} с участием самая большая цифра и
у нас есть
- а также
Итак, каждое число с конечная дробь Added имеет два различных представления.
Например, в негативном, т.е. и , есть
- .
Такие неуникальные представления можно найти, рассматривая наибольшее и наименьшее возможные представления с целыми частями 0 и 1 соответственно, а затем отмечая, что они равны. (На самом деле, это работает с любой системой с целочисленной базой.) Рациональные числа, таким образом, не однозначно выражаемые, имеют вид
с участием
Воображаемая база
Так же, как использование отрицательной базы позволяет представлять отрицательные числа без явного отрицательного знака, с помощью воображаемый база позволяет представить Гауссовские целые числа. Дональд Кнут предложил четвертичная мнимая база (база 2i) в 1955 году.[11]
Смотрите также
- Четвертичная мнимая база
- Двоичный
- Сбалансированный тройной
- Четвертичная система счисления
- Системы счисления
- 1 − 2 + 4 − 8 + ⋯ (p-адические числа )
использованная литература
- ^ Кнут, Дональд (1998), Искусство программирования, Том 2 (3-е изд.), Стр. 204–205.. Кнут упоминает как негабаритные, так и негадецимальные числа.
- ^ Негативная система кратко обсуждается в Петковшек, Марко (1990), «Неоднозначные числа плотны», Американский математический ежемесячник, 97 (5): 408–411, Дои:10.2307/2324393, ISSN 0002-9890, JSTOR 2324393, Г-Н 1048915.
- ^ Витторио Грюнвальд. Intorno all'aritmetica dei sistemi numerici базовое отрицание с определенным ригидом al sistema numerico базовое отрицательно-десятичное значение для студии delle sue analogie coll'aritmetica ordinaria (decimale), Математические площади Баттаглини (1885), 203-221, 367
- ^ Кемпнер, А. Дж. (1936), «Анормальные системы счисления», Американский математический ежемесячный журнал, 43 (10): 610–617, Дои:10.2307/2300532, JSTOR 2300532, Г-Н 1523792. Единственная ссылка на отрицательные основания - это сноска на странице 610, которая гласит: «Положительные числа меньше 1 и отрицательные числа могут использоваться в качестве оснований с небольшими изменениями процесса и подходящими ограничениями на набор используемых цифр».
- ^ Pawlak, Z .; Вакулич, А. (1957), "Использование разложений с отрицательным основанием в арифмометре цифрового компьютера", Bulletin de l'Académie Polonaise des Sciences, Класс III, 5: 233–236.
- ^ Марчинский, Р. В., «Первые семь лет польской вычислительной техники» В архиве 2011-07-19 на Wayback Machine, IEEE Annals of the History of Computing, Vol. 2, № 1, январь 1980 г.
- ^ См. Ссылку MathWorld Negabinary
- ^ Фрэнсис, Ю; Суганда, Джутамулия; Шизухуо, Инь (4 сентября 2001 г.). Введение в информационную оптику. Академическая пресса. п. 498. ISBN 9780127748115.
- ^ «Архивная копия». Получено 2016-08-29.
- ^ Муругесан, Сан (1977). «Отрицательные арифметические схемы с использованием двоичной арифметики». Журнал IEE по электронным схемам и системам. 1 (2): 77. Дои:10.1049 / ij-ecs.1977.0005.
- ^ Д. Кнут. Искусство программирования. Том 2, 3-е издание. Эддисон-Уэсли. С. 205, "Позиционные системы счисления"
дальнейшее чтение
- Уоррен-младший, Генри С. (2013) [2002]. Хакерское наслаждение (2-е изд.). Эддисон Уэсли - Pearson Education, Inc. ISBN 978-0-321-84268-8. 0-321-84268-5.