Сформулируйте задачу по теории чисел: какие критерии делимости позволяют быстрее всего установить, делится ли большое число, заданное в десятичной форме, на 9, 11 и 7, и объясните ограничения каждого критерия
Задача: для большого десятичного числа NNN установить, делится ли NNN на 999, 111111 и 777. Приведите самые быстрые практические критерии и ограничьте их применимость. Критерий для 999
- Утверждение: NNN делится на 999 тогда и только тогда, когда сумма его цифр делится на 999. - Обоснование: 10≡1(mod9)10\equiv 1\pmod{9}10≡1(mod9), поэтому для записи N=∑di10iN=\sum d_i10^iN=∑di10i имеем N≡∑di(mod9)N\equiv\sum d_i\pmod{9}N≡∑di(mod9). - Практический способ: вычислить S=∑diS=\sum d_iS=∑di (или итеративно сводить сумму цифр), проверить S≡0(mod9)S\equiv 0\pmod{9}S≡0(mod9). - Ограничения: требует чтения всех цифр (O(n)O(n)O(n) по числу цифр); удобен для человека (простая суммa), даёт ровно остаток по 999 (а также по 333). Не сокращает асимптотику — нужен полный просмотр числа. Критерий для 111111
- Утверждение: NNN делится на 111111 тогда и только тогда, когда чередующаяся сумма цифр делится на 111111: N≡∑(−1)idi(mod11)N\equiv\sum (-1)^i d_i\pmod{11}N≡∑(−1)idi(mod11). - Обоснование: 10≡−1(mod11)10\equiv -1\pmod{11}10≡−1(mod11), значит 10i≡(−1)i10^i\equiv(-1)^i10i≡(−1)i. - Практический способ: вычислить A=∑i(−1)idiA=\sum_{i}(-1)^i d_iA=∑i(−1)idi (или поразрядно: прибавлять и вычитать поочерёдно), проверить A≡0(mod11)A\equiv 0\pmod{11}A≡0(mod11). - Ограничения: также O(n)O(n)O(n); 조금 сложнее для человека (нужна чередующаяся сумма), но даёт остаток по 111111. Для длинных чисел удобно реализовать как r=(10r+d) mod 11r=(10r+d)\bmod 11r=(10r+d)mod11. Критерии для 777
- Общая заметка: для 777 нет столь тривиальной «суммы цифр», но есть несколько практичных приёмов. 1. Правило «удалить последнюю цифру, вычесть удвоенную последнюю цифру»: для N=10a+bN=10a+bN=10a+b (где bbb — последняя цифра) число NNN делится на 777 тогда и только тогда, когда a−2ba-2ba−2b делится на 777. - Короткое обоснование: 10a+b≡3a+b(mod7)10a+b\equiv 3a+b\pmod{7}10a+b≡3a+b(mod7) и 3(a−2b)=3a−6b≡3a+b(mod7)3(a-2b)=3a-6b\equiv 3a+b\pmod{7}3(a−2b)=3a−6b≡3a+b(mod7); так как 333 обратим по модулю 777, получаем эквивалентность делимости. - Практика: повторять операцию, пока не получится небольшое число. - Ограничения: операция даёт меньший по величине результат не всегда очень быстро, возможны промежуточные отрицательные числа (но с ними удобно работать), для руки надо повторять несколько раз — не самая компактная для человека при очень длинных числах. 2. Правило блоками по 333 цифры (быстро для больших десятичных записей): поскольку 103=1000≡−1(mod7)10^3=1000\equiv -1\pmod{7}103=1000≡−1(mod7), представим N=∑Bi103iN=\sum B_i 10^{3i}N=∑Bi103i (каждый BiB_iBi — блок от 000 до 999999999). Тогда N≡∑(−1)iBi(mod7).N\equiv\sum (-1)^i B_i\pmod{7}.N≡∑(−1)iBi(mod7).
- Практика: складывать/вычитать подряд блоки по 333 цифры; результат проверить на делимость на 777. - Ограничения: уменьшает число операций примерно в 333 раза по сравнению с покомпонентной обработкой цифр, но приходится работать с трёхзначными блоками. 3. Универсальный (и для компьютера оптимальный) метод: остаток по модулю mmm вычисляют поразрядно r:=0;для каждой цифры d: r←(10r+d) mod m.r:=0;\quad\text{для каждой цифры }d:\ r\leftarrow (10r+d)\bmod m.r:=0;длякаждойцифрыd:r←(10r+d)modm.
Для m=7m=7m=7 это даёт за одну проходку корректный остаток. - Ограничения: сложность O(n)O(n)O(n); это оптимально по времени (нельзя решить, не прочитав число). Сравнение по быстроте и применимости - Для человека: самый быстрый — критерий для 999 (сумма цифр), затем 111111 (чередующаяся сумма), для 777 удобнее блоки по 333 цифры или правило «удвоить последнюю и вычесть». - Для машины: универсальный поразрядный модульный алгоритм r=(10r+d) mod mr=(10r+d)\bmod mr=(10r+d)modm оптимален и одинаково прост для m∈{7,9,11}m\in\{7,9,11\}m∈{7,9,11}. - Общий ограничитель: ни один критерий не позволяет избежать чтения всех цифр числа — любой корректный тест требует времени не меньше O(n)O(n)O(n) по числу цифр (информация о числе должна быть прочитана). (Кратко: для 999 — сумма цифр; для 111111 — чередующаяся сумма; для 777 — правило «a-2b» или блоки по 333 цифры; для всех трёх оптимально по компьютеру — поразрядное вычисление остатка r=(10r+d) mod mr=(10r+d)\bmod mr=(10r+d)modm.)
Критерий для 999 - Утверждение: NNN делится на 999 тогда и только тогда, когда сумма его цифр делится на 999.
- Обоснование: 10≡1(mod9)10\equiv 1\pmod{9}10≡1(mod9), поэтому для записи N=∑di10iN=\sum d_i10^iN=∑di 10i имеем N≡∑di(mod9)N\equiv\sum d_i\pmod{9}N≡∑di (mod9).
- Практический способ: вычислить S=∑diS=\sum d_iS=∑di (или итеративно сводить сумму цифр), проверить S≡0(mod9)S\equiv 0\pmod{9}S≡0(mod9).
- Ограничения: требует чтения всех цифр (O(n)O(n)O(n) по числу цифр); удобен для человека (простая суммa), даёт ровно остаток по 999 (а также по 333). Не сокращает асимптотику — нужен полный просмотр числа.
Критерий для 111111 - Утверждение: NNN делится на 111111 тогда и только тогда, когда чередующаяся сумма цифр делится на 111111: N≡∑(−1)idi(mod11)N\equiv\sum (-1)^i d_i\pmod{11}N≡∑(−1)idi (mod11).
- Обоснование: 10≡−1(mod11)10\equiv -1\pmod{11}10≡−1(mod11), значит 10i≡(−1)i10^i\equiv(-1)^i10i≡(−1)i.
- Практический способ: вычислить A=∑i(−1)idiA=\sum_{i}(-1)^i d_iA=∑i (−1)idi (или поразрядно: прибавлять и вычитать поочерёдно), проверить A≡0(mod11)A\equiv 0\pmod{11}A≡0(mod11).
- Ограничения: также O(n)O(n)O(n); 조금 сложнее для человека (нужна чередующаяся сумма), но даёт остаток по 111111. Для длинных чисел удобно реализовать как r=(10r+d) mod 11r=(10r+d)\bmod 11r=(10r+d)mod11.
Критерии для 777 - Общая заметка: для 777 нет столь тривиальной «суммы цифр», но есть несколько практичных приёмов.
1. Правило «удалить последнюю цифру, вычесть удвоенную последнюю цифру»: для N=10a+bN=10a+bN=10a+b (где bbb — последняя цифра) число NNN делится на 777 тогда и только тогда, когда a−2ba-2ba−2b делится на 777.
- Короткое обоснование: 10a+b≡3a+b(mod7)10a+b\equiv 3a+b\pmod{7}10a+b≡3a+b(mod7) и 3(a−2b)=3a−6b≡3a+b(mod7)3(a-2b)=3a-6b\equiv 3a+b\pmod{7}3(a−2b)=3a−6b≡3a+b(mod7); так как 333 обратим по модулю 777, получаем эквивалентность делимости.
- Практика: повторять операцию, пока не получится небольшое число.
- Ограничения: операция даёт меньший по величине результат не всегда очень быстро, возможны промежуточные отрицательные числа (но с ними удобно работать), для руки надо повторять несколько раз — не самая компактная для человека при очень длинных числах.
2. Правило блоками по 333 цифры (быстро для больших десятичных записей): поскольку 103=1000≡−1(mod7)10^3=1000\equiv -1\pmod{7}103=1000≡−1(mod7), представим N=∑Bi103iN=\sum B_i 10^{3i}N=∑Bi 103i (каждый BiB_iBi — блок от 000 до 999999999). Тогда
N≡∑(−1)iBi(mod7).N\equiv\sum (-1)^i B_i\pmod{7}.N≡∑(−1)iBi (mod7). - Практика: складывать/вычитать подряд блоки по 333 цифры; результат проверить на делимость на 777.
- Ограничения: уменьшает число операций примерно в 333 раза по сравнению с покомпонентной обработкой цифр, но приходится работать с трёхзначными блоками.
3. Универсальный (и для компьютера оптимальный) метод: остаток по модулю mmm вычисляют поразрядно
r:=0;для каждой цифры d: r←(10r+d) mod m.r:=0;\quad\text{для каждой цифры }d:\ r\leftarrow (10r+d)\bmod m.r:=0;для каждой цифры d: r←(10r+d)modm. Для m=7m=7m=7 это даёт за одну проходку корректный остаток.
- Ограничения: сложность O(n)O(n)O(n); это оптимально по времени (нельзя решить, не прочитав число).
Сравнение по быстроте и применимости
- Для человека: самый быстрый — критерий для 999 (сумма цифр), затем 111111 (чередующаяся сумма), для 777 удобнее блоки по 333 цифры или правило «удвоить последнюю и вычесть».
- Для машины: универсальный поразрядный модульный алгоритм r=(10r+d) mod mr=(10r+d)\bmod mr=(10r+d)modm оптимален и одинаково прост для m∈{7,9,11}m\in\{7,9,11\}m∈{7,9,11}.
- Общий ограничитель: ни один критерий не позволяет избежать чтения всех цифр числа — любой корректный тест требует времени не меньше O(n)O(n)O(n) по числу цифр (информация о числе должна быть прочитана).
(Кратко: для 999 — сумма цифр; для 111111 — чередующаяся сумма; для 777 — правило «a-2b» или блоки по 333 цифры; для всех трёх оптимально по компьютеру — поразрядное вычисление остатка r=(10r+d) mod mr=(10r+d)\bmod mr=(10r+d)modm.)