@@ -47,25 +47,51 @@ julia> derivative(pq)
47
47
struct RationalFunction{T, X, P<: AbstractPolynomial{T,X} } <: AbstractRationalFunction{T,X,P}
48
48
num:: P
49
49
den:: P
50
- function RationalFunction (p :: P , q:: P ) where {T,X, P<: AbstractPolynomial{T,X} }
50
+ function RationalFunction {T,X,P} (p , q) where {T,X, P<: AbstractPolynomial{T,X} }
51
51
new {T,X,P} (p, q)
52
52
end
53
- function RationalFunction (p:: P , q:: T ) where {T,X, P<: AbstractPolynomial{T,X} }
54
- new {T,X,P} (p, q* one (P))
55
- end
56
- function RationalFunction (p:: T , q:: Q ) where {T,X, Q<: AbstractPolynomial{T,X} }
57
- new {T,X,Q} (p* one (Q), q)
53
+
54
+ end
55
+
56
+ function RationalFunction (p:: P , q:: P ) where {T,X, P<: AbstractPolynomial{T,X} }
57
+ RationalFunction {T,X,P} (p, q)
58
+ end
59
+
60
+ RationalFunction (p:: AbstractPolynomial{T,X} , q:: AbstractPolynomial{S,X} ) where {T,S,X} =
61
+ RationalFunction (promote (p,q)... )
62
+
63
+ function RationalFunction (p:: P , q:: T ) where {T,X, P<: AbstractPolynomial{T,X} }
64
+ RationalFunction (p, (q * one (p)))
65
+ end
66
+ function RationalFunction (p:: T , q:: Q ) where {T,X, Q<: AbstractPolynomial{T,X} }
67
+ RationalFunction (p * one (q), q)
68
+ end
69
+
70
+ function RationalFunction (p:: P ,q:: P ) where {T, X, P <: LaurentPolynomial{T,X} }
71
+
72
+ m,n = firstindex (p), firstindex (q)
73
+ p′,q′ = _shift (p, - m), _shift (q, - n)
74
+ if m- n ≥ 0
75
+ return RationalFunction {T,X,P} (_shift (p′, m- n), q′)
76
+ else
77
+ return RationalFunction {T,X,P} (p′, _shift (q′, n- m))
58
78
end
59
79
end
60
80
61
- RationalFunction (p,q) = RationalFunction (convert (LaurentPolynomial,p), convert (LaurentPolynomial,q))
62
- function RationalFunction (p:: LaurentPolynomial ,q:: LaurentPolynomial )
63
- 𝐩 = convert (RationalFunction, p)
64
- 𝐪 = convert (RationalFunction, q)
65
- 𝐩 // 𝐪
81
+ # RationalFunction(p,q) = RationalFunction(convert(LaurentPolynomial,p), convert(LaurentPolynomial,q))
82
+
83
+
84
+ # special case Laurent
85
+ function lowest_terms (pq:: PQ ; method= :numerical , kwargs... ) where {T,X,
86
+ P<: LaurentPolynomial{T,X} , # StandardBasisPolynomial{T,X},
87
+ PQ<: AbstractRationalFunction{T,X,P} }
88
+ p,q = pqs (pq)
89
+ p′,q′ = convert (Polynomial, p), convert (Polynomial,q)
90
+ u,v,w = uvw (p′,q′; method= method, kwargs... )
91
+ v′,w′ = convert (LaurentPolynomial, v), convert (LaurentPolynomial, w)
92
+ rational_function (PQ, v′/ w′[end ], w′/ w′[end ])
66
93
end
67
- RationalFunction (p:: LaurentPolynomial ,q:: Number ) = convert (RationalFunction, p) // q
68
- RationalFunction (p:: Number ,q:: LaurentPolynomial ) = q // convert (RationalFunction, p)
94
+
69
95
70
96
RationalFunction (p:: AbstractPolynomial ) = RationalFunction (p,one (p))
71
97
@@ -76,3 +102,14 @@ RationalFunction(p::AbstractPolynomial) = RationalFunction(p,one(p))
76
102
function Base.:// (p:: AbstractPolynomial ,q:: AbstractPolynomial )
77
103
RationalFunction (p,q)
78
104
end
105
+
106
+
107
+ # promotion
108
+ function Base. promote (pq:: RationalFunction{T,X,P} ,
109
+ rs:: RationalFunction{S,X,Q} ) where {T,S,X,P<: AbstractPolynomial{T,X} ,
110
+ Q<: AbstractPolynomial{S,X} }
111
+ 𝑃 = promote_type (P, Q)
112
+ p,q = pq
113
+ r,s = rs
114
+ (convert (𝑃,p) // convert (𝑃,q), convert (𝑃,r) // convert (𝑃,s))
115
+ end
0 commit comments