Revision: 2626
http://sourceforge.net/p/fricas/code/2626
Author: whebisch
Date: 2020-03-02 14:55:49 +0000 (Mon, 02 Mar 2020)
Log Message:
-----------
Generalize GENUPS
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/algebra/Makefile.in
trunk/src/algebra/genups.spad
trunk/src/input/series3.input
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2020-03-02 14:08:05 UTC (rev 2625)
+++ trunk/ChangeLog 2020-03-02 14:55:49 UTC (rev 2626)
@@ -1,5 +1,10 @@
2020-03-02 Waldek Hebisch <
heb...@math.uni.wroc.pl>
+ * src/algebra/genups.spad: Generalize
+ src/algebra/Makefile.in: Adjust
+
+2020-03-02 Waldek Hebisch <
heb...@math.uni.wroc.pl>
+
* src/algebra/fspace.spad: Fix input form of
formal derivatives
Modified: trunk/src/algebra/Makefile.in
===================================================================
--- trunk/src/algebra/Makefile.in 2020-03-02 14:08:05 UTC (rev 2625)
+++ trunk/src/algebra/Makefile.in 2020-03-02 14:55:49 UTC (rev 2626)
@@ -164,7 +164,7 @@
FTEM FT FUNCTION FVC FVFUN \
GALFACT GALFACTU GALPOLYU GAUSSFAC GBEUCLID \
GBF GBINTERN GB GCDBAS GCDDOM GCNAALG GDMP GDRAW \
- GENEEZ GENMFACT GENMOEBF GENPGCD GENUPS GENUSER GHENSEL \
+ GENEEZ GENMFACT GENMOEBF GENPGCD GENUPS GENUPS1 GENUPS2 GENUSER GHENSEL \
GMODPOL GOSPER GPOLCAT GPOLSET GRALG GRAY GRDEF \
GRIMAGE GRMOD GROEBSOL GROUP GROUPP GROUPPF1 GSERIES GSTBL \
GTSET HACKPI HANKP HASHSTAT HASHTBL HB HDMP HDP \
Modified: trunk/src/algebra/genups.spad
===================================================================
--- trunk/src/algebra/genups.spad 2020-03-02 14:08:05 UTC (rev 2625)
+++ trunk/src/algebra/genups.spad 2020-03-02 14:55:49 UTC (rev 2626)
@@ -1,6 +1,5 @@
-)abbrev package GENUPS GenerateUnivariatePowerSeries
-++ Author: Clifton J. Williamson
-++ Date Created: 29 April 1990
+)abbrev package GENUPS1 GenerateUnivariatePowerSeries1
+++ Author: Clifton J. Williamson, Waldek Hebisch
++ Basic Operations:
++ Related Domains:
++ Also See:
@@ -11,11 +10,8 @@
++ Description:
++ \spadtype{GenerateUnivariatePowerSeries} provides functions that create
++ power series from explicit formulas for their \spad{n}th coefficient.
-GenerateUnivariatePowerSeries(R, FE) : Exports == Implementation where
- R : Join(IntegralDomain, Comparable, RetractableTo Integer, _
- LinearlyExplicitOver Integer)
- FE : Join(AlgebraicallyClosedField, TranscendentalFunctionCategory, _
- FunctionSpace R)
+GenerateUnivariatePowerSeries1(R) : Exports == Implementation where
+ R : Ring
ANY1 ==> AnyFunctions1
EQ ==> Equation
I ==> Integer
@@ -29,78 +25,48 @@
UPXS ==> UnivariatePuiseuxSeries
Exports ==> with
- taylor : (I -> FE, EQ FE) -> Any
- ++ \spad{taylor(n +-> a(n), x = a)} returns
+ taylor : (I -> R, SY, R) -> Any
+ ++ \spad{taylor(n +-> a(n), x, a)} returns
++ \spad{sum(n = 0.., a(n)*(x-a)^n)}.
- taylor : (FE, SY, EQ FE) -> Any
- ++ \spad{taylor(a(n), n, x = a)} returns \spad{sum(n = 0.., a(n)*(x-a)^n)}.
- taylor : (I -> FE, EQ FE, SEG NNI) -> Any
- ++ \spad{taylor(n +-> a(n), x = a, n0..)} returns
+ taylor : (I -> R, SY, R, SEG NNI) -> Any
+ ++ \spad{taylor(n +-> a(n), x, a, n0..)} returns
++ \spad{sum(n=n0.., a(n)*(x-a)^n)};
- ++ \spad{taylor(n +-> a(n), x = a, n0..n1)} returns
+ ++ \spad{taylor(n +-> a(n), x, a, n0..n1)} returns
++ \spad{sum(n = n0.., a(n)*(x-a)^n)}.
- taylor : (FE, SY, EQ FE, SEG NNI) -> Any
- ++ \spad{taylor(a(n), n, x = a, n0..)} returns
- ++ \spad{sum(n = n0.., a(n)*(x-a)^n)};
- ++ \spad{taylor(a(n), n, x = a, n0..n1)} returns
- ++ \spad{sum(n = n0.., a(n)*(x-a)^n)}.
- laurent : (I -> FE, EQ FE, SEG I) -> Any
- ++ \spad{laurent(n +-> a(n), x = a, n0..)} returns
+ laurent : (I -> R, SY, R, SEG I) -> Any
+ ++ \spad{laurent(n +-> a(n), x, a, n0..)} returns
++ \spad{sum(n = n0.., a(n) * (x - a)^n)};
- ++ \spad{laurent(n +-> a(n), x = a, n0..n1)} returns
+ ++ \spad{laurent(n +-> a(n), x, a, n0..n1)} returns
++ \spad{sum(n = n0..n1, a(n) * (x - a)^n)}.
- laurent : (FE, SY, EQ FE, SEG I) -> Any
- ++ \spad{laurent(a(n), n, x=a, n0..)} returns
- ++ \spad{sum(n = n0.., a(n) * (x - a)^n)};
- ++ \spad{laurent(a(n), n, x=a, n0..n1)} returns
- ++ \spad{sum(n = n0..n1, a(n) * (x - a)^n)}.
- puiseux : (RN -> FE, EQ FE, SEG RN, RN) -> Any
- ++ \spad{puiseux(n +-> a(n), x = a, r0.., r)} returns
+ puiseux : (RN -> R, SY, R, SEG RN, RN) -> Any
+ ++ \spad{puiseux(n +-> a(n), x, a, r0.., r)} returns
++ \spad{sum(n = r0, r0 + r, r0 + 2*r..., a(n) * (x - a)^n)};
++ \spad{puiseux(n +-> a(n), x = a, r0..r1, r)} returns
++ \spad{sum(n = r0 + k*r while n <= r1, a(n) * (x - a)^n)}.
- puiseux : (FE, SY, EQ FE, SEG RN, RN) -> Any
- ++ \spad{puiseux(a(n), n, x = a, r0.., r)} returns
- ++ \spad{sum(n = r0, r0 + r, r0 + 2*r..., a(n) * (x - a)^n)};
- ++ \spad{puiseux(a(n), n, x = a, r0..r1, r)} returns
- ++ \spad{sum(n = r0 + k*r while n <= r1, a(n) * (x - a)^n)}.
- series : (I -> FE, EQ FE) -> Any
+ series : (I -> R, SY, R) -> Any
++ \spad{series(n +-> a(n), x = a)} returns
++ \spad{sum(n = 0.., a(n)*(x-a)^n)}.
- series : (FE, SY, EQ FE) -> Any
- ++ \spad{series(a(n), n, x = a)} returns
- ++ \spad{sum(n = 0.., a(n)*(x-a)^n)}.
- series : (I -> FE, EQ FE, SEG I) -> Any
- ++ \spad{series(n +-> a(n), x = a, n0..)} returns
+ series : (I -> R, SY, R, SEG I) -> Any
+ ++ \spad{series(n +-> a(n), x, a, n0..)} returns
++ \spad{sum(n = n0.., a(n) * (x - a)^n)};
- ++ \spad{series(n +-> a(n), x = a, n0..n1)} returns
+ ++ \spad{series(n +-> a(n), x, a, n0..n1)} returns
++ \spad{sum(n = n0..n1, a(n) * (x - a)^n)}.
- series : (FE, SY, EQ FE, SEG I) -> Any
- ++ \spad{series(a(n), n, x=a, n0..)} returns
- ++ \spad{sum(n = n0.., a(n) * (x - a)^n)};
- ++ \spad{series(a(n), n, x=a, n0..n1)} returns
- ++ \spad{sum(n = n0..n1, a(n) * (x - a)^n)}.
- series : (RN -> FE, EQ FE, SEG RN, RN) -> Any
+ series : (RN -> R, SY, R, SEG RN, RN) -> Any
++ \spad{series(n +-> a(n), x = a, r0.., r)} returns
++ \spad{sum(n = r0, r0 + r, r0 + 2*r..., a(n) * (x - a)^n)};
++ \spad{series(n +-> a(n), x = a, r0..r1, r)} returns
++ \spad{sum(n = r0 + k*r while n <= r1, a(n) * (x - a)^n)}.
- series : (FE, SY, EQ FE, SEG RN, RN) -> Any
- ++ \spad{series(a(n), n, x = a, r0.., r)} returns
- ++ \spad{sum(n = r0, r0 + r, r0 + 2*r..., a(n) * (x - a)^n)};
- ++ \spad{series(a(n), n, x = a, r0..r1, r)} returns
- ++ \spad{sum(n = r0 + k*r while n <= r1, a(n) * (x - a)^n)}.
Implementation ==> add
- genStream : (I -> FE, I) -> ST FE
+ genStream : (I -> R, I) -> ST(R)
genStream(f, n) == delay concat(f(n), genStream(f, n + 1))
- genFiniteStream : (I -> FE, I, I) -> ST FE
- genFiniteStream0 : (I -> FE, I, I) -> ST FE
+ genFiniteStream : (I -> R, I, I) -> ST(R)
+ genFiniteStream0 : (I -> R, I, I) -> ST(R)
genFiniteStream(f, n, m) ==
n > m => empty()
genFiniteStream0(f, n, m)
@@ -109,56 +75,35 @@
n = m => concat(f(n), empty())
concat(f(n), genFiniteStream0(f, n + 1, m))
- taylor(f, eq) ==
- (xx := retractIfCan(lhs eq)@Union(SY,"failed")) case "failed" =>
- error "taylor: left hand side must be a variable"
- x := xx :: SY; a := rhs eq
- coerce(series(genStream(f, 0))$UTS(FE, x, a))$ANY1(UTS(FE, x, a))
+ taylor(f, x, a) ==
+ coerce(series(genStream(f, 0))$UTS(R, x, a))$ANY1(UTS(R, x, a))
- taylor(an : FE, n : SY, eq : EQ FE) ==
- taylor((i : I) : FE +-> eval(an, (n :: FE) = (i :: FE)), eq)
-
- taylor(f : I -> FE, eq : EQ FE, seg : SEG NNI) ==
- (xx := retractIfCan(lhs eq)@Union(SY,"failed")) case "failed" =>
- error "taylor: left hand side must be a variable"
- x := xx :: SY; a := rhs eq
+ taylor(f : I -> R, x, a, seg : SEG NNI) ==
hasHi seg =>
n0 := low(seg); n1 := high(seg)
if n1 < n0 then (n0, n1) := (n1, n0)
- uts := series(genFiniteStream(f, n0, n1))$UTS(FE, x, a)
- uts := uts * monomial(1, n0)$UTS(FE, x, a)
- coerce(uts)$ANY1(UTS(FE, x, a))
+ uts := series(genFiniteStream(f, n0, n1))$UTS(R, x, a)
+ uts := uts * monomial(1, n0)$UTS(R, x, a)
+ coerce(uts)$ANY1(UTS(R, x, a))
n0 := low(seg)
- uts := series(genStream(f, n0))$UTS(FE, x, a)
- uts := uts * monomial(1, n0)$UTS(FE, x, a)
- coerce(uts)$ANY1(UTS(FE, x, a))
+ uts := series(genStream(f, n0))$UTS(R, x, a)
+ uts := uts * monomial(1, n0)$UTS(R, x, a)
+ coerce(uts)$ANY1(UTS(R, x, a))
- taylor(an, n, eq, seg) ==
- taylor((i : I) : FE +-> eval(an, (n :: FE) = (i :: FE)), eq, seg)
-
- laurent(f, eq, seg) ==
- (xx := retractIfCan(lhs eq)@Union(SY,"failed")) case "failed" =>
- error "taylor: left hand side must be a variable"
- x := xx :: SY; a := rhs eq
+ laurent(f, x, a, seg) ==
hasHi seg =>
n0 := low(seg); n1 := high(seg)
if n1 < n0 then (n0, n1) := (n1, n0)
- uts := series(genFiniteStream(f, n0, n1))$UTS(FE, x, a)
- coerce(laurent(n0, uts)$ULS(FE, x, a))$ANY1(ULS(FE, x, a))
+ uts := series(genFiniteStream(f, n0, n1))$UTS(R, x, a)
+ coerce(laurent(n0, uts)$ULS(R, x, a))$ANY1(ULS(R, x, a))
n0 := low(seg)
- uts := series(genStream(f, n0))$UTS(FE, x, a)
- coerce(laurent(n0, uts)$ULS(FE, x, a))$ANY1(ULS(FE, x, a))
+ uts := series(genStream(f, n0))$UTS(R, x, a)
+ coerce(laurent(n0, uts)$ULS(R, x, a))$ANY1(ULS(R, x, a))
- laurent(an, n, eq, seg) ==
- laurent((i : I) : FE +-> eval(an, (n :: FE) = (i :: FE)), eq, seg)
-
- modifyFcn : (RN -> FE, I, I, I, I) -> FE
+ modifyFcn : (RN -> R, I, I, I, I) -> R
modifyFcn(f, n0, nn, q, m) == (zero?((m - n0) rem nn) => f(m/q); 0)
- puiseux(f, eq, seg, r) ==
- (xx := retractIfCan(lhs eq)@Union(SY,"failed")) case "failed" =>
- error "puiseux: left hand side must be a variable"
- x := xx :: SY; a := rhs eq
+ puiseux(f, x, a, seg, r) ==
not positive? r => error "puiseux: last argument must be positive"
hasHi seg =>
r0 := low(seg); r1 := high(seg)
@@ -169,31 +114,190 @@
q := lcm(lcm(q0, q1), q2)
n0 := p0 * (q quo q0); n1 := p1 * (q quo q1)
nn := p2 * (q quo q2)
- ulsUnion := laurent((i : I) : FE +-> modifyFcn(f, n0, nn, q, i), eq, segment(n0, n1))
- uls := retract(ulsUnion)$ANY1(ULS(FE, x, a))
- coerce(puiseux(1/q, uls)$UPXS(FE, x, a))$ANY1(UPXS(FE, x, a))
+ ulsUnion := laurent((i : I) : R +-> modifyFcn(f, n0, nn, q, i),
+ x, a, segment(n0, n1))
+ uls := retract(ulsUnion)$ANY1(ULS(R, x, a))
+ coerce(puiseux(1/q, uls)$UPXS(R, x, a))$ANY1(UPXS(R, x, a))
p0 := numer(r0 := low(seg)); q0 := denom r0
p2 := numer r; q2 := denom r
q := lcm(q0, q2)
n0 := p0 * (q quo q0); nn := p2 * (q quo q2)
- ulsUnion := laurent((i : I) : FE +-> modifyFcn(f, n0, nn, q, i), eq, segment n0)
- uls := retract(ulsUnion)$ANY1(ULS(FE, x, a))
- coerce(puiseux(1/q, uls)$UPXS(FE, x, a))$ANY1(UPXS(FE, x, a))
+ ulsUnion := laurent((i : I) : R +->
+ modifyFcn(f, n0, nn, q, i), x, a, segment n0)
+ uls := retract(ulsUnion)$ANY1(ULS(R, x, a))
+ coerce(puiseux(1/q, uls)$UPXS(R, x, a))$ANY1(UPXS(R, x, a))
- puiseux(an, n, eq, r0, m) ==
- puiseux((r : RN) : FE +-> eval(an, (n :: FE) = (r :: FE)), eq, r0, m)
- series(f : I -> FE, eq : EQ FE) == puiseux(r +-> f(numer r), eq, segment 0, 1)
- series(an : FE, n : SY, eq : EQ FE) == puiseux(an, n, eq, segment 0, 1)
+)abbrev package GENUPS2 GenerateUnivariatePowerSeries2
+++ Author: Clifton J. Williamson, Waldek Hebisch
+++ Basic Operations:
+++ Related Domains:
+++ Also See:
+++ AMS Classifications:
+++ Keywords: series, Taylor, Laurent, Puiseux
+++ Examples:
+++ References:
+++ Description:
+++ \spadtype{GenerateUnivariatePowerSeries} provides functions that create
+++ power series from explicit formulas for their \spad{n}th coefficient.
+GenerateUnivariatePowerSeries2(R, FE) : Exports == Implementation where
+ R : Join(IntegralDomain, RetractableTo Integer)
+ FE : Join(Ring, RetractableTo SY)
+ ANY1 ==> AnyFunctions1
+ EQ ==> Equation
+ I ==> Integer
+ NNI ==> NonNegativeInteger
+ RN ==> Fraction Integer
+ SEG ==> UniversalSegment
+ ST ==> Stream
+ SY ==> Symbol
+ UTS ==> UnivariateTaylorSeries
+ ULS ==> UnivariateLaurentSeries
+ UPXS ==> UnivariatePuiseuxSeries
+
+ Exports ==> with
+ taylor : (I -> FE, EQ FE) -> Any
+ ++ \spad{taylor(n +-> a(n), x = a)} returns
+ ++ \spad{sum(n = 0.., a(n)*(x-a)^n)}.
+ taylor : (I -> FE, EQ FE, SEG NNI) -> Any
+ ++ \spad{taylor(n +-> a(n), x = a, n0..)} returns
+ ++ \spad{sum(n=n0.., a(n)*(x-a)^n)};
+ ++ \spad{taylor(n +-> a(n), x = a, n0..n1)} returns
+ ++ \spad{sum(n = n0.., a(n)*(x-a)^n)}.
+ laurent : (I -> FE, EQ FE, SEG I) -> Any
+ ++ \spad{laurent(n +-> a(n), x = a, n0..)} returns
+ ++ \spad{sum(n = n0.., a(n) * (x - a)^n)};
+ ++ \spad{laurent(n +-> a(n), x = a, n0..n1)} returns
+ ++ \spad{sum(n = n0..n1, a(n) * (x - a)^n)}.
+
+ puiseux : (RN -> FE, EQ FE, SEG RN, RN) -> Any
+ ++ \spad{puiseux(n +-> a(n), x = a, r0.., r)} returns
+ ++ \spad{sum(n = r0, r0 + r, r0 + 2*r..., a(n) * (x - a)^n)};
+ ++ \spad{puiseux(n +-> a(n), x = a, r0..r1, r)} returns
+ ++ \spad{sum(n = r0 + k*r while n <= r1, a(n) * (x - a)^n)}.
+
+ series : (I -> FE, EQ FE) -> Any
+ ++ \spad{series(n +-> a(n), x = a)} returns
+ ++ \spad{sum(n = 0.., a(n)*(x-a)^n)}.
+ series : (I -> FE, EQ FE, SEG I) -> Any
+ ++ \spad{series(n +-> a(n), x = a, n0..)} returns
+ ++ \spad{sum(n = n0.., a(n) * (x - a)^n)};
+ ++ \spad{series(n +-> a(n), x = a, n0..n1)} returns
+ ++ \spad{sum(n = n0..n1, a(n) * (x - a)^n)}.
+ series : (RN -> FE, EQ FE, SEG RN, RN) -> Any
+ ++ \spad{series(n +-> a(n), x = a, r0.., r)} returns
+ ++ \spad{sum(n = r0, r0 + r, r0 + 2*r..., a(n) * (x - a)^n)};
+ ++ \spad{series(n +-> a(n), x = a, r0..r1, r)} returns
+ ++ \spad{sum(n = r0 + k*r while n <= r1, a(n) * (x - a)^n)}.
+
+ if FE has FunctionSpace(R) then
+
+ taylor : (FE, SY, EQ FE) -> Any
+ ++ \spad{taylor(a(n), n, x = a)} returns
+ ++ \spad{sum(n = 0.., a(n)*(x-a)^n)}.
+ taylor : (FE, SY, EQ FE, SEG NNI) -> Any
+ ++ \spad{taylor(a(n), n, x = a, n0..)} returns
+ ++ \spad{sum(n = n0.., a(n)*(x-a)^n)};
+ ++ \spad{taylor(a(n), n, x = a, n0..n1)} returns
+ ++ \spad{sum(n = n0.., a(n)*(x-a)^n)}.
+
+ laurent : (FE, SY, EQ FE, SEG I) -> Any
+ ++ \spad{laurent(a(n), n, x=a, n0..)} returns
+ ++ \spad{sum(n = n0.., a(n) * (x - a)^n)};
+ ++ \spad{laurent(a(n), n, x=a, n0..n1)} returns
+ ++ \spad{sum(n = n0..n1, a(n) * (x - a)^n)}.
+
+ puiseux : (FE, SY, EQ FE, SEG RN, RN) -> Any
+ ++ \spad{puiseux(a(n), n, x = a, r0.., r)} returns
+ ++ \spad{sum(n = r0, r0 + r, r0 + 2*r..., a(n) * (x - a)^n)};
+ ++ \spad{puiseux(a(n), n, x = a, r0..r1, r)} returns
+ ++ \spad{sum(n = r0 + k*r while n <= r1, a(n) * (x - a)^n)}.
+
+ series : (FE, SY, EQ FE) -> Any
+ ++ \spad{series(a(n), n, x = a)} returns
+ ++ \spad{sum(n = 0.., a(n)*(x-a)^n)}.
+ series : (FE, SY, EQ FE, SEG I) -> Any
+ ++ \spad{series(a(n), n, x=a, n0..)} returns
+ ++ \spad{sum(n = n0.., a(n) * (x - a)^n)};
+ ++ \spad{series(a(n), n, x=a, n0..n1)} returns
+ ++ \spad{sum(n = n0..n1, a(n) * (x - a)^n)}.
+ series : (FE, SY, EQ FE, SEG RN, RN) -> Any
+ ++ \spad{series(a(n), n, x = a, r0.., r)} returns
+ ++ \spad{sum(n = r0, r0 + r, r0 + 2*r..., a(n) * (x - a)^n)};
+ ++ \spad{series(a(n), n, x = a, r0..r1, r)} returns
+ ++ \spad{sum(n = r0 + k*r while n <= r1, a(n) * (x - a)^n)}.
+
+ Implementation ==> add
+
+ GENUPS1 ==> GenerateUnivariatePowerSeries1(FE)
+
+ taylor(f, eq) ==
+ (xx := retractIfCan(lhs eq)@Union(SY,"failed")) case "failed" =>
+ error "taylor: left hand side must be a variable"
+ x := xx :: SY; a := rhs eq
+ taylor(f, x, a)$GENUPS1
+
+ taylor(f : I -> FE, eq : EQ FE, seg : SEG NNI) ==
+ (xx := retractIfCan(lhs eq)@Union(SY,"failed")) case "failed" =>
+ error "taylor: left hand side must be a variable"
+ x := xx :: SY; a := rhs eq
+ taylor(f, x, a, seg)$GENUPS1
+
+ laurent(f, eq, seg) ==
+ (xx := retractIfCan(lhs eq)@Union(SY,"failed")) case "failed" =>
+ error "taylor: left hand side must be a variable"
+ x := xx :: SY; a := rhs eq
+ laurent(f, x, a, seg)$GENUPS1
+
+ puiseux(f, eq, seg, r) ==
+ (xx := retractIfCan(lhs eq)@Union(SY,"failed")) case "failed" =>
+ error "puiseux: left hand side must be a variable"
+ x := xx :: SY; a := rhs eq
+ puiseux(f, x, a, seg, r)$GENUPS1
+
+ series(f : I -> FE, eq : EQ FE) ==
+ puiseux(r +-> f(numer r), eq, segment 0, 1)
+
series(f : I -> FE, eq : EQ FE, seg : SEG I) ==
- ratSeg : SEG RN := map(x +-> x::RN, seg)$UniversalSegmentFunctions2(I, RN)
+ ratSeg := map(x +-> x::RN, seg)$UniversalSegmentFunctions2(I, RN)
puiseux((r : RN) : FE +-> f(numer r), eq, ratSeg, 1)
- series(an : FE, n : SY, eq : EQ FE, seg : SEG I) ==
- ratSeg : SEG RN := map(i+->i::RN, seg)$UniversalSegmentFunctions2(I, RN)
- puiseux(an, n, eq, ratSeg, 1)
- series(f : RN -> FE, eq : EQ FE, seg : SEG RN, r : RN) == puiseux(f, eq, seg, r)
- series(an : FE, n : SY, eq : EQ FE, seg : SEG RN, r : RN) == puiseux(an, n, eq, seg, r)
+ series(f : RN -> FE, eq : EQ FE, seg : SEG RN, r : RN) ==
+ puiseux(f, eq, seg, r)
+
+ if FE has FunctionSpace(R) then
+
+ taylor(an : FE, n : SY, eq : EQ FE) : Any ==
+ taylor((i : I) : FE +-> eval(an, (n :: FE) = (i :: FE)), eq)
+
+ taylor(an, n, eq, seg) ==
+ taylor((i : I) : FE +-> eval(an, (n :: FE) = (i :: FE)), eq, seg)
+
+ laurent(an, n, eq, seg) ==
+ laurent((i : I) : FE +-> eval(an, (n :: FE) = (i :: FE)), eq, seg)
+
+ puiseux(an, n, eq, r0, m) ==
+ puiseux((r : RN) : FE +-> eval(an, (n :: FE) = (r :: FE)), eq, r0, m)
+
+ series(an : FE, n : SY, eq : EQ FE) == puiseux(an, n, eq, segment 0, 1)
+ series(an : FE, n : SY, eq : EQ FE, seg : SEG I) ==
+ ratSeg := map(i+->i::RN, seg)$UniversalSegmentFunctions2(I, RN)
+ puiseux(an, n, eq, ratSeg, 1)
+ series(an : FE, n : SY, eq : EQ FE, seg : SEG RN, r : RN) ==
+ puiseux(an, n, eq, seg, r)
+
+)abbrev package GENUPS GenerateUnivariatePowerSeries
+++ Description:
+++ This package is to restrict interpreter choice of signatures,
+++ and force Expression when no types are declared
+GenerateUnivariatePowerSeries(
+ R : Join(IntegralDomain, Comparable, RetractableTo Integer,
+ LinearlyExplicitOver Integer),
+ FE : Join(RetractableTo Symbol, TranscendentalFunctionCategory,
+ FunctionSpace R)) ==
+ GenerateUnivariatePowerSeries2(R, FE)
+
+
--Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
--All rights reserved.
--
Modified: trunk/src/input/series3.input
===================================================================
--- trunk/src/input/series3.input 2020-03-02 14:08:05 UTC (rev 2625)
+++ trunk/src/input/series3.input 2020-03-02 14:55:49 UTC (rev 2626)
@@ -10,6 +10,17 @@
testEquals("entries(complete(first(terms(s1), 20)))",
"entries(complete(first(terms(s2), 20)))")
+testcase "series over finite field"
+
+pF := PrimeField(2)
+cf1(n : Integer) : pF == n::pF
+cf2(n : Integer) : Polynomial(pF) == n::pF
+s1 := taylor(n +-> cf1(n), z, 0)$GENUPS1(pF);
+s2 := series(n +-> cf2(n), z = 0)$GENUPS2(INT, Polynomial(pF));
+p : Polynomial(pF) := (z + z^3 + z^5)*(1 + z^6);
+testEquals("polynomial(s1, 12)", "p")
+testEquals("polynomial(s2::UTS(Polynomial(pF), z, 0), 12)", "p")
+
testcase "formal derivatives"
f := operator 'f
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.