Статья Автор: Деникина Н.В., Деникин А.В.

Дробные числа

Системы счисления · Блок 1§3.1
SilverTests.ru · Подготовка к ИТМОПаттерны + ловушки
Дробные числа. Тонкости и паттерны

Продвинутые приёмы для олимпиады


1Поцифренный перевод работает и для дробей

Трюк с тетрадами (hex ↔ bin) работает по обе стороны от запятой. Каждая hex-цифра после запятой — это ровно 4 двоичных цифры после запятой.

пример// hex → bin: тетрады для дробной части
0,C8₁₆  →  0, 1100 1000₂  =  0,11001₂

// bin → hex: группируем по 4 СПРАВА от запятой
0,101110₂  →  0, 1011 1000₂  =  0,B8₁₆
                         ↑ дополнили нулями справа
Внимание! При дополнении нулями для дробной части — нули добавляются справа (в отличие от целой части, где добавляются слева). Это частая ошибка.

Олимпиадный приём: если задача даёт hex-дробь и просит что-то в двоичной — поцифренный перевод мгновенный, не нужна арифметика.


2Предпериод + период

Не все дроби — чистые периоды. Бывает предпериод (конечная часть перед периодом):

0,d₁d₂…dm(p₁p₂…pk)b
m цифр предпериода + k цифр периода

Как перевести в обыкновенную дробь

Трюк: записать два числа — «всё вместе без запятой» и «предпериод без запятой», вычесть, разделить на нужное количество девяток и нулей.

пример// 0,1(6)₁₀ = ?
// Пусть x = 0,16666...
//  10x =  1,6666...
// 100x = 16,6666...
// 100x − 10x = 15
//  90x = 15  →  x = 15/90 = 1/6

// Или формулой:
0,1(6) = (16 − 1) / 90 = 1/6
           ↑       ↑
    «16» − «1»   одна 9 + один 0
Общая формула: 0,A(B)₁₀ = (AB − A) / (99…900…0), где девяток столько, сколько цифр в периоде, нулей — сколько в предпериоде.

На ИТМО напрямую предпериод спрашивают редко, но без этого приёма нельзя проверить ответ при переводе.


3Шок-факты и ловушки

Ловушка 1: 0,(макс. цифра) = 1

факт0,(9)₁₀ = 9/9   = 1    «ноль целых, 9 в периоде» = 1
0,(F)₁₆ = 15/15 = 1    та же идея для hex
0,(1)₂  = 1/1   = 1    в двоичной макс. цифра = 1
0,(7)₈  = 7/7   = 1    в восьмеричной

// это не парадокс — просто другая запись того же числа

Ловушка 2: 0,1₁₀ — бесконечна в двоичной

Знаменатель 10 = 2 · 5. Делитель 5 не делит 2 ⇒ период. В двоичной: 0,1₁₀ = 0,0(0011)₂. Именно поэтому 0.1 + 0.2 ≠ 0.3 в компьютерах.

Ловушка 3: 1/3 записывается красиво в hex

факт// Формула: 0,(d)₁₆ = d/15
// Нужно: d/15 = 1/3  ⇒  d = 5

1/3 = 0,(5)₁₆
2/3 = 0,(A)₁₆    // A = 10, 10/15 = 2/3

// сравни с десятичной: 1/3 = 0,(3)₁₀ — 3/9 = 1/3
// принцип один: цифра = числитель · (b−1) / знаменатель

Ловушка 4: «конечная в base 10» ≠ «конечная везде»

Дробь base 10 base 2 base 12 base 16
1/5 = 0,2 конечно период период период
1/3 = 0,(3) период период конечно! период
1/6 период период конечно! период

1/3 конечна в base 12, потому что 12 = 2² · 3, а знаменатель 3 делит 12. То есть 1/3 = 0,4₁₂. Проверка: 4/12 = 1/3 ✓.


4Длина периода = мультипликативный порядок

Длина периода дроби 1/q в системе с основанием b — это наименьшее k, при котором bk ≡ 1 (mod q). Это называется «мультипликативный порядок b по модулю q».

примеры// 1/7 в десятичной: порядок 10 mod 7
10¹ mod 7 = 3
10² mod 7 = 2
10³ mod 7 = 6
10⁴ mod 7 = 4
10⁵ mod 7 = 5
10⁶ mod 7 = 1  ← первый раз!  Период = 6

// Проверка: 1/7 = 0,(142857) — ровно 6 цифр ✓
Красивый факт: 1/7 в восьмеричной имеет период 1, потому что 8 mod 7 = 1 сразу! 1/7 = 0,(1)₈. Проверка: 1/(8−1) = 1/7 ✓

Следствие: если b ≡ 1 (mod q), то 1/q — чистый однозначный период. Если q делит b, то 1/q конечна. Если ни то ни другое — период длиннее 1.

На ИТМО это знание помогает быстро оценить, будет ли дробь «красивой» в данной системе.


5Степени дробей: полный разбор

Это самый частый паттерн задачи 1 финала ИТМО. Разберём полностью.

Постановка задачи (типа финала 2023)

Дано: (0,AB₁₆)². Найти все hex-цифры дробной части.

Шаг 1. Превращаем в обыкновенную

шаг 10,AB₁₆ = AB₁₆ / 16² = 171 / 256

Шаг 2. Возводим в степень

шаг 2(171/256)² = 171² / 256² = 29241 / 65536

// 65536 = 16⁴ ⇒ в hex-записи будет 4 цифры после запятой

Шаг 3. Переводим числитель в hex

шаг 329241 ÷ 16 = 1827  ост 9  ↑
 1827 ÷ 16 =  114  ост 3  ↑
  114 ÷ 16 =    7  ост 2  ↑
    7 ÷ 16 =    0  ост 7  ↑

29241₁₀ = 7239₁₆

Шаг 4. Собираем ответ

ответ(0,AB₁₆)² = 7239₁₆ / 10000₁₆ = 0,7239₁₆

// hex-цифры дробной части: 7, 2, 3, 9
// сумма цифр: 7 + 2 + 3 + 9 = 21
// последняя цифра: 9

Ключевое наблюдение для больших N

При огромных N (порядка 10⁹) не нужно считать 171ᴺ целиком! Последние k hex-цифр = 171ᴺ mod 16ᵏ. Это считается быстрым возведением в степень за O(log N) шагов.
python# Последние 2 hex-цифры (0,AB)^N
N = 20_000_000_014
result = pow(171, N, 256)   # 171^N mod 16²
print(hex(result))          # мгновенно!

6Чек-лист: типичные ошибки
Ошибка Как правильно
Группируют дробные биты слева (как целую часть) Дробные биты группируют справа, дополняя нулями справа
Путают «конечна в 10» и «конечна везде» Проверять простые делители знаменателя для каждой базы отдельно
Пишут, что 0,(F)₁₆ = 15/16 По формуле: 15/(16−1) = 15/15 = 1
Считают 171ᴺ целиком для N > 100 Используют mod 16ᵏ — нужны только последние цифры
Забывают про предпериод: считают 0,1(6) = 16/9 Разложить через систему: x = 1/6, а не 16/(10−1)
Считают длину периода «на глаз» Длина периода = мультипликативный порядок основания по mod q

Проверь себя8 заданий
 
 
1 / 8
© SilverTests.ru · Системы счисления · §3.1 Тонкости и паттерны
Печать