Пакет многочленов как операции над данными с метками
Разреженные списки членов держат степени и коэффициенты явными, а обобщенные add и multiply объединяют одинаковые порядки и хранят переменную многочлена.
Как система обобщенной арифметики может управлять структурой многочленов, не раскрывая детали списка членов в клиентском коде?
- Представление разреженного многочлена в виде переменной и членов в порядке убывания степеней
- Объединение одинаковых степеней при сложении двух списков членов
- Распределение одного члена по всему многочлену при умножении
- Удаление членов с нулевыми коэффициентами на границе представления
- Диспетчеризация сложения и умножения многочленов через методы с метками типов
- Отклонение операций над многочленами с несовпадающими переменными
Первая программа представляет каждый член порядком и коэффициентом и хранит члены от старшего порядка к младшему. Процедура add-terms выполняет то же упорядоченное слияние, что применялось ранее для множеств: старший порядок копируется, равные порядки складываются, а adjoin-term опускает нулевой результат. Пакет многочленов инкапсулирует это представление и предоставляет один метод add с меткой типа. Сложение x² + 2x + 1 и x² − 1 поэтому дает 2x² + 2x без явного нулевого свободного члена. Многочлен от y возвращает different-variables вместо неявного объединения несвязанных переменных.
Вторая программа умножает один член на каждый член другого многочлена, сдвигает порядки сложением, перемножает коэффициенты и объединяет промежуточные произведения через add-terms. Умножение x + 1 на x − 1 создает два взаимно уничтожающихся средних члена, оставляя x² − 1. Отдельный вычислитель использует селекторы пакета и сообщает 8 при x = 3. Этот урок моделирует разреженные многочлены от одной переменной с целыми коэффициентами, включая сложение, умножение, нормализацию и вычисление с метками типов.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Программа сложения возвращает ((polynomial x (2 2) (1 2)) different-variables). Программа умножения возвращает ((polynomial x (2 1) (0 -1)) 8).
При сложении проследите за сравнением порядков по убыванию и найдите сумму коэффициентов равных порядков, которая отбрасывает нулевой свободный член. При умножении проследите за каждым сдвигом порядка, произведением коэффициентов, рекурсивным промежуточным произведением и слиянием через add-terms, которое взаимно уничтожает два члена порядка 1. Проверка переменных происходит до начала любой операции над представлением.
Измените программу и сравните результат.
Умножьте x² + x + 1 на x − 1, определите разреженный список членов и вычислите значение результата при x = 2.
Показать подсказку
Сформируйте по одному промежуточному произведению для каждого левого члена, затем объедините одинаковые порядки. Взаимное уничтожение членов порядка 1 и порядка 0 происходит на разных этапах.