/usr/share/axiom-20170501/src/algebra/RDEEFS.spad is in axiom-source 20170501-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | )abbrev package RDEEFS ElementaryRischDESystem
++ Author: Manuel Bronstein
++ Date Created: 12 August 1992
++ Date Last Updated: 17 August 1992
++ Description:
++ Risch differential equation, elementary case.
ElementaryRischDESystem(R, F) : SIG == CODE where
R : Join(GcdDomain, OrderedSet, CharacteristicZero,
RetractableTo Integer, LinearlyExplicitRingOver Integer)
F : Join(TranscendentalFunctionCategory, AlgebraicallyClosedField,
FunctionSpace R)
Z ==> Integer
SE ==> Symbol
K ==> Kernel F
P ==> SparseMultivariatePolynomial(R, K)
UP ==> SparseUnivariatePolynomial F
RF ==> Fraction UP
NL ==> Record(coeff:F,logand:F)
RRF ==> Record(mainpart:F,limitedlogs:List NL)
U ==> Union(RRF, "failed")
ULF ==> Union(List F, "failed")
UEX ==> Union(Record(ratpart:F, coeff:F), "failed")
SIG ==> with
rischDEsys : (Z, F, F, F, SE, (F, List F) -> U, (F, F) -> UEX) -> ULF
++ rischDEsys(n, f, g_1, g_2, x,lim,ext) returns \spad{y_1.y_2} such that
++ \spad{(dy1/dx,dy2/dx) + ((0, - n df/dx),(n df/dx,0)) (y1,y2) = (g1,g2)}
++ if \spad{y_1,y_2} exist, "failed" otherwise.
++ lim is a limited integration function,
++ ext is an extended integration function.
CODE ==> add
import IntegrationTools(R, F)
import ElementaryRischDE(R, F)
import TranscendentalRischDESystem(F, UP)
import PolynomialCategoryQuotientFunctions(IndexedExponents K,
K, R, P, F)
basecase : (F, F, F, K) -> ULF
-- solve (y1',y2') + ((0, -nfp), (nfp, 0)) (y1,y2) = (g1, g2), base case
basecase(nfp, g1, g2, k) ==
(ans := baseRDEsys(univariate(nfp, k), univariate(g1, k),
univariate(g2, k))) case "failed" => "failed"
l := ans::List(RF)
[multivariate(first l, k), multivariate(second l, k)]
-- solve (y1',y2') + ((0, -n f'), (n f', 0)) (y1,y2) = (g1, g2)
rischDEsys(n, f, g1, g2, x, limint, extint) ==
zero? g1 and zero? g2 => [0, 0]
zero?(nfp := n * differentiate(f, x)) =>
((u1 := limint(g1, empty())) case "failed") or
((u2 := limint(g1, empty())) case "failed") => "failed"
[u1.mainpart, u2.mainpart]
freeOf?(y1 := g2 / nfp, x) and freeOf?(y2 := - g1 / nfp, x) => [y1, y2]
vl := varselect(union(kernels nfp, union(kernels g1, kernels g2)), x)
symbolIfCan(k := kmax vl) case SE => basecase(nfp, g1, g2, k)
error "rischDEsys: can only handle rational functions for now"
|