Ресурсы: техническое описание TLS, LaTeX - в картинки (img), криптографическая библиотека Arduino, шифр "Кузнечик" на ассемблере AMD64/AVX и ARM64
(Это существенно дополненная версия статьи, которую я недавно публиковал на “Хабре”. Дальше используются клинописные знаки из Unicode. Если в тексте на вашем устройстве клинопись не отображается, то это из-за отсутствия шрифтов; добавьте шрифты с клинописным блоком, cuneiform; например – Noto.)
На древних глиняных табличках из Месопотамии встречаются математические тексты с достаточно сложными вычислениями. Кроме прочего, для записи чисел использовалась шестидесятеричная система, которая имеет существенное «компьютерное» преимущество перед современной десятичной. Древняя шумеро-вавилонская система счисления это позиционная система по основанию шестьдесят: каждой позиции соответствует количество единиц, умноженное на степень 60, значения позиций – суммируются. Обычный способ. Шумеро-вавилонская клинописная цифра 42 выглядит так: 𒐏𒐖. И это именно цифра, которой может соответствовать и число 42, и 2520, и 151200 и так далее (всё в десятичной системе), по степеням 60. То есть, 42, как число, – это 42 единицы, для 60^0 (в нулевой степени). А десятичное 151200 – это 42 * 60^2. И так далее. Доли представляются по обратным степеням основания, например: 42 * 1/60, 42 * 1/(60^2) == 42 * 1/(3600).
Поскольку основание 60, то нужно 59 цифр. Откуда и цифра 42 (конечно, 42 тут – это условное обозначение, поэтому к нему даже можно не приписывать указание на десятичную систему).
В клинописной записи отдельных цифр вертикальные “палки” обозначают единицы, если их количество не превышает 9, а “галки” – обозначают десятки, что, впрочем, не делает систему десятеричной. Так, 𒐏𒐖 – это четыре “галки” и две “палки”, соответственно: 10 * 4 + 2 * 1. (Кстати, с какой стороны тут правильно писать количество знаков, а с какой – вес? Это ещё один пример того, что порядок записи важен, и логическая часть практически всегда некоммутативная.)
Вообще, древнейшние шумерские системы счисления использовали для записи цифр круги и “полуовалы” – примеры есть в отдельной записке. “Галки” и “палки” появились позднее, когда система стала логически стройнее.

(Очень древняя табличка. Credit: Metropolitan Museum of Art.)
На иллюстрации выше – пример таблички (3100–2900 B.C.) со знаками, соответствующими кругам и “полуовалам” по способу построения. Видимо, это учёт кувшинов и мехов – нарисованы рядом. Точная интерпретация значений цифр на самых древних табличках трудна, так как система ещё не имела строгой типизации: в самых древних шумерских вариантах интерпретация цифр зависела ещё и от того, что именно подсчитывается. Использовался ли знак для обозначения мер зерновых, для записи количества кувшинов масла или площади земельного надела – числовое значение могло быть разным. Это в точности современный Javascript, неявно преобразующий строку в числовой тип.
Что касается Javascript, то это эквивалентные операции. Не сомневайтесь. Многие неотъемлемые части информационных технологий очень древние. Предположим, неявное преобразование типов приводит ASCII-код записи “42” в значение целочисленного типа 42. Это означает, что последовательность байтов 0x3432, превращается в 0x2A. Но парой байтов были обозначены ASCII-символы! У древнейших шумер были бы, предположим, кувшины с пивом, а не ASCII-символы. Не удивительно, что эффект позднее исправлен (но не в Javascript).
Протоклинописных кругов и “полуовалов” всё ещё нет в стандартном Unicode. Но есть предложение по добавлению нужных символов.

На этой иллюстрации – фрагмент таблицы начертаний древних шумерских цифр, которые предлагается добавить в соответствующий блок Unicode. Из состава таблицы нетрудно сделать вывод, что композиций протоклинописных знаков, встречающихся на табличках, гораздо больше, чем простой круг и не менее простой “полуовал”. Ещё больше вариантов образуется в результате интерпретации исходной записи. Скорее всего, недостаток детализации и отсутствие арифметической строгости беспокоил и древних пользователей. Поэтому способ записи модифицировали, заменив круглые цифры на системы “галок” и “палок”. Получилась, так сказать, более привычная шестидесятеричная клинописная система. Способ записи стал стройнее, а шумеро-вавлионские цифры – стали более доступными для современного взгляда. Эта система более привычна и в смысле Unicode.
Шумеро-вавилонская система счисления имеет целый ряд особенностей. Например, способ записи не подразумевал явного обозначения степени конкретной позиции: сколько там весит единица – 60, 60^3 – всё определялось контекстом. Таким образом, это древнейшая система с плавающей точкой! И она на несколько тысяч лет старше всем привычных float, double, как и современных стандартов “плавающей точки” вообще. Впрочем, если в современных стандартах бывает два нуля, – вообще говоря, не равных друг другу, – то в шумеро-вавилонской системе настоящего нуля, как такового, вообще не было. В более поздних вариантах появился знак для заполнения пустых разрядов – пара диагональных клиньев, – но он использовался только для разрядов, находящихся между другими цифрами, а не для обозначения порядка вообще, то есть, не использовался на конце записи, как в случае 1000.
Выбор числа 60 в качестве основания имеет арифметическое обоснование. У шестидесятеричной системы большое преимущество, если сравнивать, например, с десятеричной, а тем более – с двоичной, восьмеричной и шестнадцатеричной. Всё потому, что число шестьдесят – “очень непростое”: 60 = (2 * 2) * 3 * 5. В результате, арифметика записи по основанию шестьдесят оказывается удобной для отображения долей целых – можно самые ходовые доли записать точно: 1/2, 1/3, 1/4, 1/5, 1/6, 1/10, 1/12, 1/15, 1/20, 1/30, ведь знаменатели здесь являются делителями 60. “Точная запись” же означает, что для обозначения не придётся использовать бесконечную запись, как 0.333(3) для 1/3 в десятеричном случае. О точности более подробно рассказано ниже. Прежде чем перейти к дробям, нужно получше разобраться с шумерскими клинописными цифрами.
Итак, цифрами служили комбинации клинописных знаков. Мы уже назвали их “галки” и “палки”, что соответствует их начертанию и в Unicode, и на табличках. 𒌋 – это “галка”, которая соответствует десяти единицам; 𒐕 – это “палка”, которая соответствует единице. Единицы в количестве менее десяти записывались в виде плотного набора “палок”: 𒐛 – это семь. 𒌋𒌋𒐗 – это цифра, которой, если считать цифры по порядку, соответствует число 23, записанное десятично. “23”, как цифра, – не обязательно обозначает число 23. “Галки” повторялись кратно десяти единицам: 𒌋𒌋 – двадцать. Группироваться наборы “галок” и “палок” могли произвольно, что может затруднить разбор. Мы будем использовать запись, когда единицы переходят на вторую “строку”, если их больше четырёх, а десятки – группируются вертикально: 𒐏𒐝 – это цифра 49. Можно считать, что число 49 это порядковый номер сорок девятой цифры.
Возьмём снова цифру 23: 𒌋𒌋𒐗. В зависимости от позиции и от контекста эта цифра может обозначать единицы, то есть нулевую степень основания (60^0 == 1), или единицы при 60^1, или единицы при 60^2 = 3600. Соответственно, 𒌋𒌋𒐗 (“23”) в позиции единиц – это число 23 в десятичной системе. 𒌋𒌋𒐗 в позиции 60^1 это 23 * 60 = 1380 (в десятичной). А для второй степени: 23 * 60^2 = 82800 (десятичная).

(Цифра 42)
На коллаже выше – клинописная цифра “42” шумеро-вавилонской системы счисления. Вверху – современная запись (Unicode + шрифт, поддерживающий клинопись). Ниже – два варианта записи той же цифры на табличках: P493016 (середина коллажа) и P257557 (внизу). Обе таблички датируются 1900-1600 B.C. При этом на нижней табличке использован способ группировки десятков в цифрах, который отличается и от варианта на табличке в центре, и от варианта Unicode. Но, думаю, теперь нетрудно догадаться, где там что.
Позиции в записи чисел разделялись пробелами, что не всегда однозначно, из-за того, что нуля не было. 𒐖 𒌋𒐗 это, например, 2*60^1 + 13 = 133. Почему “например”? Потому что это система с плавающей точкой. 𒐖 𒌋𒐗 с тем же успехом можно интерпретировать как 2 + 13/60. Здесь 13/60 = 13*(1/60) – это интерпретация 𒌋𒐗 как 13 “обратных” долей, по степени 60^1. То есть, плавающая точка переплывает вправо на одно знакоместо. Такой произвольный сдвиг точки очень удобен с точки зрения вычислений по таблицам значений, мы в этом убедимся на примерах далее. И если данная особенность сильно помогает при практических вычислениях, то она же мешает при считывании результата спустя всего лишь три-четыре тысячи лет.
Выходит, что с шумерскими цифрами всё достаточно просто: это различать клинья на реальных табличках трудно, но не схему записи.
Использование шумерской шестидесятеричной системы счисления в точности являлось прикладным случаем того, что сейчас принято называть “компьютерными науками” (computer science). Поэтому очень полезен сравнительный взгляд, учитывающий другие позиционные системы счисления, используемые в информатике и в тех самых компьютерных науках сейчас.
Старинная шутка гласит, что типов людей всего 10 – одни уже знают двоичную систему счисления, а другие – ещё нет. Система счисления – это способ записи чисел. Разные системы хорошо подходят для разных целей. Так, двоичная система подходит не только для записи шуток (0b0010 == 2), но и служит неплохим математическим фундаментом “железячных” компьютерных вычислений: компьютеры, как известно, не считают, а переключают транзисторные “флип-флопы”. Успешная интерпретация таких переключений возможна только потому, что есть двоичная система счисления.
Использование систем счисления с разными основаниями является привычной практикой: кроме двоичной и десятичной, распространены восьмеричная и шестнадцатеричная. Восьмеричная система, конечно, встречается нынче реже, чем шестнадцатеричная, но всё равно постоянно присутствует рядом с вами, если вы сетевой инженер или разработчик системного ПО. Например, один из штатных способов записи IP-адреса, при вызове тех или иных утилит, использует восьмеричную систему, вот так: 010.010.010.010 – это будет 8.8.8.8 в привычной форме по основанию 10 (десять). Согласно древнему соглашению, октет IPv4-адреса, начинающийся с нуля, интерпретируется как записанный в восьмеричной системе. На глиняных табличках из Месопотамии об этом ничего не сказано, но, из-за базовых unix-библиотек, такое преобразование сейчас касается не только октетов.
А вот шестнадцатеричная система вряд ли нуждается в примерах: этот вариант встречается в практике программирования почти так же часто, как и система десятичная. И не только в программировании. На стороне веб-фронтендеров в шестнадцатеричной системе повсеместно записываются цвета внутри каскадных таблиц стилей (CSS). По основанию 16 очень удобно записывать байтовые маски: запись получается не такой длинной, как в двоичной, а один октет укладывается в две цифры.
В древние времена, когда компьютеры были редкими и очень большими, данные в память вводили вручную, нажимая кнопки-биты и перещёлкивая тумблер записи. Если ваш компьютер работал на байтовых ячейках, – то есть, в один октет, восемь бит, – то опытный оператор мог каждую шестнадцатеричную цифру заданного значения моментально “выкинуть” на четырёх пальцах руки: каждый палец – один бит. Если бит установлен, то и палец выставляется вперёд, для нажатия на кнопку системы набора. 0xF – четыре пальца. 0x8 – указательный или мезинец, в зависимости от того, “тупоконечные” у вас пальцы или “остроконечные”. Не в смысле формы, а в смысле того, с какой стороны старший бит байта в представлении вашего компьютера. И так далее – прочие варианты “распальцовок” читателю предлагается отработать самостоятельно. Нынче навык сей доступен разве что редкому динозавру-технарю, да и не так полезен, однако верная распальцовка всё ещё может быть эффективно использована в беседе с молодыми DevOps, для пущего их убеждения. Заметьте, что две руки – это байт, а большим пальцем можно ловко перещёлкнуть тумблер записи, перейдя к следующему адресу. Хотя, тумблеров на компьютерах больше нет.
Не факт, что старшинство указательного пальца, взятое по модулю “хиральности” (правой/левой руки), оказало влияние на развитие систем счисления. Но вполне возможно, что принцип счёта по трём фалангам каждого из четырёх пальцев при помощи пятого прямо связан с двенадцатеричными системами, которые мы здесь не рассматриваем. Впрочем, как раз 12 * 5 == 60.
Выше мы заметили, что основание 60 позволяет едва ли не каждую привычную на практике долю записать точно. Благодаря этой возможности шестидесятеричная система превосходит десятеричную и другие упомянутые системы. Разберёмся, что именно тут имеется в виду.
Всякую позиционную систему счисления можно использовать для записи дробей: возьмём обратные степени основания {-1, -2, -3…} и станем записывать дробную часть, отделив её от целой каким-нибудь знаком. Точкой, например. Это уже было проделано выше. Для десяти – получаем всем привычные десятичные дроби: 0.4242. Точно так же будут работать и двоичная, и восьмеричная, и шестнадцатеричная система. Нет разницы. Только вот с записью долей таким способом возникнет сложность иного рода: запись окажется “бесконечной вправо” (ну, если записывать числа и расставлять веса справа налево; “бесконечная влево” запись – это p-адические числа, другая тема, пусть и неожиданно близкая).
Так, 16 – это 2^4. То есть, основание шестнадцатеричной системы, при всём богатстве выбора, какое-то слишком “простое”, и проблемы начнутся с нечётными знаменателями в долях вида a/b.
Например, 1/5 == 0x0.33(3) – всё в шестнадцатеричной системе, а тройка здесь – в периоде (обозначается скобками). “В периоде” – это значит, что развернутая запись никогда не окончится. Однако в десятичной записи 1/5 == 0.2 – и точка. “Периода” нет, запись терминируется тут же. И это одно и то же рациональное число – одна пятая.
Да, формально, и 0x0.33(3), благодаря возможности обозначить “периодические цифры”, это точная конечная запись для 1/5. Да, к 0.2, если уж быть максимально строгим, должен быть приписан бесконечный хвост нулей – 0.2(0), но его принято не указывать (да вообще мало кто помнит, что он там есть, но его не видно; как и про второе представление с бесконечно повторяющимися девятками, для десятичной системы). Это всё так по определению, а требуется по тем же причинам, по которым в десятеричной (десятичной) системе 0.9(9) == 1.
Казалось бы, сложно ли записать (3) как период? Всего лишь скобки. Однако проблема в том, что длина периодической части может быть произвольной, не обязательно лишь одна цифра повторяется.
Заметьте, что 0x0.3 * 0x5 == 0x0.F. Аналогично тому, как 0.3 * 3 == 0.9. Но почему в десятичной системе 1/5 = 0.2? Потому что 10 == 2*5. Соответственно, все числа, представимые в виде 2^n * 5^m, будут регулярными в десятичной системе: “обратные” к ним можно записать в виде конечной дроби. Шестнадцатеричная же система имеет основание 2^4, а число 5 нельзя представить в виде 2^n, отсюда и дробная часть в периоде.
По тем же причинам 1/7 = 0x0.249(249). Шестнадцатеричная система. Три цифры – период.
А вот для 1/(7^11) период шестнадцатеричной записи после запятой составит 847425747 цифр (цифры записи будут шестнадцатеричные, но их количество – записано в десятичной системе, проверьте на калькуляторе). Так что проблема точной записи, даже если позволяется вводить дополнительную структуру и указывать период в скобках, – остаётся. Кстати, поскольку в разложении 10 есть 2, то найти столь же иллюстративный обратный пример – число, которое “хорошо” представляется в шестнадцатеричной системе, но “плохо” в десятичной, – не выйдет.
Будем обозначать клинописные цифры десятичной записью соответствующего числа, разделять цифры будем запятой “,”, а точку-разделитель целой и дробной части (мантиссы) – обозначим точкой с запятой (“;”). Это общепринятый сейчас способ. Тогда 1/7 в шестидесятеричной шумеро-вавилонской системе это 0; 8,34,17(,8,34,17) или клинописью:
𒐜 𒌍𒐘 𒌋𒐛 𒐜 𒌍𒐘 𒌋𒐛… (тут цифры повторяются с периодом три).
А что ещё за “обратные” числа? Например, в десятеричной системе деление на два эквивалентно умножению на пять с последующим сдвигом десятичной точки. Элементарный пример: 7/2 = (7 * 5)/10 = 35/10 = 3.5. В шестидесятеричной системе основание делится не только на 2 и 5, но ещё и на 3, и в шестидесятеричной системе регулярные числа – это все те, которые представимы в виде 2^n * 3^l * 5^m. Здесь, как мы разобрались выше, много делителей – [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60], – поэтому сдвиг плавающей точки предоставляет больше возможностей для практических вычислений по таблицам.
В древней шумеро-вавилонской практической арифметике деление одного числа на другое выполняется с помощью специальных таблиц, записанных на глиняных табличках. Чтобы найти отношение A/B, древний инженер-информатик берёт “таблицу обратных” и находит число, обратное к B. Обратите внимание, что это не совсем те привычные обратные по умножению, не совсем B^(-1) – обратное здесь берётся по основанию системы счисления. Так, в десятеричном примере выше (про деление 7/2), обратное к 2 – это 5. Почему? Потому что 5 * 2 = 10, то есть 2/10 при умножении на 5 дают единицу.
Снова вспомним, что у нас плавающая точка. Цифра 1 в нулевом разряде, если сдвинуть точку вправо на одну позицию, даст запись числа 10, на две позиции – 100, и т.д. Поэтому, определив обратное 5 в десятеричном примере, остаётся просто посмотреть в таблицу умножения для 5, найти там 5 * 7 == 35, выписать ответ и не забыть сдвинуть десятичную точку: 3.5. Так что именно плавающая точка позволяет нормировать имеющиеся числа, приводя их к удобной для вычислений форме записи. Шестидесятеричная система действует так же, но у неё больше возможностей для точных вычислений, чем у десятеричной. Умение работать с таблицами обратных и с таблицами умножения очень актуально, ведь в древней Месопотамии нет даже механических арифмометров (ну, скорее всего, их либо нет, либо они слишком дорого стоят). А вот глиняные таблички умножения и взятия обратных для шестидесятеричной системы – есть.
Разделим 10,30 на 1,15. Это уже шумерские цифры (см. нотацию выше). То есть, 10,30 == 630 в десятичной, а 1,15 == 75 в десятичной. Найдём обратный к 1,15 – это 48, потому что 1,15 * 48 == 1, а именно – 3600 в десятичной записи; выше мы разобрались, что в шумерской системе нет строгой разбивки по позициям, поэтому единица для 3600 соответствует позиции с весом 60^2. Найдём результат умножения 48 на 10,30. Это 8,24 (нуля у нас нет – не забывайте). Как получилось 8,24? Скорее всего, для шумерского инженера-информатика это табличный результат – то есть, он должен быть уже записан на глиняной табличке умножения. Если же не записан, то инженер-информатик быстро вычислит его в уме, поскольку хорошо владет шестидесятеричной системой.
Посудите сами: 30 – это половина от “единицы”, то есть, половина от основания системы, от 60. Соответственно, умножать на 30 просто – работает так же, как умножение на 5 в десятеричной системе: умножаем на 1 и берём половину. Но 1, конечно, это 60 в десятеричной. То есть, нужно взять половину от значения цифры 48 – записываем цифру 24, всё в соответствии с таблицей умножения. И не забываем, что позиция плавающей точки только что сдвинулась вправо, ведь при умножении 48 на единицу, мы взяли эту единицу в позиции с весом 60, но исходная цифра 48 – это количество единиц в позиции с весом тоже единица (60^0). Естественно, если корректно отслеживать положение плавающей точки, то метод работает для любой позиции цифры 48. Так что – обычное быстрое умножение, сдвигами.
Теперь цифра 10 из 10,30. 10 – это одна шестая от основания системы, тоже удобно. Умножаем на единицу и берём одну шестую. Одна шестая от 48 – это 8. Поэтому и цифра будет 8, но она должна стоять в правильной позиции – то есть, на одну позицию левее. Перенос плавающей точки здесь соответствует “переносу единиц” в привычном умножении столбиком в десятеричной системе, но из-за большого количества делителей основания системы 60, схема оказывается более эффективной.
Итак, получили 8,24, в шумерских цифрах. Обратите внимание, что сейчас, после умножения “на обратный”, 8 находится в позиции с весом 60^2, а 24 – в позиции с весом 60. Поставим “плавующую точку” на место, сдвинув, как положено, на две позиции левее, и получим верный результат: 8; 24.
То же самое в клинописных цифрах, как это делал бы инженер-информатик в Месопотамии несколько тысяч лет назад, засечками на глине:
𒌋 𒌍 / 𒐕 𒌋𒐙 (здесь “слеш” – знак деления),
обратный: 𒐏𒐜, умножаем по таблице: 𒐏𒐜 * 𒌋 𒌍.
Результат: 𒐜 𒌋𒌋𒐘 – и через те самые несколько тысяч лет придётся догадываться, где же здесь стоит плавающая точка.
Всё это так хорошо работает потому, что 48 == 2^3 * 6, 10 == 2 * 5, 30 == 5 * 6 и т.д. Это всё регулярные числа, которые записываются точно в шеcтидесятеричной системе. Чуть выше мы нашли, что 1/7 в шумеро-вавилонской системе нельзя представить точно, потому что запись будет бесконечной: 𒐜 𒌍𒐘 𒌋𒐛 𒐜 𒌍𒐘 𒌋𒐛… Так происходит потому, что 7 – взаимно простое с основанием 60.
Знали ли об этом древние шумеры и вавилоняне? Скорее всего, да, знали, но трактовали это явление иначе, чем сейчас: для древнего шумерского инженера-информатика рациональное число 1/7 было бы не “рациональным”, а “невозможным”, в том смысле, что такую долю невозможно записать точно в шестидесятеричной системе, поэтому в точных таблицах нет обратного значения. Непонятно, как считать, поэтому 1/7 не должна встречаться на практике. Конечно, если 1/7 всё же встретилась, то инженеру-информатику пришлось бы воспользоваться таблицами “приближённых” значений, подобрав подходящий интервал. Такие таблицы тоже имелись, но их наверняка старались избегать, ведь иначе шестидесятеричная система оказывается избыточной.
Комментировать »
Шумеро-вавилонские записи чисел на глиняных табличках не всегда использовали знаки “клин” (“палка”) и “галка”. Более древний вариант основан на круге и “полуовале” – см. иллюстрации.

(Image: Cuneiform Digital Library Initiative)
Выше – очень старая табличка, которую датируют 3200-3000 годами до нашей эры. Отпечатки выполняли при помощи цилиндрического стилуса. Расположив стилус вертикально и вдавив его в табличку – получаем круг; тот же стилус под наклоном – даёт в отпечатке “полуовал”. Использовались стилусы двух диаметров. Круг меньшего диаметра – это десять. “Полуовал” меньшего диаметра – единица. Круг большего диаметра – три тысячи шестьсот (3600 = 60^2). “Полуовал” большего диаметра – шестьдесят. Отпечатки меньших кругов могли вкладываться в большие отпечатки: получалось, видимо, 36000 (3600 * 10) и 600 (60 * 10).

(Image: Cuneiform Digital Library Initiative)
Другая табличка с таким же принципом записи цифр, датируемая 2600-2500 годом.
Вот это и есть настоящие “круглые цифры”.
Комментировать »
Немного древних чисел. На скриншоте ниже – глиняная табличка из Месопотамии Plimpton 322, которую датируют 1900-1600 годом до нашей эры.

Image: CDLI / Rare Book and Manuscript Library, Columbia University, New York, New York, USA
Табличка содержит древнюю тригонометрическую таблицу (судя по всему, да, так и есть – тригонометрическую), числа в которой записаны в шумерской системе. Шумерская система счисления – это занятная позиционная система по основанию 60, со своими тонкостями.
Попробуем прочитать числа в середине таблички (примерно – в середине: найти исходное положение фрагмента нетрудно, если воспользоваться характерным пятном).

Здесь в нижней части изображения я (примерно, опять же) обозначил знаки, которыми записаны цифры. Разгадка – ниже. Шумерские цифры (ещё не числа) записываются при помощи двух типов символов: вертикальные “галки” – обозначают десятки (так что система, в чём-то, ещё и десятичная); вертикальные “палки” – единицы, которые, если их меньше десяти, объединяются в тесные блоки. Значение для конкретной цифры – получается суммированием значений составляющих знаков. Всё это нетрудно разглядеть на табличке. Специального нуля тут нет – его роль играют пробелы и контекст.
Итак, если записать в принятом формате, обозначая шумерские цифры числами [01..59] в десятичной записи и разделяя позиции точкой, получатся числа, которые представлены ниже (два числа, слева направо, строка с зелёными подсказками).
38.11 59.01
Чтобы понять, как такие значения получаются – посчитайте “галки” и “палки” на картинке: например, три “галки” слева – это 30. Остальное должно сложиться само. Но это шестидесятеричная запись. Её, впрочем, нетрудно перевести в десятичную (учитывайте, что это позиционная система, поэтому цифровые значения умножаются на 60 в степени номера позиции, начиная с нуля; в этом примере – позиций только две).
38*60 + 11 = 2291 59*60 + 1 = 3541
Шумерские цифры из Месопотамии, вместе со способом записи, образуют древнейшую из известных позиционных систем. Не очень понятно, что произошло с нулём: на самых древних табличках нуль не обнаруживается, но на более поздних появился некоторый вариант, записываемый двумя диагональными палочками, который, конечно, не совсем решил проблему неоднозначной интерпретации. Впрочем, может, у древних шумеро-вавилонских инженеров тут никакой неоднозначной интерпретации и не возникало.
Комментировать »
Воскресное чтение манускриптов. Сегодня у нас фрагмент “Илиады”. Не только на манускрипте, но и на папирусе. Не всё из записей на папирусах, что считается фрагментами “Илиады”, точно укладывается в современный канонический текст, представленный на манускрипте Venetus A (ну, насколько он может быть каноническим: “Илиада”, между прочим, опубликована, – ну, в строгом смысле, то есть, напечатана, – впервые только в 15 веке). При этом именно кусочки папирусов дают одну из важнейших хронологических опор, позволяющих определить, что текст “Илиады” древнее, чем Venetus A, который датируется десятым веком нашей эры.
На папирусе (точнее, на кусочке папируса) P.Mich.Inv.6972 (датируется вторым веком до н.э.), который представлен на скриншоте ниже, как раз пример отличающегося в некоторых деталях текста.

Здесь две колонки – левая и правая. Они соответствуют строкам 421-434 и 445-460 десятой книги (песни) “Илиады”. При этом, например, слово из первой строки папируса – ἐπιτρωπῶσι (“доверяют”) – хоть и укладывается в Venetus A (см. ниже), но это другое слово: на Venetus A используется ἐπιτραπέουσι (“вверяют”/”вверямши”). И там, и там – строка заканчивается одинаково: φυλάσσειν (“сторожить/охранять”). Соответствующий фрагмент Venetus A (я отметил строку 421 и упомянутое слово):

Увеличенный фрагмент папируса с повышением контраста:

И это не только не единственное расхождение, но и не самое существенное: так, на этом же папирусе присутствует совсем другая версия строки 433 (тема для отдельной заметки). То есть, как минимум, более древние записи сильно расходились с “современным” древнегреческим текстом.
Интересно, что из других, максимально древних, источников по “Илиаде” есть, например, различные художественные сюжеты, запечатлённые, скажем, на барельефах, на керамических сосудах. Их много. Эти сюжеты укладываются в какие-то знаковые текстовые описания сцен из “Илиады”. Однако, несмотря не все археологические изыскания, остаётся вопрос: рисовались ли те сюжеты по текстам, или тексты, – возможно, много позднее, – были написаны под нарисованные сюжеты?
Комментировать »
Относительно недавно появились общедоступные автоматические ИИ-генераторы “фотореалистичных” изображений, которые работают по текстовому описанию и готовы генерировать разнообразные сюрреалистичные сцены. Эффект от этих фильтров регулярно оценивается как что-то принципиально новое, в плане “фотореалистичности” невиданных сцен. Конечно, отрицать влияние и новизну нельзя, пусть качество выдачи и хромает. Но всё же посмотрите на открытку со скриншота ниже – это открытка 1909 года (больше ста лет назад), из коллекции Библиотеки Конгресса.

Комментировать »
Сколько лет Интернету – вопрос многогранный. Дмитрий Бурков пишет, что отсчитывать годы нужно с момента разработки BGP (и это довольно логично, так как BGP в современной Сети используется для обмена информацией о маршрутах доставки пакетов).
Комментировать »
На фото ниже, из коллекции Библиотеки Конгресса, – установка краеугольного камня первого здания библиотеки Конгресса, а конкретно – здания Томаса Джефферсона.

Фото постановочное. Капитолий присутствует в качестве фона. Все работники в шляпах. Оно и понятно: это 1890 год, всё строго, а за нахождение на улице, – тем более – на стройплощадке, – без шляпы – могли если и не оштрафовать, то подвергнуть словесному порицанию. Ну, наверное. Не то что сейчас – если без каски.
Увеличенный фрагмент, на котором присутствует и метла, и мастерок:

Комментировать »
Попалась статья в The Guardian. Называется “Researchers create AI-based tool that restores age-damaged artworks in hours” (“Исследователи разработали базирующийся на ИИ инструмент, который восстанавливает повреждённые временем художественные полотна за [считанные] часы”). ИИ-хайп продолжает вредить: если прочитать заголовок, то сразу возникает предположение, что это опять дорисовывание при помощи “картиночной LLM”. Однако, не совсем так. Дорисовывание, конечно, есть и в этом случае, но это не генерирование ИИ-картинок.
Исходная работа, по которой написана газетная новость, не содержит упоминания ИИ в заголовке и повествует о методе восстановления при помощи копирования фрагментов из сохранившихся областей картины, копирования совпадающих фрагментов из других полотен того же художника, обработки изображения при помощи типовых библиотек, с целью получения различных масок (разностные маски по пикселам и пр.), а также наложения фильтров из состава пакета Photoshop. Всё делается на основе оцифрованного изображения (скана), с автоматизированным “выравниванием” цветов. В тексте статьи при этом описано, почему прямые методы “нейросетей” на этом направлении не дают подходящих результатов. А основная особенность – метод переноса цифровых правок на физический исходник.
Полученные в автоматизированном режиме и сведённые в Photoshop визуальные дополнения и правки “пикселов” – печатаются на специальной прозрачной плёнке, послойно (см. ниже схему). Подготовленные плёнки особым, обратимым образом наклеиваются на оригинал, дополняя его до состояния отреставрированного произведения. (Да, возникает традиционный вопрос, что же тут нужно считать реставрацией, если дорисованы фрагменты, информация о которых на исходнике полностью утрачена; собственно, в исходной работе этот момент постоянно упоминается.)
В итоге, всё же не “дорисовывание силами ИИ”, а автоматизированная обработка человеком изображения в цифровой форме (фильтры в Python + Photoshop, да) и перенос корректирующего “трафарета” при помощи плёнок – это и есть то, что ускоряет работу, снижая затраты именно в части очень сложного ручного труда реставратора-специалиста. Но в газетном заголовке всё равно “AI-based tool”.

Исходные данные – доступны на Code Ocean.
Комментировать »
Если самый полный известный текст “Илиады” (например) – это манускрипт десятого века (Venetus A), то как определить, что “Илиада” написана не в десятом веке, а сильно раньше? Помимо цитат в других произведениях, – для которых иногда встречаются более древние, чем десятый век, записи, – используется, например, тот факт, что нашли существенно более старые фрагменты папирусов, содержащие кусочки текста “Илиады”. Ну, как минимум, фрагменты на папирусах можно читать, как фрагменты “Илиады”. И эти фрагменты укладываются в текст манускрипта десятого века. Какие-то фрагменты укладываются очень точно. Например, потому что в них достаточно много слов сохранилось. Какие-то укладываются не так точно и однозначно, как хотелось бы. Естественно, подходят не только папирусы, но и какие-нибудь надписи на прочих предметах, – папирусы тут для примера.
Вообще, не так уж трудно подобрать очень короткие фрагменты из других текстов, которые, при подходящей нарезке, совпадут с “Илиадой”. Пример, который я нашёл достаточно быстро, есть даже на dxdt.ru (с картинками). Ничего удивительного: побуквенно совпадающие фрагменты из нескольких слов, не являющиеся прямой цитатой, всегда можно найти в двух достаточно больших литературных текстах на естественном языке. Во-первых, чтобы исключить подобные совпадения, нужно специально задаться подобной целью и начать генерировать синтетический текст в стиле “редкий редан редактора редукторной редиской… и т.д.”; но, – во-вторых, – даже если и задаться целью, то всё равно ничего не выйдет на сколь-нибудь большом расстоянии: какие-то слова обязательно попадут в типовую конструкцию, потому что всякая цепочка, выстраиваемая с прицелом на уникальность, начнёт рушиться из-за грамматических правил и смысловой составляющей (по условию задачи – текст литературный). Тем не менее, совпадение фрагментов – довольно надёжный инструмент. Нужно только правильно его применять. Надёжность возрастает с ростом количества доступных букв фрагментов.
Вообще, существенную роль в процессе атрибуции тех же папирусов с фрагментами “Илиады” играет уже расположение букв фрагмента. Эти буквы-символы собираются в кусочки слов, а относительное расположение кусочков похоже на расположение кусочков при общепринятом, каноническом способе записи текста “Илиады”. То есть, чтобы сдвинуть текст “Илиады” из десятого века в прошлое искусственно, нужно будет как-то “пересчитать” все эти фрагменты и их совпадения, разложив нужные элементы на папирусах. Получается что-то похожее на блокчейн с хеш-функциями: чтобы внести изменения – нужно “пересчитать” много данных, которые расползлись по папирусам, это, так сказать, “вычислительно сложно”. Причём, понятно, какие-то папирусы ещё не найдены, на момент формирования основного текста. Это всё не отменяет того факта, что каноническая запись “Илиады” является результатом редактирования и там заведомо отброшены какие-то фрагменты и варианты записи. Речь о другом: существенное изменение – потребует переучёта уже оставленных следов: какие-то нужно будет исключить, какие-то – сделать заново и признать “старыми”, где-то там закопав незаметно в древних развалинах.
Но можно ли, тем не менее, для “Илиады”, к примеру, реализовать такое современными методами? Скажем, взять разные автоматические генераторы изображений, насоздавать изображения папирусов и других надписей, сказать, что это всё вот просто в архиве оцифровано и показывать через Интернет. А при помощи 3d-принтеров и прочих хитрых инструментов – сделать много поддельных кусочков папирусов, надписей на “каменных табличках” и глиняных амфорах. Это можно сделать, но всё требует затрат. Тут речь не про альтернативную хронологию, а про погружение некоторого текста в более древние слои: получается, что для аккуратного погружения нужно “пересчитывать” совпадения элементов, расставлять слова на разных объектах согласованным способом. Понятно, что это всё работает не только для текстов, но и для археологических изысканий вообще. Тексты тут сильнее потому, что они сковывают возможности трактовки фактов через известное свойство истории “быть функцией от современности”.
Комментировать »
Английский – язык, в основном, аналитический, так что то, какой частью речи является данное слово, обычно определяется относительным местом этого слова в конкретном предложении. Проще говоря, базовую структуру задаёт порядок слов. Поэтому одно и то же слово может оказаться и существительным, и глаголом. Но это лишь грамматическая роль, а глубокая связь слова со значением всё равно не меняется, поскольку это свойство самого слова, которое не зависит от конкретного предложения. Это означает, что возможна интересная игра слов, когда на существительное действует то же самое слово, но неожиданно оказавшееся в роли глагола. Шекспир, считающийся создателем немалой части современного английского, тоже использовал этот эффект.
Наверное, самый известный пример – “thank me no thankings, nor proud me no prouds” из “Ромео и Джульетты”. Но здесь выберем в качестве иллюстрации другой фрагмент, из “Ричарда Второго”:
Tut, tut! Grace me no grace, nor uncle me no uncle
– приказывает, в третьей сцене второго акта, герцог Йоркский Эдмунд своему племяннику, Генри Болингброку, который только что попытался назвать герцога “милостивым (добрым) дядей (gracious uncle)”.
Точно перевести фразу на русский не получится, не сомневайтесь, но, благодаря мощным возможностям русского, нетрудно сохранить основную лингвистическую идею, пусть и выйдет несколько коряво: “Grace me no grace, nor uncle me no uncle” – “не милости́ мне, да не дядькай“; здесь нам немало помогает Unicode и над второй слева “и” – стоит знак обычного ударения; а вот над последней – уже бреве, то есть, это “й” – “и” с краткой. Странное слово “милости́” – это “милость”, но которую, так сказать, очень активно приписывают получателю обращения. Используется только здесь. Ну а “дядькай” – это вполне себе обычное слово, понятное любому, кто владеет русским на высоком уровне.
И всё бы хорошо, но вариант перевода с “дядькай”, конечно, вообще не соответствует драматическому настрою данной пьесы. Особенно – не соответствует пьесе в переводе. А могло ли такое использование grace – и, в особенности, uncle, – звучать немного комично в оригинале? Могло. Однако данная пьеса традиционно относится к разряду исторических, а сортировка произведений Шекспира по типам “трагедия” и “комедия” вообще представляет одну из важных проблем шекспироведения, так что совсем точно сказать сложно, особенно, если попытаться взглянуть из 16 века: шекспировский английский хоть и является современным английским, но многие детали восприятия успели сильно поменяться (Duke of York – как набор слов, вообще стал, отчасти, “кулаком” (fist), но это сленг: “Put up your dukes!”).
Как переводили на русский этот фрагмент в традиционных прочтениях? Ниже – чуть больше оригинала и примеры перевода.
BOLINGBROKE
My gracious uncle–
DUKE OF YORK
Tut, tut!
Grace me no grace, nor uncle me no uncle:
I am no traitor’s uncle; and that word ‘grace.’
In an ungracious mouth is but profane.Перевод А. И. Курошевой, слова герцога:
Тсс, тсс!
Ни добрым не зови меня, ни дядей:
Не дядя я изменнику; и слово
“Добро” осквернено в устах недобрых.Перевод М. А. Донского (?):
Слушать не хочу!
К тебе не добрый и тебе не дядя!
Не дядя я изменнику. А “добрый”
Звучит в устах недобрых, как насмешка.Перевод Д. Л. Михаловского:
Тшъ!
Не должен ты меня так называть:
Я не могу изменнику быть дядей.
А слово «светлость» свой теряет блеск,
Когда оно из темных уст исходит.
Что-что, а уже перевод на русский, но с сохранением следов оригинальной морфологической особенности, точно выглядел бы фрагментом комического куплета и подошёл бы для бродячего цирка, но вряд ли для обычного театра. Поэтому-то в переводах драматический “дядькающий” эффект пропущен. Для наблюдения над тонкостями – придётся читать в оригинале.
Комментировать »
Беспроводной телефон, использующий свет (солнечный) в качестве носителя сигнала, а нехитрую систему зеркал – в качестве модулирующей схемы. Из 1880 года, тоже от Белла. См. иллюстрацию.

Это амплитудная модуляция, наводимая колебаниями зеркала в микрофоне. На стороне приёмника – используется фоточувствительный элемент, переводящий колебания интенсивности светового луча в звук динамика. В статье на Hackaday (англ.) пишут, что действие схемы удалось воспроизвести на практике, но с использованием современных лазера и фоторезистора (там же, в статье, и ссылка на видео).
Вообще, по сравнению с радиотелефоном, такая схема заметно лучше защищена от утечек, поскольку световой луч сконцентрирован. Это тем более касается лазера. Лучше ли защита от помех – это вопрос посложнее. Если используется солнечный свет, то в пасмурный день телефон вообще не работает. Кстати, можно взять специальные свечи, в качестве источника яркого света, попутно получив “Гиперболоид” им. инженера Гарина.
При этом, когда телефон действует, помеху в виде дыма поставить просто, но нужно, чтобы дымовая завеса либо оказалась строго между передатчиком и приёмником, либо накрыла тенью солнечный вход передатчика. Засвет приёмника – да, можно проводить из любой точки, где есть прямая видимость, но нужно тоже использовать хорошо сфокусированный луч, и помеха-засвет легко блокируется постановкой контрпомехи – небольшой шторки. Так что, в некоторых моментах, помехозащищённость получше, чем у радио.
Конечно, нельзя сказать, что и учтеки исключены, и помехи не сработают. Что касается утечек, то принимать можно какие-нибудь блики, возникающие при работе передатчика. Впрочем, для 1880 года это довольно сложно – слишком высокая чувствительность потребуется.
Комментарии (1) »
Новый