В статье о шумерских цифрах и их влиянии на арифметику я отметил, что запись рационального числа в шестнадцатеричной системе имеет период
шестнадцатеричных цифр и предложил проверить это на калькуляторе. Речь про период цифр записи дробной части чисел вида
. Всякое рациональное число в такой позиционной системе счисления имеет либо конечную запись (терминирующуюся, например,
или
), либо бесконечную периодическую запись (например,
).
Однако числа и
выглядят слишком большими, чтобы выписывать цифры в соответствующих количествах: сколько страниц потребуется для миллиона десятичных цифр мелким шрифтом? Реально ли такую проверку проделать на обычном калькуляторе за разумное время? Да, не сомневайтесь — реально.
Проверка «частичного» случая, как мы увидим ниже, вообще может быть проделана без калькулятора, «на салфетке», вручную. С общей проверкой, для данных конкретных чисел — не сильно-то сложнее. Ручных вычислений это не отменяет, но с калькулятором несколько удобнее. Ниже разберёмся, как тут калькулятор использовать и почему это вообще работает. Зачем? Дело в том, что знакомство с арифметикой в числах помогает понять некоторые важнейшие математические механизмы, которые, кстати, самым прямым образом применяются в современной криптографии – это можно сказать о всех описанных ниже соотношениях и теоретико-числовых алгоритмах.
Какой именно калькулятор подходит? Примем, что это любой современный качественный калькулятор. Даже приложение в смартфоне. Убедитесь, впрочем, что выбранное приложение-калькулятор работает правильно: например, выражение («минус, три, в квадрате») должно на калькуляторе давать результат
(минус девять), а то всякое случается.
Подходящий калькулятор должен иметь хотя бы десятичных разрядов, должен складывать и вычитать, умножать и делить (с какой-то точностью «после запятой»), а ещё, желательно, возводить в степень с целым показателем и показывать двоичное представление целого числа (двоичных разрядов должно быть, скажем,
или более). И это, по нынешним временам, весьма скромные, — если не сказать типовые, — требования к калькулятору.
Естественно, вычисления опираются на некоторые арифметические свойства натуральных чисел. Поэтому потребуется арифметика остатков и пара привычных для данной области теорем: основная теорема арифметики и теорема Эйлера-Ферма (если совсем строго, то это теорема Лагранжа из теории групп, но пусть будет теорема Эйлера, так привычнее). Все арифметические теоремы используются здесь без доказательств.
Итак, мы изучаем запись . Например,
. Прежде всего, нужно разобраться, как вообще можно посчитать период записи дробной части. Исходная задача касается шестнадцатеричной системы счисления, но начнём с более привычной — с десятичной. Далее, для десятичного случая, рассматриваем только взаимно простые с
знаменатели.
Пусть,
— то есть, имеет десятичную запись, в которой десятичные цифры
повторяются с периодом
.
Умножим обе части равенства на :
Теперь вычтем , вспомнив, что это как раз будет дробная часть в десятичной записи справа:
Умножим на :
Откуда:
Здесь искомый период записи — это показатель степени при основании системы счисления.
Пример. То же самое, но десятичными цифрами для, где
:
Сходится.
Чтобы определить период, нам нужно найти подходящее значение показателя степени . Что такое «подходящее» значение? Вернёмся к формуле (1) и перенесём единицу в правую часть:
Обратите внимание, тут справа стоит число, кратное и к нему прибавляем единицу: то есть, здесь просто написано, что
даёт остаток
при делении на
. Это ключевое наблюдение.
Нужно найти такое , что
В этой формуле намётанный глаз тут же видит теорему Эйлера (ну или, хотя бы, Ферма):
— это функция Эйлера. Значение этой функции для
— количество взаимно простых с
целых положительных чисел, меньших или равных
. Выше мы договорились, что
— взаимно простое с
, то есть, с основанием системы, c
. Все значения здесь — натуральные числа, по построению. В случае исходной задачи, по основанию
, всё это выполняется для
, так что теорема Эйлера, для которой как раз и требуется, чтобы
и
были взаимно простыми натуральными числами, нам хорошо подходит. (Кстати, эта же теорема Эйлера прямо используется в криптосистеме RSA.)
Из формулы видно, что как минимум одно искомое значение равно
. Это всегда так, но нужно учитывать, что могут подходить и показатели меньше, чем
.
Мы пока что определили, как вычислить нужный период в принципе. Теперь вернёмся к исходной задаче. Мы хотим проверить, что период шестнадцатеричной записи дляравен
. Соответственно, здесь
,
.
Сложно ли вычислить значение для
? Нет, это элементарно делается на нашем калькуляторе. Возьмём формулу для
:
Выглядит пугающе: произведение считается по всем простым числам, которые делят . Формула может показаться сложной, а нахождение простых при помощи калькулятора – нетривиальной задачей. Однако в нашем случае, для
, такое простое только одно – это
. Считаем на калькуляторе:
Нашли нужный показатель степени: . Это означает, что
Вывести значение , пусть и в шестнадцатеричной системе, никакой калькулятор не сможет. Но это не страшно, так как мы будем проверять другим способом, работая только с показателями степени и с остатками. Нам могут подойти и другие значения, которые меньше
. Функция Эйлера мультипликативна, то есть,
(
,
– взаимно простые). Все подходящие нам числа
должны быть делителями значения функции Эйлера (обратное — не верно). Соответственно, чтобы продолжить проверку на калькуляторе, нам нужно найти наименьшее подходящее
только среди делителей
.
Как найти эти делители на калькуляторе? Сколько их? — довольно большое значение. Перебирать вручную числа, вводя их на калькуляторе, — долго. Поэтому смотрим ещё раз на формулу, по которой вычислили
, и переписываем доли единицы несколько иначе, чтобы получить все простые делители числа
(пригодилась основная теорема арифметики):
Простые делители: ,
,
(но
в десятой степени). Это означает, что все собственные делители
, — то есть, кроме самого числа и единицы, — представляют собой произведения этих простых в разных сочетаниях, но с учётом показателей степени вхождения и коммутативности умножения. У нас
, то есть, показатели степеней:
,
,
. Следовательно, количество делителей равно
, а если взять только собственные, то получится ровно
(кто бы сомневался!).
По условиям задачи, исходный показатель периода равен .
(легко проверяем на калькуляторе). То есть, число
входит в список делителей
. Из того, что это половина максимального значения, понятно, что и само максимальное значение тоже будет образовывать «период», раз периодом является его половина. Так что уже проверили частный случай.
Вспомним полную формулировку: утверждается, что запись рационального числа в шестнадцатеричной системе имеет период
шестнадцатеричных цифр. Чтобы подтвердить это, нужно проверить, что
или
Как это сделать? Здесь мы имеем дело с возведением в степень по модулю. В криптографии это, например, та же RSA, где показатели степеней несравнимо больше нашего значения. Поэтому, для возведения в степень по модулю натурального числа используются быстрые алгоритмы: с удвоением экспоненты и так далее. Для относительно небольшого показателя такой алгоритм можно применить и на калькуляторе, но, всё же, возни будет слишком много. В нашем случае — есть гораздо более быстрый метод.
Посмотрим ещё раз на используемые числа. . То есть, все наши огромные степени
, если рассматривать их в двоичной записи, это всего лишь один бит, установленный на позиции с нужным весом, а остальные биты — нулевые. Например,
— единица и нулей в двоичной системе. Мы хотим, чтобы наше искомое число
при делении на
давало в остатке единицу, а это эквивалентно тому, что
делится на
, то есть,
.
записывается в двоичной системе как единица с большим количеством нулей справа. Если из этого числа вычесть единицу, то, при записи в двоичной системе, мы получим уже последовательность единиц, длина которой равна количеству нулей в записи
. Пример:
, тогда
. Это, очевидно, всегда так в двоичной системе.
Теперь достаточно найти признак делимости на для чисел, которые записываются непрерывным потоком единиц в двоичной системе. Да, поскольку
, нам нужно рассматривать
. Так что дальше рассматриваем просто степени двойки, и
(биты-единицы). Заметьте, кстати, что
: в восьмеричной системе каждая тройка двоичных битов-единиц записывается цифрой семь. Это всё удачное «совпадение». Воспользуемся этим совпадением вместо того, чтобы вспоминать быстрые алгоритмы возведения в степень по модулю и подсчитывать экспоненты на калькуляторе.
В двоичной системе это
. А поэтому набор двоичных единиц, чтобы делиться на
, должен иметь длину
. Это проще всего понять следующим образом:
делится на
; все нужные нам числа, из троек двоичных единиц, получаются умножением на
и прибавлением
. А чтобы число такого вида — то есть, представимое последовательностью только из двоичных единиц, — делилось на
, оно должно записываться семью тройками единиц, а именно,
двоичная единица. Проверяем:
.
Для того, чтобы три раза разделить на , — то есть, на
, — запись должна содержать
единиц. И так далее. Например, мы только что выяснили, что число
делится на . Обозначим это число j. Теперь, чтобы добавить ещё одну степень семёрки в делители, потребуется
единиц. В двоичном виде такое число можно построить следующим образом: возьмём j и умножим на
— таким образом мы сдвинули блок из 21 двоичной единицы на
позиций влево, добавив справа нулей. Чтобы превратить нули в единицы, нужно к получившемуся числу прибавить
и так далее:
Но каждое слагаемое кратно j, а j делится на 7. Значит, вся сумма тоже делится на 7 и эту семёрку можно вынести «за скобки», получив дополнительную степень:
. Так же строятся и числа для следующих степеней 7. (Можно строго доказать по индукции.)
Итак, мы нашли нужный нам признак делимости: чтобы число, записанное последовательностью двоичных единиц, делилось на , количество единиц в записи должно делиться на
(заметьте, что этот же признак можно вывести другим способом).
Казалось бы, чтобы проверить делимость для нашего значения функции Эйлера (), нужно смотреть на элементы списка делителей и выбирать те, что делятся на три. Это не так сложно, но, всё же, — там ведь сорок два числа! Однако не нужно их все перебирать. Вспомните, что мы перебираем делители числа, которое записывается как
(по построению, см. выше). Нам подходят только те числа, которые делятся и на
, и на
. Ну, так тут таких только два:
и
. Выбираем наименьшее:
– это и есть искомый ответ: да, поскольку
наименьший из делителей значения функции Эйлера для
, а
, период шестнадцатеричных цифр записи дробной части
равен
. Это сразу и частный, и общий ответ, потому что мы выбрали наименьшее из двух возможных чисел.
Полученный ответ – , — конечно, кратен периоду
, соответствующему записи
(первая степень
) в шестнадцатеричной системе. Для
период записи можно вычислить по той же формуле, которую мы вывели выше.
Так что не только на калькуляторе можно всё посчитать, но и на арифмометре, и даже вручную, на листе бумаги.
Литература
Дэвенпорт, Гарольд. Высшая арифметика: Введение в теорию чисел.