### Техническое задание: программа «Taxicab Finder» («Поиск чисел Такси»)
1. Общее описание продукта
1.1. Название
«Taxicab Finder» (Поиск чисел Такси).
1.2. Суть продукта
Десктоп‑приложение на языке Python, позволяющее исследовать числа, которые можно представить в виде суммы двух кубов натуральных чисел двумя или более различными способами (так называемые числа Такси).
1.3. Цель разработки
Создать инструмент для:
- проверки произвольных чисел на свойство числа Такси;
- автоматического поиска новых чисел Такси;
- накопления и просмотра истории найденных чисел;
- наглядной демонстрации математического свойства чисел.
1.4. Сфера применения
- образование (уроки математики, факультативы, проектная деятельность);
- самостоятельные математические исследования;
- популяризация математики и числовых головоломок;
- демонстрация применения программирования в теории чисел.
2. Функциональные требования
2.1. Проверка введённого числа
Программа должна:
- принимать от пользователя целое положительное число;
- проверять корректность ввода (тип данных, знак);
- искать все возможные представления числа в виде $a^3 + b^3$, где $a, b \in \mathbb{N}$ и $a \leq b$ (чтобы исключить зеркальные пары);
- определять, является ли число числом Такси (есть ли минимум два разных представления);
- выводить найденные способы представления числа;
- визуально маркировать результат (цвет текста в зависимости от исхода).
2.2. Автоматический поиск следующего числа Такси
Программа должна:
- определять максимальное число из уже найденных (из локальной базы данных);
- последовательно проверять числа, начиная с $N_{\text{max}} + 1$;
- для каждого числа искать все представления в виде суммы двух кубов;
- останавливаться при нахождении первого числа, имеющего два или более представления;
- отображать найденное число и его представления;
- сохранять результат в базу данных;
- иметь защитный механизм от бесконечного поиска (ограничение по порогу, например, $10^7$).
2.3. Работа с историей найденных чисел
Программа должна:
- создавать и поддерживать локальную базу данных (SQLite);
- сохранять каждое найденное число Такси с двумя способами его представления;
- исключать дублирование записей (не сохранять одно и то же число дважды);
- загружать и отображать историю найденных чисел при запуске и после каждой операции;
- представлять историю в виде списка строк формата:
$N = a^3 + b^3 = c^3 + d^3$;
- сортировать историю по возрастанию чисел.
2.4. Обработка ошибок и уведомлений
Программа должна реагировать на:
- некорректный ввод (не число, отрицательное число, ноль) — выводить диалоговое окно с ошибкой;
- отсутствие представлений числа в виде суммы кубов — сообщать, что число не представимо таким образом;
- превышение порога поиска — выводить предупреждение и прерывать поиск;
- другие исключительные ситуации — информировать пользователя через диалоговые окна.
3. Архитектурное описание
3.1. Общий принцип построения
Программа реализована по шаблону MVC (Model‑View‑Controller) с дополнительным слоем доступа к данным:
- View (Представление) — графический интерфейс пользователя на базе библиотеки
tkinter.
- Controller (Контроллер) — основной класс
TaxicabFinder, обрабатывающий события и координирующий работу компонентов.
- Model (Модель) — алгоритмы поиска представлений чисел и проверки на свойство Такси.
- Data Access Layer (Слой доступа к данным) — работа с локальной базой данных SQLite.
3.2. Компоненты и их функции
Графический интерфейс (View)
Реализован с использованием модуля tkinter. Включает:
- главное окно с фиксированными размерами;
- информационные надписи;
- поле ввода числа;
- кнопки управления;
- область вывода результатов;
- текстовую область для отображения истории.
Контроллер (Controller)
Класс TaxicabFinder:
- инициализирует интерфейс и подключает базу данных;
- обрабатывает события (нажатие кнопок, ввод с клавиатуры);
- вызывает алгоритмы модели для вычислений;
- обновляет интерфейс на основе полученных результатов;
- управляет жизненным циклом базы данных (открытие, закрытие).
Модель (Model)
Содержит ключевые алгоритмы:
find_cube_representations(number) — поиск всех пар $(a, b)$, таких что $a^3 + b^3 = \text{number}$;
- логика проверки, является ли число числом Такси (наличие ≥ 2 представлений);
find_next_taxicab() — алгоритм поиска следующего числа Такси после уже найденных.
Слой доступа к данным (Data Access Layer)
Реализован через модуль sqlite3:
- создаёт и поддерживает базу данных
taxicab_results.db;
- обеспечивает CRUD‑операции (создание, чтение, обновление, удаление записей);
- предотвращает дублирование чисел в базе;
- загружает историю при старте и после каждой операции.
3.3. Структура базы данных
Используется одна таблица — found_numbers:
id — уникальный идентификатор записи (автоинкремент);
taxicab_number — само число Такси;
first_num1, first_num2 — первое представление: $a^3 + b^3$;
second_num1, second_num2 — второе представление: $c^3 + d^3$.
Назначение: хранение найденных чисел и их представлений для последующего отображения в истории.
4. Описание пользовательского интерфейса
4.1. Главное окно
- Размер: 500 × 300 пикселей.
- Заголовок: «Проверка чисел Такси».
- Фон: стандартный для
tkinter.
4.2. Элементы интерфейса
Информационная надпись (вверху окна)
- Текст: «Проверить, можно ли представить число как сумму кубов двумя разными способами».
- Выравнивание: по центру.
- Перенос строк: при ширине 400 пикселей.
- Шрифт: стандартный.
Панель ввода числа
- Контейнер:
Frame для группировки элементов.
- Надпись слева: «Введите число для проверки:».
- Поле ввода (
Entry):
- ширина — 15 символов;
- привязка к событию
<Return> (нажатие Enter) — запуск проверки числа.
Панель кнопок (под панелью ввода)
- Контейнер:
Frame.
- Кнопка «Проверить число»:
- текст: «Проверить число»;
- цвет фона: светло‑голубой (
lightblue);
- действие: вызов метода
check_number().
- Кнопка «Найти следующее число Такси»:
- текст: «Найти следующее число Такси»;
- цвет фона: светло‑зелёный (
lightgreen);
- действие: вызов метода
find_next_taxicab().
Область вывода результата (под кнопками)
- Надпись слева: «Результат: ».
- Текстовое поле с переносом строк (ширина 450 пикселей).
- Цветовая индикация:
- зелёный — число является числом Такси;
- красный — число не является числом Такси;
- синий — идёт процесс поиска;
- оранжевый — поиск прерван (превышен порог).
Раздел истории (в нижней части окна)
- Надпись‑заголовок: «История найденных чисел:» (жирный шрифт, размер 10).
- Текстовая область (
Text):
- высота: 6 строк;
- ширина: 60 символов;
- формат вывода: $N = a^3 + b^3 = c^3 + d^3$;
- если история пуста — выводится текст: «История пуста».
5. Алгоритмы работы
5.1. Алгоритм проверки числа на свойство Такси
- Получение ввода из поля
number_entry.
- Проверка на целочисленность и положительность:
- если ввод не является числом — вывод ошибки;
- если число ≤ 0 — вывод ошибки.
- Поиск всех пар $(a, b)$ таких, что $a^3 + b^3 = N$:
- вычисление максимального возможного значения $a$:
$\text{max_cube} = \lfloor \sqrt[3]{N} \rfloor + 1$;
- перебор $a$ от 1 до $\text{max_cube}$;
- для каждого $a$: вычисление $a^3$, затем остатка $r = N - a^3$;
- вычисление $b = \text{round}(\sqrt[3]{r})$;
- проверка условий: $b \geq a$ и $b^3 = r$ (чтобы избежать дубликатов и ошибок