Шумеро-вавилонские клинописные глиняные таблички из Месопотамии содержат древнейшие известные математические тексты. Некоторым из них по пять тысяч лет и более.
Шумеро-вавилонская клинописная цифра 42 выглядит так: . И это именно цифра, которой может соответствовать и число
, и
, и
и так далее, по степеням 60. В том числе, по обратным степеням, например:
,
.
В шумеро-вавилонской Месопотамии использовали шестидесятеричную систему. То есть, позиционную систему по основанию шестьдесят: каждой позиции соответствует количество единиц, умноженное на степень 60, веса по позициям суммируются. Обычный способ. Поскольку основание , то нужно 59 цифр. Откуда и цифра 42 (конечно, 42 тут — это условное обозначение, поэтому к нему даже можно не приписывать нижний индекс
). В клинописной записи отдельных цифр вертикальные «палки» обозначают единицы, если их количество не превышает 9, а «галки» — обозначают десятки, что, впрочем, не делает систему десятеричной.
Вообще, древнейшние шумерские системы счисления использовали для записи цифр круги и «полуовалы». «Галки» и «палки» появились позднее, когда система стала логически стройнее. К тому же, протоклинописных кругов и «полуовалов» всё ещё нет в Unicode. При этом, в самых древних шумерских вариантах интерпретация цифр зависела ещё и от того, что именно подсчитывается: использовался ли знак для обозначения мер зерновых, для записи количества кувшинов масла или площади земельного надела — числовое значение могло быть разным. Это в точности современный Javascript, неявно преобразующий строку в числовой тип.
Скрытый текст
Это эквивалентные операции, не сомневайтесь. Многие неотъемлемые части информацционных технологий очень древние. Предположим, что неявное преобразование типов приводит ASCII-код записи «42» в значение целочисленного типа 42. Это означает, что последовательность байтов 0x3432, превращается в 0x2A. Но парой байтов были обозначены ASCII-символы. У древнейших шумер были бы, предположим, кувшины с пивом, а не ASCII-символы. Не удивительно, что эффект был позднее исправлен (не в Javascript, который хорош и без пива).
Шумеро-вавилонская система счисления имеет целый ряд особенностей. Например, способ записи не подразумевал явного обозначения степени конкретной позиции: сколько там весит единица — ,
— всё определялось контекстом. Таким образом, это древнейшая система с плавающей точкой! И она на несколько тысяч лет старше всем привычных float, double, как и современных стандартов «плавающей точки» вообще. Впрочем, если в современных стандартах бывает два нуля, — вообще говоря, не равных друг другу, — то в шумеро-вавилонской системе настоящего нуля, как такового, вообще не было, хоть в поздних вариантах и появился знак для заполнения пустых разрядов.
Выбор числа в качестве основания имеет арифметическое обоснование. У шестидесятеричной системы большое преимущество, если сранивать, например, с десятеричной, а тем более — с двоичной, восьмеричной и шестнадцатеричной. Всё потому, что число шестьдесят — «очень непростое»:
. Арифметика записи по основанию шестьдесят оказывается удобной для учёта привычных долей — можно самые ходовые доли записать точно:
,
,
,
,
,
,
,
,
,
.
Итак, разберёмся с шумерскими цифрами. Цифрами служили комбинации клинописных знаков. Мы уже назвали их «галки» и «палки», соответственно внешнего вида в Unicode и на табличках. — это «галка», которая соответствует десяти единицам;
— это «палка», которая соответствует единице. Единицы в количестве менее десяти записывались в виде плотного набора «палок»:
— это семь.
— это цифра, которой в единицах соответствует число
. «Галки» повторялись кратно десяти.
В зависимости от позиции и от контекста цифра 23 может обозначать единицы, то есть нулевую степень основания , или единицы при
, или единицы при
. Соответственно,
(23) в позиции единиц — это
.
в позиции
это
. А для второй степени:
.
Позиции разделялись пробелами, что не всегда однозначно, так как нуля в классическом варианте не было. это, например,
. Почему «например»? Потому что это система с плавающей точкой.
с тем же успехом можно интерпретировать как
.
Эта особенность сильно помогает при практических вычислениях, но мешает при считывании результата спустя всего лишь три-четыре тысячи лет. Всё достаточно просто. Различать клинья на реальных табличках трудно, но не схему записи.
Использование шумерской шестидесятеричной системы счисления в точности являлось прикладным случаем того, что сейчас принято называть «компьютерными науками» (computer science). Поэтому очень полезен сравнительный взгляд, учитывающий другие позиционные системы счисления, используемые в информатике и в тех самых компьютерных науках сейчас.
Старинная шутка гласит, что типов людей всего 10 — одни уже знают двоичную систему счисления, а другие — ещё нет. Система счисления — это способ записи чисел. Разные системы хорошо подходят для разных целей. Так, двоичная система подходит не только для записи шуток (), но и служит неплохим математическим фундаментом «железячных» компьютерных вычислений: компьютеры, как известно, не считают, а переключают транзисторные «флип-флопы». Успешная интерпретация таких переключений возможна только потому, что есть двоичная система счисления.
Использование систем счисления с разными основаниями является привычной практикой: кроме двоичной и десятичной, распространены восьмеричная и шестнадцатеричная. Восьмеричная система, конечно, встречается нынче реже, чем шестнадцатеричная, но всё равно постоянно присутствует рядом с вами, если вы сетевой инженер или разработчик системного ПО. Например, один из штатных способов записи IP-адреса, при вызове тех или иных утилит, использует восьмеричную систему, вот так: 010.010.010.010 — это будет 8.8.8.8 в привычной форме по основанию 10 (десять). Согласно древнему соглашению, октет IPv4-адреса, начинающийся с нуля, интерпретируется как записанный в восьмеричной системе. На табличках из Месопотамии об этом ничего не сказано, но, из-за базовых unix-библиотек, такое преобразование сейчас касается не только октетов.
А вот шестнадцатеричная система вряд ли нуждается в примерах: этот вариант встречается в практике программирования почти столь же часто, как и система десятичная. И не только в программировании. На стороне веб-фронтендеров в шестнадцатеричной системе повсеместно записываются цвета внутри каскадных таблиц стилей (CSS) — загляните хоть бы и в исходный код веб-страниц «Хабра». По основанию очень удобно записывать байтовые маски: запись получается не такой длинной, как в двоичной, а один октет укладывается в две цифры.
Более того, каждую шестнадцатеричную цифру полубайта можно выкинуть на четырёх пальцах руки, перпендикулярных большому пальцу: 0xF — всё четыре пальца. 0x8 — указательный или мизинец, в зависимости от того, «тупоконечные» у вас пальцы или «остроконечные». Не в смысле формы, а в смысле, с какой стороны старший бит байта. При работе с древними компьютерами (не глиняными, но примерно того же поколения) правильная шестнадцатеричная распальцовка сильно ускоряла набор на битовых переключателях. Нынче навык сей доступен разве что редкому динозавру-технарю, да и не так полезен, однако верная «распальцовка» всё ещё может быть эффективно использована в беседе с молодыми DevOps, для пущего их убеждения.
Не факт, что старшинство указательного пальца, взятое по модулю «хиральности» (правой/левой руки), оказало влияние на развитие систем счисления. Но вполне возможно, что принцип счёта по трём фалангам каждого из четырёх пальцев прямо связан с двенадцатеричными системами, которые мы здесь не рассматриваем. Впрочем, как раз .
Выше мы заметили, что основание 60 позволяет едва ли не каждую привычную на практике долю записать точно. Благодаря этой возможности шестидесятеричная система превосходит десятеричную и другие системы. Разберёмся, что именно тут имеется в виду.
Всякую позиционную систему счисления можно использовать для записи дробей: возьмём обратные степени основания {-1, -2, -3…} и станем записывать дробную часть, отделив её от целой каким-нибудь знаком. Точкой, например. Это уже было проделано выше. Для десяти — получаем всем привычные десятичные дроби: 0.4242. Точно так же будут работать и двоичная, и восьмеричная, и шестнадцатеричная система. Нет разницы. Только вот с записью долей таким способом возникнет сложность иного рода: запись окажется «бесконечной вправо» (ну, если записывать числа и расставлять веса справа налево; «бесконечная влево» запись — это p-адические числа, другая тема, хоть и неожиданно близкая).
Так, 16 — это . То есть, основание шестнадцатеричной системы, при всём богатстве выбора, какое-то слишком «простое», и проблемы начнутся с нечётными знаменателями в долях вида
.
Например, — всё в шестнадцатеричной системе, а тройка здесь — в периоде (обозначается скобками). «В периоде» — это значит, что развернутая запись никогда не окончится. Однако в десятичной записи
. «Периода» нет, запись терминируется тут же. И это одно и то же рациональное число — одна пятая.
Да, формально, и , благодаря возможности обозначить «периодические цифры», — это точная конечная запись для
. Да, к
, если уж быть максимально строгим, должен быть приписан бесконечный хвост нулей — 0.2(0), но его принято не указывать (да вообще мало кто помнит, что он там есть, но его не видно; как и про второе представление с бесконечно повторяющимися девятками, для десятичной системы). Это всё так по определению, а требуется по тем же причинам, по которым в десятеричной (десятичной) системе
.
Казалось бы, сложно ли записать (3) как период? Всего лишь скобки. Однако проблема в том, что длина периодической части может быть произвольной, не обязательно лишь одна цифра повторяется.
Заметьте, что . Аналогично тому, как
. Но почему в десятичной системе
? Потому что
. Соответственно, все числа, представимые в виде
, будут регулярными в десятичной системе: «обратные» к ним можно записать в виде конечной дроби. Шестнадцатеричная же система имеет основание
, а число 5 нельзя представить в виде
, отсюда и десятичная часть в периоде.
По тем же причинам и . Три цифры период.
А вот для период записи после запятой составит 847425747 шестнадцатеричных цифр (проверьте на калькуляторе). Так что проблема точной записи, даже если позволяется вводить дополнительную структуру и указывать «период» в скобках, — остаётся. Кстати, поскольку в разложении 10 есть 2, то найти столь же иллюстративный обратный пример — число, которое «хорошо» представляется в десятичной системе, но «плохо» в шестнадцатеричной, — не выйдет.
Будем обозначать клинописные цифры десятичной записью соответствующего числа, разделять цифры будем запятой «,», а точку-разделитель целой и дробной части (мантиссы) — обозначим точкой с запятой («;»). Это общепринятый сейчас способ. Тогда в шестидесятеричной шумеро-вавилонской системе это 0; 8,34,17(,8,34,17) или, если клинописью,
(сила Unicode; которая хороша там, где реально требуется).
А что ещё за «обратные»? Например, в десятеричной системе деление на два эквивалентно умножению на пять с последующим сдвигом десятичной точки. Элементарный пример: . В шестидесятеричной системе основание делится не только на 2 и 5, но ещё и на 3. В шестидесятеричной системе регулярные числа — это все те, которые представимы в виде
. Здесь много делителей: [
,
,
,
,
,
,
,
,
,
,
,
]. Поэтому больше долей записываются точно.
В древней шумеро-вавилонской практической арифметике деление одного числа на другое выполняется с помощью специальных таблиц. Чтобы найти , древний инженер-информатик берёт «таблицу обратных» и находит число, обратное к B. Обратите внимание, что это не совсем те обратные, не совсем
— обратное здесь берётся по основанию системы счисления. Так, в десятеричном примере выше (
), обратное к
— это 5. Почему? Потому что
, то есть
при умножении на 5 дают единицу.
Если принять плавающую точку, то 1 в нулевом разряде, если сдвинуть точку вправо, даст и т.д. Поэтому, в десятеричном примере, определив обратное 5, нужно посмотреть в таблицу умножения, найти там
, выписать ответ и не забыть сдвинуть десятичную точку:
. Так что именно плавающая точка позволяет нормировать имеющиеся числа, приводя их к удобной для вычислений форме записи. Умение работать с такими таблицами очень актуально, ведь в древней Месопотамии нет даже механических арифмометров (ну, скорее всего, их либо нет, либо они слишком дорого стоят). А вот глиняные таблички умножения и взятия обратных для шестидесятеричной системы есть.
Разделим 10,30 на 1,15. Это шумерские цифры. То есть, , а
. Найдём обратный к 1,15 — это 48, потому что 1,15 * 48 = 1 (то есть,
). Найдём результат умножения 48 на 10,30. Это 8,24 (а нуля у нас нет — не забывайте). Поставим «плавующую точку» на место и вот результат: 8; 24.
То же самое в клинописных цифрах, как это делал бы инженер-информатик в Месопотамии несколько тысяч лет назад, превращая LaTeX в засечки на глине:
(здесь черта — знак деления),
обратный:, умножаем по таблице:
.
Результат: — и через те самые несколько тысяч лет придётся догадываться, где же здесь стоит плавающая точка.
Чуть выше мы нашли, что 1/7 в шумеро-вавилонской системе не представляется точно, потому что запись будет бесконечной: . Так происходит потому, что 7 — взаимно простое с основанием
. Скорее всего, для древнего шумерского инженера-информатика рациональное число
не было бы «рациональным», в том смысле, что такую долю невозможно записать точно в шестидесятеричной системе, а в точных таблицах нет обратного значения. Непонятно, как считать, поэтому
не должна встречаться на практике. Конечно, если
всё же встретилась, то инженеру-информатику пришлось бы воспользоваться таблицами «приближённых» значений, подобрав подходящий интервал. Такие таблицы тоже имелись, но их наверняка старались избегать, ведь иначе шестидесятеричная система оказывается избыточной.
Литература
-
Knuth, D., 1972. Ancient Babylonian Algorithms. Commun. ACM 15 (7)
-
Daniel F. Mansfield, N.J. Wildberger. Plimpton 322 is Babylonian Exact Sexagesimal Trigonometry
ссылка на оригинал статьи https://habr.com/ru/articles/925154/
Добавить комментарий