Skip to content

Commit e877196

Browse files
authored
Support function call syntax for evaluate for more rings (#2090)
Now rational function fields, fraction fields and factored fraction fields allow using "function call syntax" as a shorthand for `evaluate`. This also resolves an issue in the RationalFunctionField tests for `evaluate` which did not actually work as intended, as the elements being evaluated action ended up being of type `FracElem`.
1 parent ed8cae0 commit e877196

File tree

6 files changed

+72
-13
lines changed

6 files changed

+72
-13
lines changed

src/Fraction.jl

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -616,20 +616,28 @@ end
616616
#
617617
##############################################################################
618618

619-
function evaluate(f::FracElem{T}, V::Vector{U}) where {T <: RingElement, U <: RingElement}
619+
function evaluate(f::FracElem, V::Vector{<:RingElement})
620620
return evaluate(numerator(f), V)//evaluate(denominator(f), V)
621621
end
622622

623-
function evaluate(f::FracElem{T}, v::U) where {T <: RingElement, U <: RingElement}
623+
function evaluate(f::FracElem, v::RingElement)
624624
return evaluate(numerator(f), v)//evaluate(denominator(f), v)
625625
end
626626

627-
function evaluate(f::FracElem{T}, v::U) where {T <: PolyRingElem, U <: Integer}
627+
function evaluate(f::FracElem{<:PolyRingElem}, v::Integer)
628628
return evaluate(numerator(f), v)//evaluate(denominator(f), v)
629629
end
630630

631-
function evaluate(f::FracElem{T}, vars::Vector{Int}, vals::Vector{U}) where {T <: RingElement, U <: RingElement}
632-
return evaluate(numerator(f), vars, vals)//evaluate(denominator(f), vars, vals)
631+
function evaluate(f::FracElem, vars::Vector{Int}, vals::Vector{<:RingElement})
632+
return evaluate(numerator(f), vars, vals)//evaluate(denominator(f), vars, vals)
633+
end
634+
635+
function (a::FracElem)(val::RingElement)
636+
return evaluate(a, val)
637+
end
638+
639+
function (a::FracElem)(vals::RingElement...)
640+
return evaluate(a, [vals...])
633641
end
634642

635643
###############################################################################

src/generic/FactoredFraction.jl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,22 +403,30 @@ end
403403
#
404404
##############################################################################
405405

406-
function evaluate(f::FactoredFracFieldElem{T}, v::Vector{U}) where {T <: RingElement, U <: RingElement}
406+
function evaluate(f::FactoredFracFieldElem, v::Vector{<:RingElement})
407407
z = evaluate(unit(f), v)
408408
for (b, e) in f
409409
z *= evaluate(b, v)^e
410410
end
411411
return z
412412
end
413413

414-
function evaluate(f::FactoredFracFieldElem{T}, v::U) where {T <: RingElement, U <: RingElement}
414+
function evaluate(f::FactoredFracFieldElem, v::RingElement)
415415
z = evaluate(unit(f), v)
416416
for (b, e) in f
417417
z *= evaluate(b, v)^e
418418
end
419419
return z
420420
end
421421

422+
function (a::FactoredFracFieldElem)(val::RingElement)
423+
return evaluate(a, val)
424+
end
425+
426+
function (a::FactoredFracFieldElem)(vals::RingElement...)
427+
return evaluate(a, [vals...])
428+
end
429+
422430
##############################################################################
423431
#
424432
# Derivative

src/generic/RationalFunctionField.jl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,14 +402,22 @@ end
402402
#
403403
##############################################################################
404404

405-
function evaluate(f::RationalFunctionFieldElem{T, U}, v::V) where {T <: FieldElement, U <: Union{PolyRingElem, MPolyRingElem}, V <: RingElement}
405+
function evaluate(f::RationalFunctionFieldElem, v::RingElement)
406406
return evaluate(numerator(f), v)//evaluate(denominator(f), v)
407407
end
408408

409-
function evaluate(f::RationalFunctionFieldElem{T, U}, v::Vector{V}) where {T <: FieldElement, U <: Union{PolyRingElem, MPolyRingElem}, V <: RingElement}
409+
function evaluate(f::RationalFunctionFieldElem, v::Vector{<:RingElement})
410410
return evaluate(numerator(f), v)//evaluate(denominator(f), v)
411411
end
412412

413+
function (a::RationalFunctionFieldElem)(val::RingElement)
414+
return evaluate(a, val)
415+
end
416+
417+
function (a::RationalFunctionFieldElem)(vals::RingElement...)
418+
return evaluate(a, [vals...])
419+
end
420+
413421
###############################################################################
414422
#
415423
# Powering

test/generic/FactoredFraction-test.jl

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,27 @@ end
4545
end
4646

4747
@testset "Generic.FactoredFracFieldElem.ZZ.evaluate" begin
48+
# univariate
4849
Zx, x = polynomial_ring(ZZ, "x")
4950
F = factored_fraction_field(Zx)
5051
x = F(x)
51-
@test evaluate(x//(x+1), 2//3) == 2//5
5252

53+
f = x//(x+1)
54+
@test f isa Generic.FactoredFracFieldElem
55+
56+
@test evaluate(f, 2//3) == 2//5
57+
@test f(2//3) == 2//5
58+
59+
# multivariate
5360
Zxy, (x, y) = polynomial_ring(ZZ, ["x", "y"])
5461
F = factored_fraction_field(Zxy)
5562
(x, y) = (F(x), F(y))
56-
@test evaluate(x//(x+y)^2, [1//3, 1//2]) == 12//25
63+
64+
f = x//(x+y)^2
65+
@test f isa Generic.FactoredFracFieldElem
66+
67+
@test evaluate(f, [1//3, 1//2]) == 12//25
68+
@test f(1//3, 1//2) == 12//25
5769
end
5870

5971
@testset "Generic.FactoredFracFieldElem.ZZ.valuation" begin

test/generic/Fraction-test.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,34 +281,49 @@ end
281281
end
282282

283283
@testset "Generic.FracFieldElem.evaluate" begin
284+
# univariate
284285
R, = residue_ring(ZZ, 5)
285286
S, x = polynomial_ring(R, "x")
286287

287288
f = (x^2 + 2)//(x + 1)
289+
@test f isa Generic.FracFieldElem
288290

289291
@test evaluate(f, 1) == R(4)
290292
@test evaluate(f, R(1)) == R(4)
291293

294+
@test f(1) == R(4)
295+
@test f(R(1)) == R(4)
296+
297+
# multivariate
292298
R, (x, y) = polynomial_ring(ZZ, ["x", "y"])
293299

294300
f = (x^2 + y)//(y + 2)
301+
@test f isa Generic.FracFieldElem
295302

296303
@test evaluate(f, [1, 2]) == ZZ(3)//ZZ(4)
297304
@test evaluate(f, [ZZ(1), ZZ(2)]) == ZZ(3)//ZZ(4)
298305
@test evaluate(f, [1, 2], [ZZ(1), ZZ(2)]) == ZZ(3)//ZZ(4)
299306
@test evaluate(f, [2, 1], [ZZ(2), ZZ(1)]) == ZZ(3)//ZZ(4)
300307
@test evaluate(f, [1], [ZZ(2)]) == (y + 4)//(y + 2)
301308

309+
@test f(1, 2) == ZZ(3)//ZZ(4)
310+
@test f(ZZ(1), ZZ(2)) == ZZ(3)//ZZ(4)
311+
312+
# universal
302313
R = universal_polynomial_ring(ZZ)
303314
x, y = gens(R, [:x, :y])
304315

305316
f = (x^2 + y)//(y + 2)
317+
@test f isa Generic.FracFieldElem
306318

307319
@test evaluate(f, [1, 2]) == ZZ(3)//ZZ(4)
308320
@test evaluate(f, [ZZ(1), ZZ(2)]) == ZZ(3)//ZZ(4)
309321
@test evaluate(f, [1, 2], [ZZ(1), ZZ(2)]) == ZZ(3)//ZZ(4)
310322
@test evaluate(f, [2, 1], [ZZ(2), ZZ(1)]) == ZZ(3)//ZZ(4)
311323
@test evaluate(f, [1], [ZZ(2)]) == (y + 4)//(y + 2)
324+
325+
@test f(1, 2) == ZZ(3)//ZZ(4)
326+
@test f(ZZ(1), ZZ(2)) == ZZ(3)//ZZ(4)
312327
end
313328

314329
@testset "Generic.FracFieldElem.derivative" begin

test/generic/RationalFunctionField-test.jl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -503,20 +503,28 @@ end
503503

504504
@testset "Generic.RationalFunctionField.evaluate" begin
505505
# Univariate
506-
R, x = polynomial_ring(QQ, "x")
506+
R, x = rational_function_field(QQ, "x")
507507

508508
f = (x^2 + 2)//(x + 1)
509+
@test f isa Generic.RationalFunctionFieldElem
509510

510511
@test evaluate(f, 1) == QQ(3, 2)
511512
@test evaluate(f, QQ(2)) == 2
512513

514+
@test f(1) == QQ(3, 2)
515+
@test f(QQ(2)) == 2
516+
513517
# Multivariate
514-
R, (x, y) = polynomial_ring(QQ, ["x", "y"])
518+
R, (x, y) = rational_function_field(QQ, ["x", "y"])
515519

516520
f = (x^2 + 2)//(y + 1)
521+
@test f isa Generic.RationalFunctionFieldElem
517522

518523
@test evaluate(f, [1, 2]) == 1
519524
@test evaluate(f, [QQ(2), QQ(1)]) == 3
525+
526+
@test f(1, 2) == 1
527+
@test f(QQ(2), QQ(1)) == 3
520528
end
521529

522530
@testset "Generic.RationalFunctionField.derivative" begin

0 commit comments

Comments
 (0)