Dom:: DistributedPolynomial

Области распределенных полиномов

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

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

Синтаксис

Доменное создание

Dom::DistributedPolynomial(<Vars, <R, <Order>>>)

Создание элемента

Dom::DistributedPolynomial(Vars, R, Order)(p)
Dom::DistributedPolynomial(Vars, R, Order)(lm)
Dom::DistributedPolynomial(Vars, R, Order)(lm, v)

Описание

Dom::DistributedPolynomial(Vars, R, ..) создает область полиномов в переменных списка Vars по коммутативному кольцевому R в распределенном представлении.

Dom::DistributedPolynomial(Vars, R, Order) создает область полиномов в переменных списка Vars по области категории Cat::CommutativeRing в разреженном распределенном представлении относительно одночлена, заказывая Order.

Если Dom::DistributedPolynomial называется без какого-либо аргумента, полиномиальной области в произвольно многих indeterminates по доменному Dom::ExpressionField, (normal) относительно лексикографического одночленного упорядоченного расположения создается.

Если Dom::DistributedPolynomial называется только со списком переменных Vars в качестве аргумента, полиномиальной области в списке переменных Vars по доменному Dom::ExpressionField, (normal) относительно лексикографического одночленного упорядоченного расположения создается.

Примечание

Только коммутативные содействующие звонки типа, который позволен DOM_DOMAIN, которые наследовались Dom::BaseDomain. Если R будет иметь тип DOM_DOMAIN, но не наследуется Dom::BaseDomain, доменный Dom::ExpressionField, ТО (normal) будет использоваться вместо этого.

Dom::DistributedPolynomial принимает выражения как indeterminates, подобный области ядра DOM_POLY. Следовательно, например, [x,cos(x)] является списком действительных переменных.

Если список переменных, Vars является пустым списком ([]), полиномиальная область в произвольно многих indeterminates, создается. В этом случае, при создании новых элементов из полиномов или многочленных выражений, системная функция indets сначала называется, чтобы получить переменные, и затем полином создается относительно этих переменных. Следовательно, в этом случае только идентификаторы могут быть допустимым indeterminates, потому что indets возвращает только идентификаторы.

Не позволено создать полиномиальные области в произвольно многих indeterminates по другой полиномиальной области категории Cat::Polynomial, но возможно создать многомерные полиномиальные области с данным списком переменных по любой полиномиальной области.

Dom::DistributedPolynomial представляет полиномы по произвольным коммутативным звонкам. Это предназначается как основная область для распределенных полиномов, из которых легко создать новые распределенные полиномиальные области.

Все обычные алгебраические и арифметические полиномиальные операции реализованы, включая базисное вычисление Gröbner.

Примечание

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

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

Суперобласть

Dom::BaseDomain

Аксиомы

Если R имеет Ax::normalRep, то Ax::normalRep.

Если R имеет Ax::canonicalRep, то Ax::canonicalRep.

Категории

Если Vars имеет точно одну переменную, то Cat::UnivariatePolynomial (R), еще Cat::Polynomial (R).

Примеры

Пример 1

Следующий вызов создает полиномиальную область в x, y и z.

DP := Dom::DistributedPolynomial([x, y, z])

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

Довольно легко создать элементы этой области, как, например.

a := DP(x + 2*y*z + 3)

b := DP(z^4 - 2*y^2*x^2)

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

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

4*b^2 + a/3 + 1/2

Существует много методов для управления полиномами и получить доступ ко всем частям полинома. Например, у каждого есть доступ к ведущему одночлену a можно следующим образом:

lmonomial(a)

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

lmonomial(a, DegreeOrder)

Чтобы получить a минус его ведущий одночлен, можно вызвать:

DP::reductum(a)

Очевидно, следующая идентичность содержит:

a - lmonomial(a) - DP::reductum(a)

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

poly(a), domtype(poly(a))

expr(b), domtype(expr(b))

Параметры

Vars

Список indeterminates. Значением по умолчанию является [] (пустой список, указывая “на произвольный indeterminates”).

R

Коммутативный звонок, т.е. область категории Cat::CommutativeRing. Значением по умолчанию является Dom::ExpressionField(normal).

Order

Одночленное упорядоченное расположение, т.е. одно из предопределенных упорядоченных расположений LexOrder, DegreeOrder или DegInvLexOrder или любой объект типа Dom::MonomOrdering. Значением по умолчанию является LexOrder.

p

Полином или многочленное выражение.

lm

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

v

Список indeterminates. Этот параметр только допустим для Vars = [].

Записи

"характеристика"

Характеристика этой области.

"coeffRing"

Содействующий звонок этой области, как задано параметром R.

"ключ"

Имя созданной области.

"один"

Нейтральный элемент w.r.t. "_mult".

"упорядоченное расположение"

Одночленный порядок, как задано параметром Order.

Переменные

Список переменных, как задано параметром Vars.

"нуль"

Нейтральный элемент w.r.t. плюс.

Методы

развернуть все

Математические методы

_divide(a, b)

_divide(a, b)

_divide(a, b)

Это перегружает функциональный _divide для полиномов, т.е. можно использовать его или в форме a / b, или в функциональной форме _divide(a, b).

Примечание

Этот метод только существует, если R является интегральной областью, т.е. областью категории Cat::IntegralDomain.

_invert(a)

_mult(<a, b, …>)

Этот метод перегружает функциональный _mult для полиномов, т.е. можно использовать его или в форме a * b * ... или в функциональном обозначении _mult(a, b, ...).

_negate(a)

Этот метод перегружает функциональный _negate для полиномов, т.е. можно использовать его или в форме -a или в функциональном обозначении _negate(a).

_plus(<a, b, …>)

Этот метод перегружает функциональный _plus для полиномов, т.е. можно использовать его или в форме a + b + ... или в функциональном обозначении _plus(a, b, ...).

_power(a, n)

Этот метод перегружает функциональный _power для полиномов, т.е. можно использовать его или в форме a^n или в функциональном обозначении _power(a,n).

_subtract(a, b)

Этот метод перегружает функциональный _subtract для полиномов, т.е. можно использовать его или в форме a - b или в функциональном обозначении _subtract(a, b).

Наследованный от Cat::IntegralDomain.

content(a)

Примечание

Этот метод только существует, если R является областью категории Cat::GcdDomain.

D(a)

D(l, a)

Dpoly(a)

Dpoly(l, a)

Dpoly(l,a) вычисляет частную производную a относительно l. Для получения дополнительной информации смотрите polylib::Dpoly.

Этот метод перегружает функциональный polylib::Dpoly для полиномов.

decompose(a, <var>)

Если a является полиномом только в одной переменной, второй аргумент не необходим.

Этот метод перегружает функциональный polylib::decompose для полиномов.

diff(a, varseq)

Если varseq является пустой последовательностью, a возвращен неизменный.

Если в varseq выражение происходит, который не является переменной a, нулевой полином возвращен.

Этот метод перегружает функциональный diff для полиномов.

dimension(ais, <ord>)

dimension(ais, <ord>)

Этот метод является просто интерфейсом для функционального groebner::dimension.

Примечание

Этот метод только существует, если R является полем, т.е. областью категории, Cat::Field и Vars не являются пустым списком.

divide(a, b, <Quo | Rem | Exact>)

divide(a, b, var, <Quo | Rem | Exact>)

Если никакая опция не дана, частное s и остаток, r вычисляется таким образом, что a = s*b + r и степень r в соответствующем неопределенном меньше, чем тот из b. Последовательность, состоящая из s, r, возвращена, в противном случае FAIL.

Если опция, которую Quo дан, только частное s, возвращена.

Если опция, которую Rem дан, только остаток r, возвращена.

Если опция, которую Exact дан, только частное s, возвращена, в случае, если остаток является нулем, в противном случае FAIL.

divide(a,b,Exact) делит многомерный полиномиальный a на b. Если a не может быть разделен на b, метод возвращает FAIL.

Этот метод перегружает функциональный divide для полиномов.

Примечание

Этот метод только существует, если R является полем, т.е. областью категории Cat::Field, и или эта область имеет категорию, Cat::UnivariatePolynomial(R) или R имеют характеристический нуль (R::characteristic = 0). Если первая пара условий верна затем, что первый вызов допустим в противном случае второй.

Наследованный от Cat::IntegralDomain.

Наследованный от Dom::BaseDomain.

Наследованный от Cat::BaseCategory.

evalp(a, var = e)

Этот метод перегружает функциональный evalp для полиномов.

factor(a)

Этот метод перегружает функциональный factor для полиномов.

Примечание

Этот метод только существует, если R является областью категории Cat::Field или если R является доменный Dom::Integer.

func_call(a, e1, …, en, <Expr>)

func_call(a, e1, …, en, <Expr>)

func_call(a, e1, …, en, <Expr>)

a(e1,...,en) применяет последовательность e1,...,en или элементов этой области или элементов R относительно Vars (где n является количеством переменных) к полиномиальному a. Элемент этой области или элемент содействующего звонка соответственно возвращены.

a(e1,...,en, Expr) применяет последовательность выражений или элементов этой области или элементов R к полиномиальному a. С этим вызовом a сначала преобразован в выражение. Впоследствии e1,...,en заменяют в это выражение относительно Vars. Возвращаемое значение может быть любым объектом.

Количество переменных должно быть равно количеству прикладных выражений.

Примечание

Этот метод только существует, если Vars имеет по крайней мере один неопределенный.

gcd(a, b, …)

Этот метод перегружает функциональный gcd для полиномов.

Примечание

Этот метод только существует, если R является областью категории Cat::GcdDomain.

gcdex(a, b)

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

Примечание

Этот метод только существует, если R является областью категории Cat::GcdDomain.

groebner(ais, <ord>, <Reorder>)

groebner(ais, <ord>, <Reorder>)

Если опция, которую Reorder дан, лексикографический порядок переменных, может измениться на другой, который, вероятно, уменьшит время выполнения.

Примечание

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

Этот метод является просто интерфейсом для функционального groebner::gbasis.

Примечание

Этот метод только существует, если R является полем, т.е. областью категории Cat::Field, и Vars не является пустым списком.

Наследованный от Cat::EuclideanDomain.

int(a, <x>)

int(a, <x = x0 .. x1>)

int(a,x=x0..x1) возвращает определенный интеграл или FAIL, если результатом не является элемент этой области или элемент полиномиальной области по Dom::Fraction(R).

Этот метод перегружает функциональный int для полиномов.

intmult(a, z)

Этот метод более эффективен, чем использование умножения полиномов и, например, необходим для метода "Dpoly".

Наследованный от Cat::FactorialDomain.

Наследованный от Cat::Polynomial.

isone(a)

Примечание

Результат может только быть допустимым, если коэффициенты a находятся в нормальной форме (т.е. если нуль имеет уникальное представление в R). Таким образом R должен иметь, по крайней мере, Ax::normalRep.

iszero(a)

Примечание

Результат может только быть допустимым, если коэффициенты a находятся в нормальной форме (т.е. если нуль имеет уникальное представление в R). Таким образом, коэффициент звонят, R должен иметь, по крайней мере, Ax::normalRep.

lcm(a, b, …)

Этот метод перегружает функциональный lcm для полиномов.

Примечание

Этот метод только существует, если R является областью категории Cat::GcdDomain.

makeIntegral(a)

Примечание

Этот метод только существует, если R является областью категории, Cat::GcdDomain и R имеют метод "denom".

monic(a)

Нулевой полином возвращает себя.

Примечание

Этот метод только существует, если R является полем, т.е. областью категории Cat::Field.

normalForm(a, ais, <ord>)

normalForm(a, ais, <ord>)

Этот метод является просто интерфейсом для функционального groebner::normalf.

Примечание

Этот метод только существует, если R является полем, т.е. областью категории Cat::Field, и Vars не является пустым списком.

pdioe(a, b, c)

Этот метод перегружает функциональный solvelib::pdioe.

Примечание

Этот метод только существует, если R является полем, т.е. областью категории, Cat::Field и Vars состоят из одной переменной.

pdivide(a, b, <Quo | Rem>)

Если опция, которую Quo дан, только псевдочастное q, возвращена.

Если опция, которую Rem дан, только псевдоостаток r, возвращена.

Этот метод перегружает функциональный pdivide для полиномов.

Примечание

Этот метод только существует, если Vars состоит из одной переменной.

pquo(a, b)

Примечание

Этот метод только существует, если Vars состоит из одной переменной.

prem(a, b)

Примечание

Этот метод только существует, если Vars состоит из одной переменной.

Наследованный от Cat::Polynomial.

Наследованный от Cat::EuclideanDomain.

random()

С каждым вызовом глобальная переменная SEED изменяется вызовом random(). Таким образом трудно создать ту же случайную последовательность дважды, видеть random.

Если параметр, Vars является пустым списком, сначала списком 1 - 4 переменных, сгенерирован случайным образом, и случайный полином сгенерирован в этих indeterminates впоследствии.

Этот метод перегружает функциональный polylib::randpoly для полиномов.

Наследованный от Cat::EuclideanDomain.

resultant(a, b, <var>)

resultant(a, b, var) возвращает результант a и b относительно переменной var.

Возвращенное значение является полиномом этой области или FAIL.

Этот метод перегружает функциональный polylib::resultant для полиномов.

Примечание

Этот метод только существует, если R имеет метод "_divide".

ringmult(a, c)

solve(a, <var>, <options>)

solve(a, <vars>, <options>)

solve(ais, <var>, <options>)

solve(ais, <vars>, <options>)

solve(ais, ..) пытается найти нули полиномиальной системы ais. Точное поведение зависит от дальнейших аргументов.

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

Этот метод перегружает функциональный solve.

SPolynomial(a, b, <ord>)

Этот метод является просто интерфейсом для функционального groebner::spoly.

Примечание

Этот метод только существует, если R является полем, т.е. областью категории Cat::Field, и Vars не является пустым списком.

sqrfree(a)

ai является примитивными и попарными различными делителями без квадратов a и представленный как элементы этой области. u является модулем содействующего звонка и представленный как элемент этой области. ei является целыми числами.

Этот метод перегружает функциональный polylib::sqrfree для полиномов.

Примечание

Этот метод только существует, если R является полем, т.е. областью категории Cat::Field, или если R является Dom::Integer.

Наследованный от Cat::Polynomial.

Наследованный от Cat::Polynomial.

Методы доступа

coeff(a)

coeff(a, var, n)

coeff(a, n)

coeff(a,var,n) возвращает коэффициент термина var^n — как элемент этой области, если это имеет категорию Cat::Polynomial(R), или когда элемент коэффициента звонит R, если это имеет Cat::UnivariatePolynomial(R), где a рассматривается как одномерный полином в действительной переменной var.

coeff(a,n) возвращает коэффициент термина var^n — как элемент этой области, если это имеет категорию Cat::Polynomial(R), или когда элемент коэффициента звонит R, если это имеет Cat::UnivariatePolynomial(R), где a рассматривается как одномерный полином в var, и var является основной переменной a, т.е. переменной, возвращенной dom::mainvar(a).

Этот метод перегружает функциональный coeff для полиномов.

degree(a)

degree(a, var)

degree(a, var) возвращает степень a относительно var.

Степень нулевого полинома задана как нуль.

Этот метод перегружает функциональный degree для полиномов.

degreevec(a, <ord>)

Вектор степени нулевого полинома задан как список нулей.

Этот метод перегружает функциональный degreevec для полиномов.

euclideanDegree(a)

Примечание

Этот метод только существует, если Vars состоит из одной переменной.

ground(a)

Этот метод перегружает функциональный ground для полиномов.

has(a, obj)

Этот метод перегружает функциональный has.

indets(<a>)

В случае, если Vars не является пустым списком, indets может быть назван без аргумента.

Поскольку эта область позволяет выражения как indeterminates, возвращенный набор может содержать выражения, также.

Этот метод перегружает функциональный indets для полиномов.

lcoeff(a)

lcoeff(a, <vars>, <ord>)

lcoeff(a, ord) возвращает ведущий коэффициент a относительно одночлена, заказывая ord, когда элемент коэффициента звонит R.

lcoeff(a, vars, ord) возвращает ведущий коэффициент a относительно списка переменных vars и одночлен, заказывая ord как элемент этой области, если это имеет категорию Cat::Polynomial(R), или когда элемент коэффициента звонит R, если это имеет Cat::UnivariatePolynomial(R).

  • Если ord не будет явно задан, лексикографический порядок, то LexOrder будет использоваться вместо этого.

  • Это пытается преобразовать a в полином в заданном списке indeterminates vars по содействующему звонку R и возвращает FAIL, если это преобразования перестало работать.

Этот метод перегружает функциональный lcoeff для полиномов.

ldegree(a)

ldegree(a, x)

ldegree(a, x) возвращает самую низкую степень переменной x в a.

Этот метод перегружает функциональный ldegree для полиномов.

lmonomial(a, <ord>)

lmonomial(a, <vars>, <ord>, <Rem>)

lmonomial(a, vars, ord) возвращает ведущий одночлен a относительно списка переменных vars и одночлен, заказывая ord как элемент этой области.

  • Если ord не будет явно задан, лексикографический порядок, то LexOrder будет использоваться вместо этого.

  • Это пытается преобразовать a в полином в заданном списке indeterminates vars по содействующему звонку R и возвращает FAIL, если это преобразования перестало работать.

lmonomial(a, vars, ord, Rem) возвращает список, состоящий из ведущего одночлена и reductum a относительно списка переменных vars и одночлен, заказывая ord как список элементов этой области.

  • Если ord не будет явно задан, лексикографический порядок, то LexOrder будет использоваться вместо этого.

  • Это пытается преобразовать a в полином в заданном списке indeterminates vars по содействующему звонку R и возвращает FAIL, если это преобразования перестало работать.

Примечание

В MuPAD® одночлен обозначает коэффициент вместе с продуктом степени как, например, 3 x2.

Этот метод перегружает функциональный lmonomial для полиномов.

lterm(a)

lterm(a, <vars>, <ord>)

lterm(a, ord) возвращает ведущий коэффициент a относительно одночлена, заказывая ord как элемент этой области.

lterm(a, vars, ord) возвращает ведущий термин a относительно списка переменных vars и одночлен, заказывая ord как элемент этой области.

  • Если ord не будет явно задан, лексикографический порядок, то LexOrder будет использоваться вместо этого.

  • Это пытается преобразовать a в полином в заданном списке indeterminates vars по содействующему звонку R и возвращает FAIL, если это преобразования перестало работать.

Примечание

В MuPAD термин обозначает продукт степени без коэффициента как, например, x 2 y3 z.

Этот метод перегружает функциональный lterm для полиномов.

mainvar(<a>)

Если Vars не является пустым списком, mainvar может быть назван без аргумента.

mapcoeffs(a, f, <e1, …>)

Этот метод перегружает функциональный mapcoeffs для полиномов.

multcoeffs(a, c)

Этот метод перегружает функциональный multcoeffs для полиномов.

nterms(a)

Этот метод перегружает функциональный nterms для полиномов.

nthcoeff(a, n, <ord>)

Если n больше, чем количество одночленов полинома затем, функция возвращает FAIL.

Нулевой полином не имеет никаких одночленов. nthcoeff возвращает FAIL, когда вызвано на нулевой полином.

Этот метод перегружает функциональный nthcoeff для полиномов.

nthmonomial(a, n, <ord>)

Если n больше, чем количество одночленов полинома затем, функция возвращает FAIL.

Нулевой полином не имеет никаких одночленов. nthmonomial возвращает FAIL для нулевого полинома.

Этот метод перегружает функциональный nthmonomial для полиномов.

nthterm(a, n, <ord>)

Если n больше, чем количество одночленов полинома затем, функция возвращает FAIL.

Нулевой полином не имеет никаких одночленов. nthterm возвращает FAIL, когда названо нулевым полиномом.

Этот метод перегружает функциональный nthterm для полиномов.

orderedVariableList(<a>)

В случае, если Vars не является пустым списком, orderedVariableList может быть назван без аргумента.

pivotSize(a)

Этот метод называется, если эта область используется в качестве звонка компонента матричной области, чтобы выполнить Исключение Гаусса.

reductum(a, <ord>)

Наследованный от Dom::BaseDomain.

Наследованный от Dom::BaseDomain.

tcoeff(a, <ord>)

Этот метод перегружает функциональный tcoeff для полиномов.

Методы преобразования

Наследованный от Cat::BaseCategory.

convert(p)

Наследованный от Dom::BaseDomain.

expr(a)

Этот метод перегружает функциональный expr.

poly(a)

Этот метод перегружает функциональный poly.

TeXCoeff(c)

TeXident(var)

TeXTerm(t)

Технические методы

adaptIndets(<a, b, …>)

Примечание

Этот метод только существует, если параметр Vars является пустым списком ([]).

Наследованный от Dom::BaseDomain.

Наследованный от Dom::BaseDomain.

Наследованный от Dom::BaseDomain.

Наследованный от Dom::BaseDomain.

Наследованный от Dom::BaseDomain.

Наследованный от Dom::BaseDomain.

Наследованный от Dom::BaseDomain.

Наследованный от Dom::BaseDomain.

Наследованный от Dom::BaseDomain.

isNeg(a)

mult(a, b, …)

new(p)

new(lm)

new(lm, v)

dom(p) создает элемент этой области от полинома или многочленного выражения p и возвращает тот элемент. Если это не возможно, сообщение об ошибке дано.

Если Vars выбран в качестве пустого списка ([]) затем в создании новых элементов от многочленного или многочленного выражения, функциональный indets сначала называется, чтобы получить идентификаторы. Впоследствии элемент создается с этим списком идентификаторов. Для создания элемента от константы введена фиктивная переменная _dummy. Недостаток этого подхода - то, что два математически равных полинома могут иметь списки переменных, которые отличаются фиктивной переменной.

dom(lm) создает, если Vars не является пустым списком [], полином из списка lm формы, [[c1, [e11,... e1n]],... [cm,[em1,... emn]]], где ci коэффициенты и eij, является экспонентами относительно Vars. Для одномерного полинома этот список может быть упрощен до [[c1,e1],... [cm,em]].

dom(lm,v) создает, если Vars = [], полином из списка lm формы [[c1, [e11,... e1n]],... [cm,[em1,... emn]]], где ci коэффициенты и eij, являются экспонентами относительно v. Для одномерного полинома этот список может быть упрощен до [[c1,e1],... [cm,em]]. Список indeterminates v должен содержать допустимый indeterminates.

plus(a, b, …)

print(a)

Этот метод перегружает функциональный print.

Наследованный от Dom::BaseDomain.

printMonomial(c, d, v)

printTerm(d)

printTerm(d, v)

printTerm(d,v) возвращает упорядоченную последовательность indeterminates вместе с их степенями, как дали в списке переменных v и вектор степени d соответственно.

Обратите внимание на то, что этот вызов только допустим если nops(v)=nops(d).

Rep(a)

sign(a)

Примечание: этот метод не имеет значения математической знаковой функции!

Наследованный от Cat::BaseCategory.

Наследованный от Dom::BaseDomain.

Наследованный от Dom::BaseDomain.

Смотрите также

Области MuPAD