Ресурсы: техническое описание TLS, LaTeX - в картинки (img), криптографическая библиотека Arduino, шифр "Кузнечик" на ассемблере AMD64/AVX и ARM64
Кстати, в продолжение записки про геметрическую алгебру Евклида и разность квадратов – воскресное чтение манускриптов (давно не было). Как известно, основная часть трудов Евклида дошла до нас лишь в средневековых “копиях копий”. То есть, на манускриптах. Один из важнейших таких манускриптов – Vat.gr.190 из Ватиканской апостольской библиотеки, датируемый девятым веком нашей эры и содержащий тексты “Элементов” (“Начал”). Фрагмент с записью формулировки Предложения 5 из второй книги на древнегреческом приведён на скриншоте ниже.

За исключением комментариев на полях и между строк (схолии), это как раз тот текст, который упоминается в исходной записке (плюс пара строк начала доказательства; сама формулировка заканчивается словом τετραγώνῳ во второй строке снизу на скриншоте, а схолии легко распознать, – не не прочитать, – благодаря другим чернилам и почерку).
А вот чертёж из манускрипта, соответствующий этому Предложению, почему-то подкачал – см. следующий скриншот.

Здесь и точка Γ не делит прямую линию на равные части, и Δ прижата не к той границе. Казалось бы, для геометрии это не так уж важно, смысл не меняется, но всё же.
Комментировать »
Древнегреческий подход к математике включал в себя геометрическую алгебру. Основные инструменты этой алгебры описаны, – с доказательствами, – во второй книге “Элементов” (“Начал”) Евклида. Очень хороший пример – Предложение 2.5 (то есть, пятое Предложение второй книги). Там записано следующее:
“Если прямую линию разделить на равные и неравные [отрезки], тогда прямоугольник, сформированный равной и неравной сторонами, плюс квадрат на стороне между [ними], равны квадрату на половине”.
“На половине” – тут имеется в виду квадрат на “равной” части исходного отрезка. Рисунок дан ниже – из него должно быть понятно.

“Прямая линия” у Евклида оканчивается точками, по определению. Сейчас сказали бы, что это отрезок. Но в древнегреческой математике – речь не об отрезке, а о некоторой величине, с которой связаны свои операции. Подход напоминает древние шумерские задачи. И там, и тут – для величин-отрезков вводится своё умножение: два отрезка дают площадь – величину нового типа. Обратите внимание, что операции, вообще говоря, различаются: умножение отрезков позволяет получить площадь, но это не то же самое, что и умножение натуральных чисел (“повторное сложение”, как говорят сейчас). Поэтому получается геометрическая алгебра.
Что именно здесь записано у Евклида? Разделим линию AB точкой C на равные части (половины: AC == CB), и точкой D на неравные (D, например, лежит на отрезке CB, см. рис.). Тогда утверждается, что AD*DB + CD*CD = CB*CB.
Воспользуемся современными алгоритмами и перепишем выражение: CD*CD – CB*CB == AD*DB. Дальше (см. рис.), по построению: AD == CB + CD; DB == CB – CD; следовательно, CD^2 – CB^2 == (CB+CD)*(CB-CD).
То есть, это геометрический вариант известного алгебраического соотношения – разности квадратов. Аналогичные параллели есть и у всех прочих Предложений второй книги “Элементов”.
Комментировать »
Попытались силами ChatGPT определить дату выпуска японской монеты периода Мэйдзи номиналом в 20 сенов. Загрузили в ChatGPT современной версии (пятой) фотографию именно той стороны монеты, на которой указана искомая дата (ну, такой эксперимент), направили “промпт” на русском языке. ChatGPT узнало монету в 20 сенов, рассказало, что годы таких японских монет обозначаются по периодам императорского правления (это верно), привело пример обозначения (!), а потом заявило, что нужно перевернуть монету и прислать фотографию другой стороны – типа, дата написана на другой стороне, а по имеющейся фотографии определить нельзя. Но на другой стороне написан номинал, а не дата. Дата как раз записана на той картинке, которую в ChatGPT и загрузили (специально).
Очередной типичный и практический пример, показывающий реальный уровень “полезности” данного инструмента и то, сколько там “интеллекта”. А ведь утверждают, что ИИ LLM нужно поручить анализ данных медицинской диагностики: рентгенограмм там, и других подобных данных. Но это одна из самых продвинутых LLM – и не может прочитать год выпуска старой японской монеты, хотя приводит верное описание того, как этот год записывается и интерпретируется.
Да, на таких японских монетах дата указывается по году периода, и записывается набором из нескольких иероглифических знаков. Если слева направо: обозначение “год”, потом номер самого года, потом – обозначение периода. Например (здесь группы знаков разделены точками, для наглядности): 年 . 七十三 . 治明. То есть, если теперь справа налево, то “Мэйдзи 37-й год”, или 1904 “европейский”. На аверсе монеты 1904 года в 20 сенов дата отчеканена справа от латинского обозначения номинала “20 sen” (см. фото ниже). Именно фотографию аверса и отправили для анализа. Присутствие латинских букв и арабских цифр могло бы помочь ChatGPT, если бы там был “интеллект”, но не помогло. На реверсе же монеты написан только номинал “20 сенов”, но японскими обозначениями: то есть, японские цифры там присутствуют, но это не год.

Аверс монеты – слева на коллаже. Именно эту фотографию и направили в ChatGPT (конечно, в большем разрешении).
Нетрудно предположить, как такой ответ ChatGPT получился: в интернетах на форумах часто пишут про монеты, что, мол, пришлите “фотографию лучшего качества”, “можно понять только по другой стороне” и т.д. Вот наборы таких фраз и склеились в ответ. При этом верное, в общем-то, описание – никак не повлияло на ошибочную формулировку. Потому что описание сконструировано не из смысла запроса, а исходя из набора “токенов” (слов и слогов) и их взаимного расположения. Это – программа. Генератор текстов.
Получается, что ChatGPT таким ответом даже успешно запутало бы незнакомого с предметом пользователя – ведь в предложении перевернуть монету есть логика: да, часто дата отчеканена на другой стороне, не на той, где написан номинал (пояснение: номинал здесь пользователь читает там, где он записан латиницей и арабскими цифрами).
А о том, что вышло бы из ChatGPT после загрузки фотографии реверса, мы в этой записке не узнаем: доступные токены закончились – видимо, картинки потребляют их особенно много.
Комментировать »
На аверсе британских монет изображены монархи – короли и королевы, в период правления которых монета отчеканена. Есть старая традиция: портреты соседних, по времени правления, монархов, их профили – смотрят в разные стороны. На иллюстрации ниже – пять монет в один шиллинг разных, последовательных, монархических периодов.

Сразу видно, что чётность нарушена. Монеты разложены по возрастанию года выпуска, слева направо: королева Виктория, король Эдуард VII, король Георг V (это не Николай Второй, это его брат, но двоюродный), король Георг VI, королева Елизавета II. Чётность поворотов профилей нарушена между Георгом V и Георгом VI. Почему?
Потому что между ними был король Эдуард VIII, но он быстро отрёкся от престола – настолько быстро, что и монеты с его профилем выпустить в массовое обращение не успели. Монеты периода Эдуарда VIII явно существуют, но это лишь экземпляры из тестового выпуска, так что они являются одними из самых редких монет в мире (поэтому на данной картинке и нет соотвествующего шиллинга). То есть, казалось бы, чётность сохраняется? Можно даже применить основы топологии и обнаружить, что один король пропущен? Но это не совсем так.
Да, если бы всё пошло по плану, то профиль Эдуарда VIII должен был бы смотреть вправо, а следующий – Георг VI, – смотрит влево. Хитрость в том, что Эдуард VIII вежливо попросил нарушить традицию: он хотел, чтобы его профиль смотрел влево, так как считал, что такое изображение лучше. И именно вариант с поворотом влево и был бы отчеканен массово (не только на тестовых монетах), если бы Эдуард VIII не отрёкся от престола. Как, в таком случае, сложилось бы со следующим профилем – не понятно. Так что, как ни странно, но здесь мы видим физический пример того, как “нуль-проекция” короля сохраняет чётность переходов между разными монетами.
Комментировать »
Опубликовал на “Хабре” небольшой обзор про монеты Великобритании и децимализацию (переход на 100-пенсовый фунт от старой системы из шиллингов).
Комментировать »
Кстати, в заметке про возрождение дирижаблей на dxdt.ru, которая вышла в 2008 году, 17 лет назад, упоминаются дирижабли-авианосцы, как носители беспилотников. Но там же сказано, что самолёты (понятно, что самолёт – не беспилотный), “уже базировались на дирижаблях, в краткую эпоху цеппелинов”. Так и было. Это сейчас, почему-то, схему преподносят как новинку. За прошедшие годы в интернеты выложили немало архивных фото. Вот ниже пара подтверждений про самолёты на цеппелинах.

(Credit: Richard K. Smith/U.S. Naval History and Heritage Command.)
Это самолёт Vought UO-1 и стыковочная ферма, которая должна была использоваться на цеппелине, во время испытаний, 1928 год.

(Credit: National Archives and Records Administration.)
Тот же самолёт, но уже прицепленный к дирижаблю USS Los Angeles. 1930 год.
Комментировать »
Историческая перспектива шумерской математики радикально отличается от перспективы математики древнегреческой: если для древнегреческой до нас дошло немало общетеоретических трудов, но зато все в средневековых пересказах, то от древних шумерских математиков общетеоретических документов не найдено совсем, однако есть немало практических и, видимо, учебных материалов, которые сохранились на глиняных табличках. Эти таблички датируют вторым и третьим тысячелетием до н.э. То есть, это прямые свидетельства, а не пересказ. Например, считается, что Евклид работал около 300 года до н.э. А это на две с лишним тысячи лет позже, чем шумерские таблички. При этом среди сколь-нибудь полных записей “Элементов” Евклида самый древний известный экземпляр – это девятый век. Но то девятый век нашей эры, то есть, ещё более тысячи лет спустя. (Фрагменты “Элементов”, естественно, есть и намного старше.)
Евклид для современной математики гораздо важнее, чем задачи с глиняных табличек. Но, так или иначе, есть и у табличек преимущества: едва ли не в каждой современной книге, где приводится рассказ про квадратные уравнения, рассказ этот начинается с того, что квадратные уравнения решать умели ещё древние шумеры, от которых соответствующая математическая теория перешла к древним вавилонянам. Всё это, как минимум, 3600 лет назад. На древних глиняных табличках есть разборы задач, позволяющие посмотреть, насколько те методы отличались от современных.
Вообще, на табличках до нас дошли некоторые пошаговые алгоритмы, которые всегда показаны на численных примерах. То есть, дан детальный и максимально конкретный разбор метода решения задачи в числах. Но как именно сами методы были разработаны – неизвестно, потому что теоретических работ не найдено. Да, разумно будет предположить, что за такой разработкой стояло более абстрактное понимание: вряд ли решение задач, приводящих к квадратному уравнению, было получено перебором алгоритмов. В сохранившихся задачах квадратные уравнения точно есть (см. ниже), но нет, например, абстрактных сведений о корнях таких уравнений и отношениях между корнями.
Разберём один такой конкретный пример математической задачи с глиняной таблички YBC 6967/P255041. Табличка датируется 1900-1600 до н.э., этот период называют “старовавилонским”. Фотографии четырёх её сторон приведены ниже. Небольшая часть клинописных знаков находится на боковушках таблички, но для наших целей это не важно: в этот раз мы не будем расшифровывать сами надписи по отдельным клинописным знакам – главное, что на табличке нет чертежа, а только текст (но осталось место, на котором мог быть быть чертёж).

(Источник: Yale Peabody Museum, YPM BC 021031; картинка есть в большем разрешении.)
Прежде чем читать перевод текста, нужно согласовать некоторые базовые термины шумеро-вавилонской математики. По сравнению с современным сеттингом, есть ряд важных особенностей.
Во-первых, древние шумерские задачи часто ставятся для пар специальных чисел, которые называют “обратными”. Такие числа используются и в типовых задачах с “квадратными уравнениями”, и на табличках с таблицами умножения. Соответствующие клинописные термины обозначают igi-bi и igi. А именно, это такие парные числа, произведение которых равно степени числа 60. 60 является основанием системы счисления, поэтому обратными будут: 4 и 15, 3 и 20, 6 и 600 и т.д. Это система с плавающей точкой, поэтом 60 тоже может обозначаться единицей (откуда и термин “обратные”: это ведь и есть обратные числа, в том смысле, что их произведение обозначается цифрой 1). Данный подход используется и в задаче на рассматриваемой табличке.
Почему, всё же, 60 – это единица? Потому что система счисления позиционная и шестидесятеричная. Например, в десятичной системе обратным к 2 можно назвать 5, потому что 2*5 это 10. Но десять, вроде бы, не единица? Да, если говорить о числе, но не совсем так, если говорить о системе счисления. Если десятичная точка плавающая, то отличить единицу от 10 или от 100 будет сложно. Если мы перемещаем точку вправо, то из 5 получается 0.5, а это уже точно 1/2 – то есть, обратное к числу 2 в привычном смысле алгебры умножения.
Шестидесятеричная система более удобна для точных расчётов, чем десятичная – подробнее про шестидесятеричную систему можно прочитать в отдельной заметке, а здесь все числа, для удобства, будут даны в десятичной записи.
Во-вторых, шумеро-вавилонская арифметическая система использует разные типы операции умножения рациональных чисел. Помимо привычного сейчас “пошагового” умножения “через повторное сложение” используется “геометрический” вариант, в котором два числа соответствуют длинам сторон прямоугольника (квадрата, в случае нашей задачи), а произведение – это площадь прямоугольника (“поверхность”), которая рассматривается именно как площадь, в двумерном евклидовом смысле. Именно этот, второй механизм используется в рассматриваемой задаче. Вот только тут геометрическая интерпретация лишь подразумевается, поскольку чертежей не приводится.
Казалось бы, какая разница, как определять умножение натуральных чисел? Результат же будет одинаковым, разве нет? Но это не так, результат не будет одинаковым. И не только в современной математике, но и в шумеро-вавилонской. Одинаковым, возможно, будет число, но вовсе не сам результат, который имеет тип. Это прямо влияет на сочетание используемых операций. В шумеро-вавилонском методе ещё и используются преобразования, которые, из-за их геометрической сути, просто невозможны для абстрактных чисел: например, ниже мы “присоединяем” одно число к другому – а это означает “склеивание” прямоугольников, когда сумма – это результрующий прямоугольник. То ли для древних вавилонян числа не были достаточно абстрактными понятиями, то ли это следы дидактического приёма, а уровень абстракции, напротив, был гораздо выше – точно не известно: опять же, всё потому, что не найдено теоретических работ.
Так или иначе, но геометрическая интерпретация прямо используется в операциях “присоединения” и “разбиения”. То есть, подразумеваемого объединения или разделения именно геометрических фигур на плоскости. Поэтому шумерские методы решения квадратных уравнений сейчас сплошь и рядом иллюстрируют чертежами. В конце этой заметки тоже будут чертежи – они, действительно, облегчают понимание. Но необходимо учитывать, что в самой шумеро-вавилонской “математике глиняных табличек” геометрические свойства интерпретировались именно через числа (напротив, в древнегреческой математике – это совсем не так). И числа “одномерного типа” у шемер превращаются в числа “двумерного типа”, когда отрезки образуют стороны многоугольника. Обычно, это прямоугольник. Для этого есть специальная операция. Превращение двух “чисел-отрезков” в одно “число-площадь” дальше будем называть “восстановлением”: а именно – 15 и 4 восстанавливаются в единицу (то есть, в 60).
Вернёмся к табличке. Набранный на ней текст содержит формулировку задачи с пошаговым объяснением того, как эту задачу решать.
Упрощённый перевод, где в скобках даны мои комментарии (адаптировано из Jens Høyrup, Algebra in Cuneiform, 2013):
Из пары обратных чисел (то есть, те самые igi-bi и igi), одно превышает другое на 7.
Чему равны эти обратные числа?
Возьми 7, на которое одно число другое превышает, и разбей на две части: 3½. (Здесь “разбей” – нужно интерпретировать как деление отрезка пополам.)
Восстанови два 3½, результат: 12¼. (А это и есть геометрическая операция получения квадрата на двух равных отрезках, задающих стороны.)
Присоедини 12¼ к исходной площади, равной единице: 72¼. (Обратите внимание: единица здесь – есть первая степень 60 в терминах шумеро-вавилонской системы счисления, то есть, 60 + 12¼ == 72¼.)
Чему равно 72¼? Это 8½. (“Равно” здесь – это обратное геометрическое преобразование, от квадрата, как фигуры, к стороне: то есть, сторона квадрата с площадью 72¼).
Теперь отметь 8½ и соответствующее 8½. (В смысле сторон квадрата.)
3½, элемент площади, отсоедини и присоедини на место. (8½ – 3½ == 5; 8 + 3½ == 12; заметьте ещё раз: (8½)^2 – (3½)^2 == 60.)
Первое число – 12, второе – 5.
12 есть одна часть пары, 5 – вторая. (Те самые igi-bi и igi.)
Попробуем не рисовать чертёж, а сразу понять, какая тут задача, в числах. Первая строка условия говорит, что произведение некоего числа на сумму этого же числа и 7 равно 60. Собственно, если обозначить искомое число x и записать всё в формулах современной алгебры, то и получаем квадратное уравнение.
x(x+7) == 60 x^2 + 7*x == 60 x^2 + 7*x - 60 == 0
Как такую задачу решает школьник сейчас? Очень просто – что называется, не задумываясь:
x^2 + 7*x - 60 == 0, D == 7^2 - 4(-60) == 289, (x_1, x_2) == (-7 +/- √289)/2 = (5, -12). Ответ -12 - не подходит (кстати, почему?); выбираем ответ 5. У нас прямоугольник, одна сторона равна 5, вторая, по условию, 5 + 7 == 12. Ответ: 12 и 5.
Но на исходной табличке нет дискриминанта, там, в современных обозначениях, записано несколько другое преобразование:
Исходная площадь 60, то есть, "единица", которую обозначим q. Пусть p - разность сторон (второе число на 7 больше, то есть, p == 7). x(x + p) == q Тогда p/2 это половина разности (7/2). (x + p/2)^2 == q + (p/2)^2 - то есть, строим больший квадрат, его площадь равна 72¼ (см. правую часть).
Дальше, по табличке, – “геометрически” извлекаем квадратный корень из левой части: то есть, определяем, что отрезок x + p/2 равен стороне квадрата с площадью 72¼. А именно: 8½.
Если переписать в современных обозначениях, то получим то, что принято называть выделением полного квадрата. Именно так и выводится формула для решения квадратного уравнения:
(x + p/2) == sqrt(q + (p/2)^2), x == -p/2 + sqrt(q + (p/2)^2).
Здесь p, q это коэффициенты из x^2 + p*x + q == 0.
Выходит, квадратные уравнения в образовательных целях решают, как минимум, 3600 лет. Cкорее всего – ещё дольше. Это тем более удивительно, что утилитарное применение, – так сказать, в быту, – для квадратного уравнения найти непросто и сейчас (попробуйте найти), что уж там говорить про старовавилонские города и фермы. Пример на табличке больше похож на синтетический элемент некоторой эзотерической практики, чем на задачу, скажем, для земелемера. А вот внутри математики, конечно, квадратные уравнения просто незаменимы. Так что теоретический аспект в шумеро-вавилонской математике должен был существовать, но его следы, почему-то, потеряны. Может быть, записей теории было очень мало, и они выполнялись не на глиняных табличках.
Особенно интересно, что в древнем вавилонском царстве, судя по всему, уже были специально обученные инженеры-информатики, которые проводили ответственные вычислительные операции, используя достаточно универсальные алгоритмы. Считается, что класс подобных задач в древневавилонских методических материалах не требовал чертежа: древние инженеры должны были разбираться с геометрической алгеброй без диаграмм, несмотря на то, что тут современное понятие площади непосредственно служит для воплощения интерпретации числа. Описанное выше уравнение более “квадратное” как раз потому, что квадрат числа – это, буквально, квадрат, как многоугольник с соответствующей площадью. Математические таблички с чертежами, впрочем, тоже имеются в музеях. Но их мало.
Теперь посмотрим на чертёж к задаче.

Условие соответствует верхней диаграмме. Остальные – объяснение метода решения.
Комментировать »
(Это существенно дополненная версия статьи, которую я недавно публиковал на “Хабре”. Дальше используются клинописные знаки из 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 (тема для отдельной заметки). То есть, как минимум, более древние записи сильно расходились с “современным” древнегреческим текстом.
Интересно, что из других, максимально древних, источников по “Илиаде” есть, например, различные художественные сюжеты, запечатлённые, скажем, на барельефах, на керамических сосудах. Их много. Эти сюжеты укладываются в какие-то знаковые текстовые описания сцен из “Илиады”. Однако, несмотря не все археологические изыскания, остаётся вопрос: рисовались ли те сюжеты по текстам, или тексты, – возможно, много позднее, – были написаны под нарисованные сюжеты?
Комментировать »
Кратко этот сайт характеризуется так: здесь можно узнать про технологический прогресс, Интернет, математику, криптографию, авиацию, компьютеры, авиационные компьютеры, вооружения, роботов, вооружение роботов, армии мира, астрономию, космические исследования. И иногда о чём-то ещё (