Skip to content

Conversation

@yyyyx4
Copy link
Member

@yyyyx4 yyyyx4 commented Jan 30, 2026

The current general implementation of .division_field() works by constructing the splitting field of the division polynomial (and then some).

In this patch, we implement two much faster algorithms for finite base fields: One for supersingular curves, based on the fact that Frobenius acts as a scalar after taking an extension of degree O(1), and one for ordinary curves, which is due to Van Tuyl.

Example (supersingular):

sage: E = EllipticCurve(GF(419), [1,0])
sage: assert E.is_supersingular()
sage: %time E.division_field(32)

Sage 10.8: CPU times: user 6.73 s, sys: 1.96 ms, total: 6.73 s
This branch: CPU times: user 29.9 ms, sys: 1.93 ms, total: 31.8 ms

Example (ordinary):

E = EllipticCurve(GF(101), [1,1])
assert E.is_ordinary()
%time E.division_field(13)

Sage 10.8: CPU times: user 7.5 s, sys: 1.03 ms, total: 7.5 s
This branch: CPU times: user 126 ms, sys: 5.93 ms, total: 132 ms

As a byproduct, this leads to massive speedups in many other algorithms where .division_field() is used. For example:

sage: E = EllipticCurve(GF((419,2)), [1,0])
sage: i = E.automorphisms()[2]
sage: j = E.frobenius_isogeny()
sage: %time (i + 3*j).to_isogeny_chain()

Sage 10.8: CPU times: user 12.5 s, sys: 2.98 ms, total: 12.5 s
This branch: CPU times: user 461 ms, sys: 0 ns, total: 461 ms

@github-actions
Copy link

github-actions bot commented Jan 30, 2026

Documentation preview for this PR (built with commit be0ef19; changes) is ready! 🎉
This preview will update shortly after each push to this PR.

@yyyyx4 yyyyx4 force-pushed the public/specialized_elliptic_curve_division_field_for_finite_fields branch from 56c2e51 to be0ef19 Compare January 31, 2026 10:30
@yyyyx4 yyyyx4 requested a review from GiacomoPope January 31, 2026 11:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant