Техническое задание.md 13 KB

### Техническое задание: программа «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. Алгоритм проверки числа на свойство Такси

  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$ (чтобы избежать дубликатов и ошибок