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" это вычисляет целочисленные степени доменного элемента. Вызовите этот метод с доменным элементом в качестве первого аргумента и целого числа в качестве второго аргумента.

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

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

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

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

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

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

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

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

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

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

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