sicp.io
2.5.3 · Обобщенная символьная алгебра

Пакет многочленов как операции над данными с метками

Разреженные списки членов держат степени и коэффициенты явными, а обобщенные 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. Этот урок моделирует разреженные многочлены от одной переменной с целыми коэффициентами, включая сложение, умножение, нормализацию и вычисление с метками типов.

Код SICP2,685 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Программа сложения возвращает ((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 происходит на разных этапах.

    Завершить этот урок

    В этой главе пройдено 0 из 20 уроков0%