poly, Expr, IntMod

Создайте полином

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Синтаксис

poly(f, <[x1, x2, …]>, <ring>)
poly(p, <[x1, x2, …]>, <ring>)
poly(list, [x1, x2, …], <ring>)
poly(coeffs, [x], <ring>)

Описание

poly(f) преобразовывает многочленное выражение f в полином области ядра DOM_POLY.

Область ядра DOM_POLY представляет полиномы. Арифметика для этой структуры данных более эффективна, чем арифметика для многочленных выражений. Кроме того, эта область позволяет вам использовать специальные содействующие звонки, которые не могут быть представлены выражениями. Функциональный poly является инструментом для генерации полиномов этого типа.

poly(f, [x1, x2, ...], ring) преобразовывает выражение f в полином в indeterminates x1, x2, ... по заданному содействующему звонку. Функция poly не требует расширенной формы выражения f. Функция внутренне расширяет выражения.

Если вы не задаете indeterminates, MuPAD® ищет их внутренне. Если MuPAD не может идентифицировать indeterminates, он возвращает FAIL.

По умолчанию функция poly использует содействующий звонок произвольных выражений MuPAD. В этом случае можно использовать произвольные выражения MuPAD в качестве коэффициентов.

Если функция poly не может преобразовать выражение в полином, функция возвращает FAIL. Смотрите Пример 10.

Если f является доменным элементом, системные вызовы f::dom::poly для преобразования в полином. Если f содержит доменные элементы, система рекурсивно вызывает f::dom::poly для доменных элементов в f. Смотрите Пример 11.

poly(p, [x1, x2, ...], ring) преобразовывает полиномиальный p типа DOM_POLY к полиному в indeterminates x1, x2, ... по заданному содействующему звонку. indeterminates и содействующий звонок являются частью структуры данных DOM_POLY. Используя этот вызов функции, можно изменить indeterminates и содействующий звонок полинома.

Если вы не задаете indeterminates, poly использует indeterminates исходного полиномиального p.

Если вы не задаете содействующий звонок, poly использует звонок исходного полиномиального p.

Смотрите пример 8 и пример 9.

poly(list, [x]) преобразовывает список коэффициентов [a 0, a 1, a 2, …] к одномерному полиномиальному a 0 + a 1x + a 2 x2 + …. Смотрите Пример 3.

Для одномерного полиномиального p вызов poly(list, [x]) преобразовывает результат вызова coeff(p, All) назад к полиному.

poly(list, [x1, x2, ...], ring) преобразовывает список коэффициентов и экспонент к полиному в indeterminates x1, x2, ... по заданному содействующему звонку. Смотрите Пример 4 и Пример 7.

Этот вызов является самым быстрым методом, чтобы создать полиномы типа DOM_POLY, потому что вход уже имеет форму, которую MuPAD использует внутренне.

Список должен содержать элемент для каждого ненулевого одночлена полинома. Поэтому необходимо использовать разреженный вход, включающий только ненулевые термины. В частности, пустой список приводит к нулевому полиному.

Каждый элемент списка должен быть списком с двумя элементами: коэффициент одночлена и экспоненты (или вектор экспоненты). Для одномерного полинома в переменной x, списке

соответствует c 1 xe1 + c 2 xe2 + …. Для многомерного полинома векторы экспоненты являются списками, содержащими экспоненты всего indeterminates полинома. Порядок экспонент должен совпасть с распоряжением, данным списком indeterminates. Для многомерного полинома в переменных x 1, x 2, термин список

соответствует c 1 x1e11 x2e12 + c 2 x1e21 x2e22 + ….

Порядок элементов термина список не влияет на получившийся полином. Если вы обеспечиваете многократные въезды, соответствующие тому же термину, poly добавляет коэффициенты.

Этот вызов позволяет вам восстановить полиномы от термина списки, возвращенные poly2list.

Положение indeterminates во входном списке [x1, x2, ...] определяет их порядок в получившемся полиноме. Если вы не задаете indeterminates, MuPAD ищет выражение f возможный indeterminates и определяет их порядок. Смотрите Пример 2.

Можно выполнить арифметические операции на полиномах, которые имеют тот же indeterminates и тот же содействующий звонок. Кроме того, можно выполнить арифметические операции на полиномах и арифметические выражения. Когда вы работаете с полиномом и арифметическим выражением, MuPAD внутренне преобразовывает то арифметическое выражение в полином и выполняет вычисление. Смотрите Пример 1.

Функция poly не ограничивает приемлемый indeterminates идентификаторами или индексированными идентификаторами. Можно использовать любое выражение (за исключением рациональных выражений) как неопределенное. Например, poly принимает выражения sin(x) и f(x) как indeterminates. Смотрите Пример 5.

После создания полинома функция poly не оценивает коэффициенты полинома. Если коэффициенты содержат свободные идентификаторы, poly не заменяет эти идентификаторы на их значения. Смотрите Пример 12.

Если какая-либо область типа, который DOM_DOMAIN обеспечивает арифметическим операциям, можно использовать ту область в качестве содействующего звонка. Смотрите раздел “Background” для деталей.

Если вы задаете содействующую область, MuPAD принимает только элементы той области как коэффициенты полинома. На входе poly пытается преобразовать многочленное выражение f в полином по содействующему звонку. Для некоторых содействующих звонков вы не можете использовать арифметические выражения, чтобы представлять полином. Причина состоит в том, что умножение с indeterminates может быть недопустимой операцией в звонке. В таких случаях можно задать полином при помощи списка терминов. Смотрите Пример 7.

Примеры

Пример 1

Функция poly создает полином из многочленного выражения:

p := poly(2*x*(x + 3))

Операторы *, +, - и ^ работают над полиномами:

p^2 - p*(p + 1)

Можно умножить полином на арифметическое выражение. MuPAD внутренне преобразовывает выражение в полином соответствующего типа, и затем умножает полиномы. Например, умножьте полиномиальный p на постоянные 5:

p*5

Теперь, умножьте полиномиальный p на x - 1:

p*(x - 1)

Если MuPAD не может преобразовать выражение в полином соответствующего типа, арифметической операции между полиномом и этим выражением сбои:

p*(1/x - 1)
Error: Invalid argument. [_mult]
delete p:

Пример 2

Можно создать полином с параметрами. В следующем вызове y является параметром (не неопределенное):

poly((x*(y + 1))^2, [x])

Если вы не задаете indeterminates, MuPAD пытается найти indeterminates автоматически. Следующий вызов преобразовывает многомерное выражение в многомерный полином:

poly((x*(y + 1))^2)

Теперь, задайте порядок indeterminates явным образом:

poly((x*(y + 1))^2, [y, x])

Пример 3

Используйте функцию poly, чтобы преобразовать следующий список коэффициентов к одномерному полиному в x. Первая запись списка производит термин с нулевой экспонентой. Последняя запись производит термин с самой высокой экспонентой:

p := poly([1, 2, 3, 4, 5], [x])

Чтобы вернуться упорядоченное расположение коэффициентов в полиноме, используйте функцию revert:

revert(p)

Пример 4

Создайте следующие полиномы списками терминов:

poly([[c2, 3], [c1, 7], [c3, 0]], [x])

Если вы обеспечиваете несколько коэффициентов, соответствующих той же экспоненте, poly добавляет те коэффициенты:

poly([[c2, 3], [c1, 7], [c3, 0], [a, 3]], [x])

Для многомерных полиномов задайте векторы экспоненты списками:

poly([[c1, [2, 2]], [c2, [2, 1]], [c3, [2, 0]]], [x, y])

Пример 5

Можно использовать выражения в качестве indeterminates:

poly(f(x)*(f(x) + x^2))

Пример 6

Кольцо классов вычетов IntMod(7) является допустимым содействующим звонком:

p := poly(9*x^3 + 4*x - 7, [x], IntMod(7))

Для вычислений, которые включают полиномы по этому звонку, MuPAD использует арифметику в остаточных классах:

p^3

Однако MuPAD не возвращает коэффициенты как элементы специальной области. Вместо этого это возвращает коэффициенты как простые целые числа типа DOM_INT:

coeff(p)

delete p:

Пример 7

Чтобы создать следующий полином, объедините входной синтаксис, который использует списки терминов с заданным содействующим звонком:

poly([[9, 3], [4, 1], [-2, 0]], [x], IntMod(7))

MuPAD интерпретирует входные коэффициенты как элементы содействующей области. Например, преобразования, такие как 9 mod 7 = 2 mod 7 происходят на входе. Также можно использовать доменный Dom::IntegerMod (7), чтобы задать эквивалентный полином. Если вы используете IntMod (7), MuPAD использует симметричный функциональный mods по модулю и представляет коэффициенты числами - 3, …, 3. Если вы используете Dom::IntegerMod (7), MuPAD использует положительный функциональный modp по модулю и представляет коэффициенты числами 0, …, 6:

poly([[9, 3], [4, 1], [-2, 0]], [x], Dom::IntegerMod(7))

Доменный Dom::IntegerMod (7) не позволяет умножение с идентификаторами:

c := Dom::IntegerMod(7)(3)

poly(c*x^2, [x], Dom::IntegerMod(7))

Вместо этого используйте термин список, чтобы задать полином:

poly([[c, 2]], [x], Dom::IntegerMod(7))

delete c:

Пример 8

Измените indeterminates в полиноме:

p:= poly(((a + b)*x - a^2)*x, [x]): 
p, poly(p, [a, b])

Пример 9

Измените содействующий звонок полинома:

p := poly(-4*x + 5*y - 5, [x, y], IntMod(7)):
p, poly(p, IntMod(3))

Пример 10

Создайте полином по содействующему звонку Dom::Float:

poly(3*x - y, Dom::Float)

y идентификатора не может появиться в коэффициентах от этого звонка, потому что это не может быть преобразовано в число с плавающей запятой:

poly(3*x - y, [x], Dom::Float)

Пример 11

Можно перегрузить poly его первым операндом. Например, создайте доменный polyInX, который представляет полиномы в x:

domain polyInX
  new   := () -> new(dom, poly(args(), [x]));
  print := p -> expr(extop(p, 1));
  poly  := p -> 
           if args(0) = 1 then
             print(Unquoted, "polyInX::poly called with 1 argument");
             extop(p, 1);
           else 
             print(Unquoted, 
                   "polyInX::poly called with more than 1 argument");
             poly(extop(p, 1), 
                  args(2..args(0)));
           end;
end_domain:
p := polyInX(3*x^2-2)

Можно преобразовать элементы polyInX в полиномы типа DOM_POLY. Вызовы функции poly метод poly области:

poly(p)
polyInX::poly called with 1 argument

Путем реакции на дополнительные аргументы перегрузка, заданная выше также, позволяет вам создавать полиномы по другим содействующим звонкам:

poly(p, [x], IntMod(2))
polyInX::poly called with more than 1 argument

Пример 12

Создайте полином с коэффициентами, содержащими идентификатор y. Несмотря на то, что вы присваиваете значение 1 y, MuPAD не заменяет новым значением в полином:

f := poly(x^2 - y, [x]): 
y := 1:
eval(f)

Можно оценить коэффициенты явным образом. Используйте функцию mapcoeffs, чтобы применить eval к коэффициентам полинома:

f := mapcoeffs(f, eval)

Параметры

f

Многочленное выражение

x1, x2, …

indeterminates полинома: обычно, идентификаторы или индексированные идентификаторы.

ring

Содействующий звонок: или Expr или IntMod (n) с некоторым целочисленным n, больше, чем 1, или область типа DOM_DOMAIN. Значением по умолчанию является кольцевой Expr произвольных выражений MuPAD.

p

Полином типа DOM_POLY сгенерирован poly

list

Список, содержащий коэффициенты и экспоненты

coeffs

Список, содержащий коэффициенты одномерного полинома

x

Неопределенный из одномерного полинома

Опции

Expr

Кольцевой Expr по умолчанию представляет произвольные выражения MuPAD. Математически, этот звонок совпадает с Dom::ExpressionField (). Однако MuPAD работает по-другому с полиномами, созданными по Expr и полиномам, созданным по Dom::ExpressionField (). В частности, MuPAD выполняет арифметические операции для полиномов по кольцевому Expr быстрее.

IntMod

Кольцевой IntMod (n) представляет кольцо классов вычетов n, с помощью симметричного представления. Здесь, n является целым числом, больше, чем 1. Математически, этот звонок совпадает с Dom::IntegerMod (n). Однако MuPAD управляет по-другому на полиномах, созданных по IntMod (n) и полиномами, созданными по Dom::IntegerMod (n). В частности, MuPAD выполняет арифметические операции для полиномов по кольцевому IntMod быстрее. Кроме того, для полиномов по IntMod coeff и подобные функции возвращают требуемые коэффициенты как целые числа типа DOM_INT. Смотрите Пример 6, Пример 7 и Пример 9.

Возвращаемые значения

Полином доменного типа DOM_POLY. Если преобразование в полином не возможно, возвращаемым значением является FAIL.

Перегруженный

f

Алгоритмы

Чтобы использовать область в качестве коэффициента, область должна содержать следующее:

  • "zero" записи, который обеспечивает нейтральный элемент относительно сложения.

  • "one" записи, который обеспечивает нейтральный элемент относительно умножения.

  • "_plus" метода, который добавляет доменные элементы.

  • "_negate" метода, который возвращает инверсию относительно сложения.

  • "_mult" метода, который умножает доменные элементы.

  • "_power" метода, который вычисляет целочисленные степени доменного элемента. Вызовите этот метод с доменным элементом в качестве первого аргумента и целого числа в качестве второго аргумента.

Кроме того, необходимо задать следующие методы. Функции (такие как gcd, diff, divide, norm и так далее) вызывают эти методы:

  • "gcd" метода, который возвращает наибольший общий делитель доменных элементов.

  • "diff" метода, который дифференцирует доменный элемент относительно переменной.

  • "_divide" метода, который делит два доменных элемента. Это должно возвратить FAIL, если деление не возможно.

  • "norm" метода, который вычисляет норму доменного элемента и возвращает ее как номер.

  • "convert" метода, который преобразовывает выражение в доменный элемент. Метод должен возвратить FAIL, если такое преобразование не возможно.

    Системные вызовы этот метод, чтобы преобразовать коэффициенты многочленных выражений к коэффициентам заданной области. Если этот метод не существует, можно задать коэффициенты только при помощи доменных элементов.

  • "expr" метода, который преобразовывает доменный элемент в выражение.

    Системная функция expr вызывает этот метод, чтобы преобразовать полином по содействующей области к многочленному выражению. Если этот метод не существует, expr вставляет доменные элементы в выражение.

Можно преобразовать полином по определенной содействующей области в полином по той же области, но различный набор indeterminates. Это преобразование намного более эффективно, когда область имеет аксиому Ax::indetElements. MuPAD неявно принимает, что эта аксиома содержит для доменного IntMod(n), но не для Expr.

Внутренне, MuPAD хранит полиномы типа DOM_POLY в разреженном представлении и использует целые числа машины для экспонент. Этот метод подразумевает, что в 32-битной среде, экспонента каждой переменной в каждом одночлене не может превысить 231 - 1.