### Техническое задание: программа «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 символов; * привязка к событию `` (нажатие 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. Алгоритм проверки числа на свойство Такси** 1. Получение ввода из поля `number_entry`. 2. Проверка на целочисленность и положительность: * если ввод не является числом — вывод ошибки; * если число ≤ 0 — вывод ошибки. 3. Поиск всех пар $(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$ (чтобы избежать дубликатов и ошибок