Позиционные системы счисления

Позиционное представление

Позиционное представление (positional notation) числа nn по основанию bb — способ представить число nn в виде суммы

n=(a2a1a0.a1a2)b=+a2b2+a1b+a0+a1b1+a2b2+n = \bigl( \dotsm \, a_2 \, a_1 \, a_0 \, . \, a_{-1} \, a_{-2} \, \dotsm \bigr)_b = \dotsb + a_2 \cdot b^2 + a_1 \cdot b + a_0 + a_{-1} \cdot b^{-1} + a_{-2} \cdot b^{-2} + \dotsb

Например, число (173.4)8=182+78+3+481=123.5(173.4)_8 = 1 \cdot 8^2 + 7 \cdot 8 + 3 + 4 \cdot 8^{-1} = 123.5.

Позиционное представление, вопреки школьному запрету, может существовать для любых действительных оснований. Числа aka_k называются цифрами в этой системе счисления, и для всех них всегда верно неравенство 0ak<b0 \le a_k < b. Это гарантирует единственность позиционного представления.

Из позиционного представления неотрицательного числа n=(a2a1a0.a1a2)bn = \bigl( \dotsm \, a_2 \, a_1 \, a_0 \, . \, a_{-1} \, a_{-2} \, \dotsm \bigr)_b можно сразу выделить значение произвольного aka_k

ak=nbkmodba_k = \left\lfloor \frac{n}{b^k} \right\rfloor \bmod b

Перевод

Между представлением чисел в системах счисления по основанию bb и по основанию bkb^k есть простая связь

(a2a1a0.a1a2)b=(A2A1A0.A1A2)bk\bigl( \dotsm \, a_2 \, a_1 \, a_0 \, . \, a_{-1} \, a_{-2} \, \dotsm \bigr)_b = \bigl( \dotsm \, A_2 \, A_1 \, A_0 \, . \, A_{-1} \, A_{-2} \, \dotsm \bigr)_{b^k}
Aj=(akj+k1akj+k2akj+2akj+1akj)bA_j = \bigl( a_{kj+k-1} \, a_{kj+k-2} \, \dotsm \, a_{kj+2} \, a_{kj+1} \, a_{kj} \bigr)_b

Для перевода из десятичной системы счисления нужно последовательно делить с остатком dd целую часть числа nn на основание системы bb, а дробную часть nn умножать на bb. Возьмём число 42.12542.125 и представим его в шестнадцатеричной системе счисления:

42/16=2d=10=A2/16=0d=20.12516=2\begin{aligned}42 / 16 = 2 \quad &d = 10 = A \\ 2 / 16 = 0 \quad &d = 2 \\ 0.125 \cdot16 &= 2\end{aligned}

Зписываем остатки от деления целой части в обратном порядке, а целые части от умножения дробной — в прямом и получаем

42.12510=2A.21642.125_{10} = 2A.2_{16}

Этот алгоритм на псевдокоде:

function convert_to(int num, int base) -> string: table[char] chars = ['0', ..., '9', 'A', ..., 'Z'] string ans = "" do: ans = chars[num % base] + ans num /= base while num > 0 return ans

Измерение информации

Количество разрядов в bb-ричном представлении числа N вычисляется по следующей формуле:

logb(N)+1\lfloor log_b (N) \rfloor + 1

Домножив результат на основание, мы получим цену представления числа NN в bb-ричной системе счисления.

E(b,N)=blogb(N)+1E \left( b, N \right) = b \lfloor log_b(N) + 1 \rfloor

Чем меньше значение E — тем оптимальнее основание для представления числа. С увеличением NN оптимальное основание будет меняться.

Отрицательное основание

Мы привыкли к системам счисления с натуральными основаниями (2,10,16)(2, 10, 16), но ничто не мешает нам взять за основание и отрицательное число, это называется нега-позиционной системой счисления. Например, число с основанием 10-10 будет выглядеть так:

n=(a2a1a0.a1a2)10=+a2100+a1(10)+a0+a110+a2100+n = \bigl( \dotsm \, a_2 \, a_1 \, a_0 \, . \, a_{-1} \, a_{-2} \, \dotsm \bigr)_{-10} = \dotsb + a_2 \cdot 100 + a_1 \cdot (-10) + a_0 + \frac{a_{-1}}{-10} + \frac{a_{-2}}{100} + \dotsb

Несложно заметить, что на каждом чётном разряде множитель положительный, а на каждом нечётном — отрицательный. Благодаря этому в нега-позиционной системе счисления можно беззнаково представить как положительное так и отрицательное число.

Перевод из десятичной в нега-позиционную систему счисления работает точно так же, как и в системах с натуральным основанием.

Сложение в столбик в нега-позиционных системах счисления происходит так же, как и в привычных нам, но с одним нюансом. Если при сложении в каком-то разряде получается число большее или равное основанию, то в разряд записывается число единиц, а из левого разряда вычитается 11.

123+113103\frac{\align{12_{-3} \\ +11_{-3}}} {10_{-3}}

Если старшего разряда разряда нет, то слева приписывается 11 и максимальная цифра системы счисления.

8610+4710191310\frac{\align{86_{-10} \\ +47_{-10}}} {1913_{-10}}

Для вычитания аналогично.

Нега-позиционная система счисления с основанием 2-2 использовалась в польских электронно-вычислительных машинах 50-х годов: SKRZAT 1 и BINEG.

Симметричные системы счисления

Пожалуй, одной из самых известных систем счисления является симметрично-троичная, то есть использующая цифры 1-1, 00 и 11 вместо 00, 11 и 22. Обозначим 1-1 как 1ˉ\bar{1}. Такая система счисления имеет несколько примечательных свойств:

  1. Обратное по сложению число можно получить взаимной заменой 11 и 1ˉ\bar{1}

  2. Знак числа определяется знаком старшего разряда

  3. Для округления до ближайшего целого нужно просто отбросить дробную часть

Для перевода числа в симметрично-троичную систему счисления нужно сначала перевести его в троичную, добавить к нему число, состоящее из бесконечного количества единиц, и уменьшить каждую цифру на единицу.

208.310=(21201.022002200220)3(1210012.21012101)3208.310=(101ˉ1ˉ01.101ˉ0101ˉ01)3\align{208.3_{10} = &\bigl( 21201.022002200220 \cdots \bigr)_3 \\ &\bigl( \cdots 1210012.21012101 \cdots \bigr)_3 \\ 208.3_{10} = &\bigl( 10\bar{1}\bar{1}01.10\bar{1}010\bar{1}01 \cdots \bigr)_3}

Если при сложении разряд переполняется, то в него записывается 1ˉ\bar{1}, а к левому добавляется 11.

11ˉ03+100311ˉ1ˉ03\frac{\align{1\bar{1}0_3 \\ + 100_3}}{1\bar{1}\bar{1}0_3}

В остальном арифметические операции в симметрично-троичной системе ничем не отличаются от стандартных.

В сороковых годах прошлого века, когда первые компьютеры были только в разработке, симметричная троичная система наравне с двоичной рассматривалась как альтернатива десятичной. Электронные схемы для троичной логики не сильно сложнее двоичной, зато для представления числа количество разрядов равно log32\log_3{2}, то есть примерно 6363% от количества разрядов для этого же числа в двоичной. Симметрично-троичная система счисления испоьлзовалась в советсвкой вычислительной машине СЕТУНЬ.

Рациональное основание

Если взять за основание рациональное число b>1b > 1, а как цифры все числа меньше bb, то получится система, поздоляющая представлять дроби с высокой точностью, что может быть критически важно во многих ситуациях, например, при сжатии данных.

Иррациональное основание

Иррациональное основание системы счисления позволяет записывать бесконечные дроби конечным количеством знаков без потери точности, а так же применять различные свойства так часто используемых в математике констант. Многие такие системы являются избыточными, то есть количество цифр в них больше основания. Рассмотрим несколько примечательных иррациональных оснований:

Корневое основание

Такие основания позволяют представлять числа из расширения поля Q[nk]\QQ[\sqrt[k]{n}]. В системе с основанием равным корню kk-той степени кажый kk-тый разряд обозначает натуральное число, остальные — иррациональные. Применение этому можно найти в геометрии. Например, диагональ квдарата со стороной 11 равна 10210_{\sqrt{2}}, а площадь правильного восьмиугольника c единичной стороной равняется 110021100_{\sqrt{2}}.

Если при сложении в разряде получается число b2\ge b^2, то единица добавляется к kk-му разряду слева.

1012+112100102\frac{\align{101_{\sqrt{2}} \\ + \quad 11_{\sqrt{2}}}} {10010_{\sqrt{2}}}

Система Бергмана

Придуманная американским математиком Джорджом Бергманом система (также называемая фиеричной) в кажестве основания использует число ϕ\vphi. Напомню, что

ϕ2=ϕ+1,ϕ=5+12\vphi^2 = \vphi + 1, \quad \vphi = \frac{\sqrt{5} + 1}{2}

Из этого следует очень интересное свойство такой системы счисления:

100ϕ=11ϕ100_{\vphi} = 11_{\vphi}

Система Бергмана позволяет записать любое натуральное число конечным количеством цифр, причём для всех, кроме единицы, в записи будут цифры после запятой и при этом в ней не будет двух идущих подряд единиц.

Перевод из десятичного основания в фиеричное также довольно экзотичен. Зная запись числа nn, можно выразить n+1n+1 таким образом: если нулевой разряд в nn равен нулю, то прибаляем единицу и нормализуем запись, то есть избавляемся от повторяющихся единиц вышеуказанным свойством. Если же в нулевом разряде находится единица, то нужно денормализовать число так, чтобы нулевой разряд стал нулём, а потом выполнить предыдущий шаг.

110=1ϕ=0.11ϕ210=1.11ϕ=10.01ϕ310=11.01ϕ=100.01ϕ\align{&1_{10} = 1_{\vphi} = 0.11_{\vphi} \\ &2_{10} = 1.11_{\vphi} = 10.01_{\vphi} \newline&3_{10} = 11.01_{\vphi} = 100.01_{\vphi}}

Из-за того, что 1ϕ+1ϕ=10.01ϕ1_{\vphi} + 1_{\vphi} = 10.01_{\vphi} используемое всё время до этого сложение в столбик с переносом разрядов попросту не работает. Алгоритм суммирования здесь следующий: нужно суммировать числа, не перенося разряды, а после этого результат разбивать на другую сумму, денормализовывать, снова суммировать и приводить к нормальному виду.

10.01ϕ+101.01ϕ111.02ϕ111.02ϕ=1001.01ϕ+0.01ϕ=1001.0011ϕ+0.01ϕ=1001.0111ϕ=1010.0001ϕ\frac{\align{10.01_{\vphi} \\ + 101.01_{\vphi}}}{111.02_{\vphi}}\\[0.4em]111.02_{\vphi} = 1001.01_{\vphi} + 0.01_{\vphi} = 1001.0011_{\vphi} + 0.01{\vphi} = 1001.0111_{\vphi} = 1010.0001_{\vphi}

Умножение в системе счисления Бергмана рабоатет точно так же, как и в двоичной.

Фиеричная система счисления может быть полезна в вычислениях, связанных с золотым сечением.

Основание ee

Используя число Эйлера как основание системы, мы не сможем записывать натуральные числа конечным количеством цифр, зато такая система будет иметь высокую точность в операциях с иррациональными числами. Из формулы цены представления числа NN в системе с основанием bb

E(b,N)=blogb(N)+1E \left( b, N \right) = b \lfloor log_b(N) + 1 \rfloor

следует, что основание ee является самым экономичным, то есть использует оптимальное количество цифр относительно длины числа.

Перевод в ee-ричную систему счисления осуществляется так же, как и в систему с натуральным основанием. Единственное отличие — это необходимость заранее определить точность, чтобы иметь возможность получить остаток от деления на иррациональное число.

Мнимое и комплексное основания

Рассмотрим мнимочетверичную систему счисления, то есть с основанием 2i2i:

(a3a2a1a0.a1a2a3)2i=(a2a0a2)4+2i(a3a1a1a3)4\bigl( \dotsm \, a_3 \, a_2 \, a_1 \, a_0 \, . \, a_{-1} \, a_{-2} \, a_{-3} \, \dotsm \bigr)_{2i} = \bigl( \dotsm \, a_2 \, a_0 \, a_{-2} \, \dotsm \bigr)_{-4} + 2i \bigl( \dotsm \, a_3 \,a_1 \, a_{-1} \, a_{-3} \, \dotsm \bigr)_{-4}

Здесь чётные разряды представляют вещественные числа, а нечётные — мнимые. Таким образом системы счисления с мнимым основанием позволяют записывать комплексные числа цельно, не раскладывая их на сумму действительной и мнимой частей. Количество цифр в такой системе счисления равно 1b2-1 \cdot b^2.

В системах счисления с комплексным основанием на чётных позициях так же находятся вещественные числа, а на начётных — комплексные.

Такие системы счисления позволяют умножать и делить комплексные числа так же, как и при любом другом основании, но при этом нужно соблюдать следующие правила переноса: если цифра становится 1b2\ge -1 \cdot b^2, прибавить b2b^2 и 1-1 перенесётся на два разряда влево, если цифра отрицательна, то вычитается основание системы в квадрате, а +1+1 переносится.

Смешанные системы счисления

Смешанные системы счисления в общем виде имеют следующий вид:

[,a3,a2,a1,a0;a1,a2,,b3,b2,b1,b0;b1,b2,]=+a3b2b1b0+a2b1b0+a1b0+a0+a1b1+a2b1b2+\Biggl[\align{\dotsc , a_3, a_2, a_1, a_0&; a_{-1}, a_{-2}, \dotsc \\ \dotsc , b_3, b_2, b_1, b_0&; b_{-1}, b_{-2}, \dotsc} \Biggr] = \dotsb + a_3 b_2 b_1 b_0 + a_2 b_1 b_0 + a_1 b_0 + a_0 + \frac{a_{-1}}{b_{-1}} + \frac{a_{-2}}{b_{-1} b_{-2}} + \dotsb

Выглядит страшно, но на самом деле смешанными системами счисления мы пользуемся каждый день. Например, "2 недели, 5 дней, 13 часов, 45 минут, 3 секунды и 492 миллисекунды" можно записать как

[2,5,13,45,3;4927,24,60,60;1000] секунд.\Biggl[ \align{2, \, 5, \, 13, \, 45, \, 3&; \, 492 \\ 7, \, 24, \, 60, \, 60&; \, 1000} \Biggr] ~ секунд.

Факториальная система счисления

Очень примечателльной смешанной системой является факториальная, где bn=n+2b_n = n + 2. Она позволяет представить любое натуральное число в виде

cnn!+cn1(n1)!++c22!+c1где 0   ⁣   ⁣ck<k для 1kn и cn0c_n n! + c_{n-1}(n-1)! + \dotsb + c_2 2! + c_1 \quad \text{где}~0 \;\! \le \;\! c_k < k~\text{для}~1 \le k \le n~\text{и}~c_n \ne 0

Перевод из десятичной системы в систему с факториальным образом похож на перевод в систему с натуральным основанием, но сначала мы делим на 22, потом на 33, потом на 44 и так далее. В качестве примера переведём число 418:

418/2=209d=0209/3=69d=269/4=17d=117/5=3d=23/6=0d=341810=32120F\align{418 / 2 = 209 \quad &d = 0 \\ 209 / 3 = 69 \quad &d = 2 \\ 69 / 4 = 17 \quad &d = 1 \\ 17/5 = 3 \quad &d = 2 \\ 3/6 = 0 \quad &d = 3\\[0.4em]418_{10} = 32120_F}

Эта система счисления может пригодиться в комбинаторике при подсчёте количесва перестановок, размещений и сочетаний.

Система счисления Фибоначчи

Другой широко используемой смешанной системой является фибониччиева, в её основе лежат числа Фибоначии, то есть bn=Fnb_n = \FFF_n, а каждый разряд равен нулю или единице, так как любое натуральное число можно выразить суммой чисел Фибоначчи. Из-за того, что Fj2+Fj1=Fj\FFF_{j-2} + \FFF_{j-1} = \FFF_j здесь (как и в фиеричной системе) не встречаются две единицы подряд. Такая система счисления очень полезна в жадных алгоритмах.