==================================================================== Linear Ordinary DifferentialOperator 1 ==================================================================== LinearOrdinaryDifferentialOperator1(A) is the domain of linear ordinary differential operators with coefficients in the differential ring A. ------------------------------ Rational Function Coefficients ------------------------------ This example shows differential operators with rational function coefficients. In this case operator multiplication is non-commutative and, since the coefficients form a field, an operator division algorithm exists. We begin by defining RFZ to be the rational functions in x with integer coefficients and Dx to be the differential operator for d/dx. :: RFZ := Fraction UnivariatePolynomial('x, Integer) Fraction UnivariatePolynomial(x,Integer) Type: Domain x : RFZ := 'x x Type: Fraction UnivariatePolynomial(x,Integer) Dx : LODO1 RFZ := D() D Type: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) Operators are created using the usual arithmetic operations. :: b : LODO1 RFZ := 3*x**2*Dx**2 + 2*Dx + 1/x 2 2 1 3x D + 2D + - x Type: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) a : LODO1 RFZ := b*(5*x*Dx + 7) 3 3 2 2 7 15x D + (51x + 10x)D + 29D + - x Type: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) Operator multiplication corresponds to functional composition. :: p := x**2 + 1/x**2 4 x + 1 ------ 2 x Type: Fraction UnivariatePolynomial(x,Integer) Since operator coefficients depend on x, the multiplication is not commutative. :: (a*b - b*a) p 4 - 75x + 540x - 75 ------------------ 4 x Type: Fraction UnivariatePolynomial(x,Integer) When the coefficients of operator polynomials come from a field, as in this case, it is possible to define operator division. Division on the left and division on the right yield different results when the multiplication is non-commutative. The results of leftDivide and rightDivide are quotient-remainder pairs satisfying: :: leftDivide(a,b) = [q, r] such that a = b*q + r rightDivide(a,b) = [q, r] such that a = q*b + r In both cases, the degree of the remainder, r, is less than the degree of b. :: ld := leftDivide(a,b) [quotient= 5x D + 7,remainder= 0] Type: Record(quotient: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer), remainder: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)) a = b * ld.quotient + ld.remainder 3 3 2 2 7 3 3 2 2 7 15x D + (51x + 10x)D + 29D + -= 15x D + (51x + 10x)D + 29D + - Type: Equation LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) The operations of left and right division are so-called because the quotient is obtained by dividing a on that side by b. :: rd := rightDivide(a,b) [quotient= 5x D + 7,remainder= 10D + -] Type: Record(quotient: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer), remainder: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer)) a = rd.quotient * b + rd.remainder 3 3 2 2 7 3 3 2 2 7 15x D + (51x + 10x)D + 29D + -= 15x D + (51x + 10x)D + 29D + - Type: Equation LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) Operations rightQuotient and rightRemainder are available if only one of the quotient or remainder are of interest to you. This is the quotient from right division. :: rightQuotient(a,b) 5x D + 7 Type: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) This is the remainder from right division. The corresponding "left" functions, leftQuotient and leftRemainder are also available. :: rightRemainder(a,b) 5 10D + - x Type: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) For exact division, operations leftExactQuotient and rightExactQuotient are supplied. These return the quotient but only if the remainder is zero. The call rightExactQuotient(a,b) would yield an error. :: leftExactQuotient(a,b) 5x D + 7 Type: Union(LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer),...) The division operations allow the computation of left and right greatest common divisors, leftGcd and rightGcd via remainder sequences, and consequently the computation of left and right least common multiples, rightLcm and leftLcm. :: e := leftGcd(a,b) 2 2 1 3x D + 2D + - x Type: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) Note that a greatest common divisor doesn't necessarily divide a and b on both sides. Here the left greatest common divisor does not divide a on the right. :: leftRemainder(a, e) 0 Type: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) rightRemainder(a, e) 5 10D + - x Type: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) Similarly, a least common multiple is not necessarily divisible from both sides. :: f := rightLcm(a,b) 3 3 2 2 7 15x D + (51x + 10x)D + 29D + - Type: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) rightRemainder(f, b) 5 10D + - x Type: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) leftRemainder(f, b) 0 Type: LinearOrdinaryDifferentialOperator1 Fraction UnivariatePolynomial(x,Integer) See Also: * )show LinearOrdinaryDifferentialOperator1