На
нескольких примерах будет показано как
использовать Domains . Заметим, что
все функции Domains начинаются с
заглавной буквы. Вначале загрузим пакет Domains
.
> restart;with(Domains);
----------------------- Domains version 1.0
----------------------
Initially defined domains are Z and Q the integers and rationals
Abbreviations, e.g. DUP for DenseUnivariatePolynomial, also made
При загрузке были определены области Z
(целых чисел) и Q (рациональных чисел). Давайте
проделаем несколько вычислений. Найдем
наибольший общий делитель чисел 345 и 60.
> Z[Gcd](345,60);
Перемножим несколько рациональных
чисел
> Q[`*`](3/2,7/3,12/5);
Можно проверить являются ли Z и Q
таблицами Maple
> type(Q,table);
Они содержат операции (Maple процедуры) для
вычислений в Z и Q Какие операции доступны?
> show(Q,operations);
Signatures for constructor Q
note: operations prefixed by -- are not available
* : (Q,Q*) -> Q
* : (Integer,Q) -> Q
+ : (Q,Q*) -> Q
- : Q -> Q
- : (Q,Q) -> Q
/ : (Q,Q) -> Q
/ : (Q,Integer) -> Q
0 : Q
1 : Q
< : (Q,Q) -> Boolean
<= : (Q,Q) -> Boolean
<> : (Q,Q) -> Boolean
= : (Q,Q) -> Boolean
> : (Q,Q) -> Boolean
>= : (Q,Q) -> Boolean
AbsoluteDegree : Integer
BaseDomain : IntegralDomain
Characteristic : Integer
Coerce : Integer -> Q
Denom : Q -> G
Div : (Q,Q) -> Union(Q,FAIL)
EuclideanNorm : Q -> Integer
Factor : Q -> [Q,[[Q,Integer]*]]
Gcd : Q* -> Q
Gcdex : (Q,Q,Name,Name) -> Q
Gcdex : (Q,Q,Name) -> Q
Input : Expression -> Union(Q,FAIL)
Inv : Q -> Union(Q,FAIL)
Lcm : Q* -> Q
Max : (Q,Q*) -> Q
Min : (Q,Q*) -> Q
ModularHomomorphism : () -> (Q -> Union(Integer,FAIL),Integer)
Normal : Q -> Q
Numer : Q -> G
Output : Q -> Expression
Powmod : (Q,Integer,Q) -> Q
Prime : Q -> Boolean
Quo : (Q,Q) -> Q
Quo : (Q,Q,Name) -> Q
Random : () -> Q
RelativelyPrime : (Q,Q) -> Boolean
Rem : (Q,Q,Name) -> Q
Rem : (Q,Q) -> Q
Sign : Q -> UNION(1,-1,0)
Slash : (G,G) -> Q
SmallerEuclideanNorm : (Q,Q) -> Boolean
Sqrfree : Q -> [Q,[[Q,Integer]*]]
Type : Expression -> Boolean
Unit : Q -> Q
UnitNormal : Q -> [Q,Q,Q]
Zero : Q -> Boolean
^ : (Q,Integer) -> Q
Давайте выполним некоторые операции в
Q[x], то есть в области полиномов от одной
переменной над Q. Вначале нужно создать домен Q[x],
назовем его C
> C :=
DenseUnivariatePolynomial(Q,x):
Имя DenseUnivaritePolynomial указывает, что
используемая структура данных является плотной.
Каждый домен пакета Domains имеет
функцию Random , которая возвращает случайно
сгенерированный элемент из домена, который можно
использовать для написания примеров.
Можно ввести случайный полином.
> a := C[Random]();
Теперь выведем полином m
> C[Output](a);
Можно вычислить степень полинома.
> C[Degree](a);
Квдрат полинома
> C[`^`](a,2);
Domains может также оперировать с
матрицами и другими объектами. Давайте вычислим
обратную матрицу к 3на 3 матрице Гильберта.
Вначале мы должны создать матричный домен
> M3 := SquareMatrix(3,Q):
A := M3[Input]([[1,2,3],[1,1/2,1/3],[3,1/4,5]]);
> M3[Det](A);
> M3[Inv](A);
Давайте теперь вычислим матрицы
полиномов в Q[x]. Будем использовать матрицы 2 на 2,
чтобы примеры не получились очень громоздкими.
> M2 := SquareMatrix(2,C):
A := M2[Input]([[1,x^3],[1-x,1+x^3]]);
Вычислим определитель матрицы
> C[Output]( M2[Det](A) );
Вычислим квадрат матрицы
> M2[Output](M2[`^`](A,2));
Вычислим обратную матрицу
> M2[Output]( M2[Inv](A));
Error, (in notImplemented) operation is not
implemented
Программа вывела сообщение об ошибке,
так как нельзя вычислить обратную матрицу от
матрицы полиномов, так как результат в общем
случае - рациональная функция (не полином).
В следующих примерах приводятся
вычисления со степенными рядами от одной
переменной. Вначале создадим домен обрезанных
степенных рядов от x над Q.
> PS :=
LazyUnivariatePowerSeries(Q,x):
show(PS,operations);
Signatures for constructor PS
note: operations prefixed by -- are not available
* : (Integer,PS) -> PS
* : (PS,PS*) -> PS
+ : (PS,PS*) -> PS
- : PS -> PS
- : (PS,PS) -> PS
/ : (PS,PS) -> PS
/ : (PS,Integer) -> PS
0 : PS
1 : PS
<> : (PS,PS) -> Boolean
= : (PS,PS) -> Boolean
-- AbsoluteDegree : Integer
Characteristic : Integer
Coeff : (PS,Integer) -> Q
CoefficientRing : Ring
Coerce : Integer -> PS
Constant : Q -> PS
Cos : PS -> Union(PS,FAIL)
Cosh : PS -> Union(PS,FAIL)
Diff : PS -> PS
Div : (PS,PS) -> Union(PS,FAIL)
EuclideanNorm : PS -> Integer
Exp : PS -> Union(PS,FAIL)
Factor : PS -> [PS,[[PS,Integer]*]]
Gcd : PS* -> PS
Gcdex : (PS,PS,Name) -> PS
Gcdex : (PS,PS,Name,Name) -> PS
Input : Expression -> Union(PS,FAIL)
Integrate : PS -> Union(PS,FAIL)
Inv : PS -> PS
Lcm : PS* -> PS
Ln : PS -> Union(PS,FAIL)
Log : PS -> Union(PS,FAIL)
Lorder : PS -> Integer
Monomial : () -> PS
Monomial : Integer -> PS
Normal : PS -> PS
Output : PS -> Expression
Powmod : (PS,Integer,PS) -> PS
Prime : PS -> Boolean
Quo : (PS,PS,Name) -> PS
Quo : (PS,PS) -> PS
R* : (Q,PS) -> PS
R/ : (PS,Q) -> PS
Random : () -> PS
RelativelyPrime : (PS,PS) -> Boolean
Rem : (PS,PS,Name) -> PS
Rem : (PS,PS) -> PS
Series : [[Q,Integer]] -> PS
Shift : (PS,Integer) -> PS
Sin : PS -> Union(PS,FAIL)
Sinh : PS -> Union(PS,FAIL)
SmallerEuclideanNorm : (PS,PS) -> Boolean
Sqrfree : PS -> [PS,[[PS,Integer]*]]
Tan : PS -> Union(PS,FAIL)
Tanh : PS -> Union(PS,FAIL)
Type : Expression -> Boolean
Unit : PS -> PS
UnitNormal : PS -> [PS,PS,PS]
Variable : Name
^ : (PS,Integer) -> PS
^ : (PS,Rational) -> PS
^ : (PS,PS) -> PS
order : PS -> Integer
Давайте вычислим степенной ряд sin(x)
> a := PS[Input](x);
> s := PS[Sin](a);
> s1:=PS[`Diff`](s,x); # sin(x)^(1/2)
Обрезанные степенные ряды "ленивы",
это означает, что коэффициенты вычисляются не
сразу, а по требованию, то есть чтобы вычислить
ряд более высокого порядка, нужно явно указать
порядок полинома в команде, например.
> PS[Output](s1,10);
Далее вычислим полиномы Чебышева по их
производящей функции:
(1-x*t)/(1-2*x*t+t^2) = sum( T(n,x)*t^k, k=0.. )
Вначеле создадим домен LUPS == LazyUnivariatePowerSeries.
> P := LUPS(LUPS(Q,x),t):
Вводим выражение
> p1 := P[Input](1-2*x*t+t^2);
> p2:=P[Input](1-t*x);
Теперь находим разложение в ряд по t
величины p^(-1/2)
> P[`/`](p2, p1);
Сравним полученную формулу с формулами
для полиномов Чебышева, имеющихся в Maple
> seq(orthopoly[T](i,x), i=0..5);
|