-
-
Notifications
You must be signed in to change notification settings - Fork 481
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implemented .ramified_places
and modified further methods to extend quaternion algebra functionality to number fields
#37173
base: develop
Are you sure you want to change the base?
Conversation
…lity to number fields - Implemented method `.ramified_places` for quaternion algebras over number fields. Integrated `.ramified_primes()` into it in the process - Rerouted `.discriminant()` through `.ramified_places` - Modified `.is_division_algebra()`, `.is_matrix_ring()` and `.is_isomorphic` to use `.ramified_places` instead of `.discriminant()`, extending them to base number fields - Added `.is_definite()` and `.is_totally_definite()` methods - Added Voight's book "Quaternion Algebras" to the list of references
Fixed some whitespaces and blank lines discovered by lint. Also corrected the formatting of references to Voight's book - thanks to @grhkm21 for pointing this out to me! |
fcfc030
to
71f9266
Compare
71f9266
to
0bb5cfe
Compare
After fixing some typos and some errors in the docstrings, I believe this should be ready for review now. |
… `.discriminant()` and `.is_isomorphic` of quaternion algebras 1. Removed unnecessary product and factorization for `.ramified_primes()` 2. Adapted `is_isomorphic` to reduce unnecessary calculations 3. Fixed a bug in `.discriminant()` and `.ramified_primes()` where rational invariants caused errors 4. Removed `.hilbert_conductor` from `sage.arith.misc` import list and added `.hilbert_symbol` 5. Reduced restriction of `.ramified_primes()` to rational quaternion algebras in docstring in preparation for planned `.ramified_places()` function over number fields (currently being worked on) In more detail: 1. The original workflow for `.ramified_primes()` went as follows: - Call `.discriminant()`, which calls `.hilbert_conductor` - Inside `.hilbert_conductor`, the ramified primes are computed and their product (the discriminant of the quaternion algebra) is returned - Finally, factor the discriminant back into its prime factors Hence we have a redundant product and, more crucially, a redundant prime factorization. This fix modifies `.ramified_primes()` to instead directly build the list computed in `.hilbert_conductor()` (up to a bug fix described in 3.) and return it; the list might not always be sorted by magnitude of primes, so an optional argument `sorted` (set to `False` by default) allows to enforce this (small to large) sorting. Furthermore, `.discriminant()` has been adapted to directly take the product of the list returned by `.ramified_primes()` (only in the rational case, for now - see 5.) 2. Since the `.discriminant()`-function needs to compute all (finite) ramified primes (this was also true before this PR, it was just hidden inside `.hilbert_conductor()` instead), the function `.is_isomorphic()` now compares the unsorted lists of finite ramified primes to decide whether two rational quaternion algebras are isomorphic. 3. The function `sage.arith.misc.hilbert_conductor` requires its arguments to be integers (to create certain lists of prime divisors); since it was originally used to determine the discriminant (and, as explained in 1., the ramified primes), it raises an error when the invariants are proper rational numbers. To get around the analogous error for the method `.hilbert_symbol`, we instead look at the numerators and denominators of both invariants separately, using the fact that we can (purely on a mathematical level) rescale both invariants by the squares of their respective denominators without leaving the isomorphism class of the algebra. 4. The only call to `sage.arith.misc.hilbert_conductor` in quaternion_algebra.py was given in the old computation of the discriminant (the other `.hilbert_conductor` in the code, also in `.discriminant()`, refers to the one in `sage.rings.number_field`), so it was removed from the import list. The new approach to `.ramified_primes()` requires `sage.arith.misc.hilbert_symbol`, which was added to the import list. 5. As of now the `.ramified_primes()`-method is only supported for rational quaternion algebras. I'm currently working on a version over number fields, but once it works correctly this will be implemented as a new function `.ramified_places` (Update: see sagemath#37173) ~~to distinguish between different formats (prime numbers vs ideals) over $\mathbb{Q}$~~ (Update: this wasn't really feasible, see the issues discussed in sagemath#7596; thanks to @yyyyx4 for pointing me towards this discussion) ~~and, furthermore,~~ to not cause confusion using the term "primes" for the Archimedean real places where a quaternion algebra might ramify. Hence the implementation restriction in the docstring of `.ramified_primes()` was removed, but the method still throws a ValueError if not called with a quaternion algebra defined over the rational numbers. #sd123 URL: sagemath#37164 Reported by: Sebastian Spindler Reviewer(s): grhkm21, Sebastian Spindler
- Removed greek letter alpha in docstrings in hopes of this fixing infinite build loops - Updated `.is_definite()` to fit PR sagemath#37173 (up to the reference to Voight's book) - Other small modifications of docstrings, comments and error warnings - Slightly cleaned up code with respect to intermediately defined variables
… `.discriminant()` and `.is_isomorphic` of quaternion algebras 1. Removed unnecessary product and factorization for `.ramified_primes()` 2. Adapted `is_isomorphic` to reduce unnecessary calculations 3. Fixed a bug in `.discriminant()` and `.ramified_primes()` where rational invariants caused errors 4. Removed `.hilbert_conductor` from `sage.arith.misc` import list and added `.hilbert_symbol` 5. Reduced restriction of `.ramified_primes()` to rational quaternion algebras in docstring in preparation for planned `.ramified_places()` function over number fields (currently being worked on) In more detail: 1. The original workflow for `.ramified_primes()` went as follows: - Call `.discriminant()`, which calls `.hilbert_conductor` - Inside `.hilbert_conductor`, the ramified primes are computed and their product (the discriminant of the quaternion algebra) is returned - Finally, factor the discriminant back into its prime factors Hence we have a redundant product and, more crucially, a redundant prime factorization. This fix modifies `.ramified_primes()` to instead directly build the list computed in `.hilbert_conductor()` (up to a bug fix described in 3.) and return it; the list might not always be sorted by magnitude of primes, so an optional argument `sorted` (set to `False` by default) allows to enforce this (small to large) sorting. Furthermore, `.discriminant()` has been adapted to directly take the product of the list returned by `.ramified_primes()` (only in the rational case, for now - see 5.) 2. Since the `.discriminant()`-function needs to compute all (finite) ramified primes (this was also true before this PR, it was just hidden inside `.hilbert_conductor()` instead), the function `.is_isomorphic()` now compares the unsorted lists of finite ramified primes to decide whether two rational quaternion algebras are isomorphic. 3. The function `sage.arith.misc.hilbert_conductor` requires its arguments to be integers (to create certain lists of prime divisors); since it was originally used to determine the discriminant (and, as explained in 1., the ramified primes), it raises an error when the invariants are proper rational numbers. To get around the analogous error for the method `.hilbert_symbol`, we instead look at the numerators and denominators of both invariants separately, using the fact that we can (purely on a mathematical level) rescale both invariants by the squares of their respective denominators without leaving the isomorphism class of the algebra. 4. The only call to `sage.arith.misc.hilbert_conductor` in quaternion_algebra.py was given in the old computation of the discriminant (the other `.hilbert_conductor` in the code, also in `.discriminant()`, refers to the one in `sage.rings.number_field`), so it was removed from the import list. The new approach to `.ramified_primes()` requires `sage.arith.misc.hilbert_symbol`, which was added to the import list. 5. As of now the `.ramified_primes()`-method is only supported for rational quaternion algebras. I'm currently working on a version over number fields, but once it works correctly this will be implemented as a new function `.ramified_places` (Update: see sagemath#37173) ~~to distinguish between different formats (prime numbers vs ideals) over $\mathbb{Q}$~~ (Update: this wasn't really feasible, see the issues discussed in sagemath#7596; thanks to @yyyyx4 for pointing me towards this discussion) ~~and, furthermore,~~ to not cause confusion using the term "primes" for the Archimedean real places where a quaternion algebra might ramify. Hence the implementation restriction in the docstring of `.ramified_primes()` was removed, but the method still throws a ValueError if not called with a quaternion algebra defined over the rational numbers. #sd123 URL: sagemath#37164 Reported by: Sebastian Spindler Reviewer(s): grhkm21, Sebastian Spindler
… `.discriminant()` and `.is_isomorphic` of quaternion algebras 1. Removed unnecessary product and factorization for `.ramified_primes()` 2. Adapted `is_isomorphic` to reduce unnecessary calculations 3. Fixed a bug in `.discriminant()` and `.ramified_primes()` where rational invariants caused errors 4. Removed `.hilbert_conductor` from `sage.arith.misc` import list and added `.hilbert_symbol` 5. Reduced restriction of `.ramified_primes()` to rational quaternion algebras in docstring in preparation for planned `.ramified_places()` function over number fields (currently being worked on) In more detail: 1. The original workflow for `.ramified_primes()` went as follows: - Call `.discriminant()`, which calls `.hilbert_conductor` - Inside `.hilbert_conductor`, the ramified primes are computed and their product (the discriminant of the quaternion algebra) is returned - Finally, factor the discriminant back into its prime factors Hence we have a redundant product and, more crucially, a redundant prime factorization. This fix modifies `.ramified_primes()` to instead directly build the list computed in `.hilbert_conductor()` (up to a bug fix described in 3.) and return it; the list might not always be sorted by magnitude of primes, so an optional argument `sorted` (set to `False` by default) allows to enforce this (small to large) sorting. Furthermore, `.discriminant()` has been adapted to directly take the product of the list returned by `.ramified_primes()` (only in the rational case, for now - see 5.) 2. Since the `.discriminant()`-function needs to compute all (finite) ramified primes (this was also true before this PR, it was just hidden inside `.hilbert_conductor()` instead), the function `.is_isomorphic()` now compares the unsorted lists of finite ramified primes to decide whether two rational quaternion algebras are isomorphic. 3. The function `sage.arith.misc.hilbert_conductor` requires its arguments to be integers (to create certain lists of prime divisors); since it was originally used to determine the discriminant (and, as explained in 1., the ramified primes), it raises an error when the invariants are proper rational numbers. To get around the analogous error for the method `.hilbert_symbol`, we instead look at the numerators and denominators of both invariants separately, using the fact that we can (purely on a mathematical level) rescale both invariants by the squares of their respective denominators without leaving the isomorphism class of the algebra. 4. The only call to `sage.arith.misc.hilbert_conductor` in quaternion_algebra.py was given in the old computation of the discriminant (the other `.hilbert_conductor` in the code, also in `.discriminant()`, refers to the one in `sage.rings.number_field`), so it was removed from the import list. The new approach to `.ramified_primes()` requires `sage.arith.misc.hilbert_symbol`, which was added to the import list. 5. As of now the `.ramified_primes()`-method is only supported for rational quaternion algebras. I'm currently working on a version over number fields, but once it works correctly this will be implemented as a new function `.ramified_places` (Update: see sagemath#37173) ~~to distinguish between different formats (prime numbers vs ideals) over $\mathbb{Q}$~~ (Update: this wasn't really feasible, see the issues discussed in sagemath#7596; thanks to @yyyyx4 for pointing me towards this discussion) ~~and, furthermore,~~ to not cause confusion using the term "primes" for the Archimedean real places where a quaternion algebra might ramify. Hence the implementation restriction in the docstring of `.ramified_primes()` was removed, but the method still throws a ValueError if not called with a quaternion algebra defined over the rational numbers. #sd123 URL: sagemath#37164 Reported by: Sebastian Spindler Reviewer(s): grhkm21, Sebastian Spindler
a999a06
to
6e95539
Compare
- Removed greek letter alpha in docstrings in hopes of this fixing infinite build loops - Updated `.is_definite()` to fit PR sagemath#37173 (up to the reference to Voight's book) - Other small modifications of docstrings, comments and error warnings - Slightly cleaned up code with respect to intermediately defined variables
- Removed greek letter alpha in docstrings in hopes of this fixing infinite build loops - Updated `.is_definite()` to fit PR sagemath#37173 (up to the reference to Voight's book) - Other small modifications of docstrings, comments and error warnings - Slightly cleaned up code with respect to intermediately defined variables
5da4cbf
to
d63f675
Compare
Amend: Even more refactoring of `.is_definite()` and `.is_totally_definite()` Amend 2: Corrected backtick error
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
some reviews
- Rewrote some docstring descriptions - Broke apart examples into multiple blocks, with added flavor text - Modified docstring examples to emphasize certain features more - Refactored some larger descriptions to use bullet point lists Amend 1: Fixed missing space before NOTE Amend 2: Fixed indent of second line in bullet point list in `.discriminant()`
- Added missing check that the base field of a totally definite algebra needs to be totally real - Moved note in `.ramified_places` below input and moved the interal info on initial choice of finite primes to code comments
…unction fields Implemented the computation of the (local) Hilbert symbol at a place of a global function field of odd characteristic following formula 12.4.10 in John Voight's "Quaternion Algebras" (in preparation of extending some quaternion algebra functionality to these global function fields). The global Hilbert symbol will be implemented via a call to `.is_matrix_ring()` of the appropriate quaternion algebra once the latter method has been extended using an extension of PR sagemath#37173, which will be done once both this PR and the referenced PR have been merged. URL: sagemath#37554 Reported by: Sebastian A. Spindler Reviewer(s): Kwankyu Lee, Sebastian A. Spindler
Updated details for John Voight's book "Quaternion Algebras" in the list of references and modified some docstrings in `quaternion_algebra.py`. Split off from sagemath#37173. URL: sagemath#37557 Reported by: Sebastian A. Spindler Reviewer(s): Travis Scrimshaw
Documentation preview for this PR (built with commit 7c04029; changes) is ready! 🎉 |
The current test failures seem unrelated (I'm unable to reproduce the failure in |
- Avoids possible future issues caused by rounding precision - Seems to be more efficient Amend: Docstring fix
There's quite a few failures in the Build & Test using Conda (macos, 3.11), but as far as I can tell they are all not related to this PR. |
.ramified_places
for quaternion algebras over number fields. Integrated.ramified_primes()
into it in the process..is_division_algebra()
,.is_matrix_ring()
and.is_isomorphic
to use.ramified_places
instead of.discriminant()
, thus extending them to base number fields..discriminant()
through.ramified_places
since the original call to.hilbert_conductor
also computed all finite ramified places..is_totally_definite()
and movedis_definite()
.Some more detail:
The new method
.ramified_places
returns all places at which the quaternion algebraself
ramifies; this includes the infinite places by default, but can be reduced to only the finite places with the optional parameterinf
. The old version of.ramified_primes()
from Fixes and simplifications for.ramified_primes()
,.discriminant()
and.is_isomorphic
of quaternion algebras #37164 has been integrated into.ramified_places
, thus setting the former up for possible future deprecation; currently it callsself.ramified_places(inf=False)
for backwards compatibility..is_division_algebra()
and.is_matrix_ring()
now instead check whether the list of ramified places (finite and infinite) is trivial..is_isomorphic
now compares the set of finite ramified places and, unless working over.is_isomorphic
(as well as some of the other docstrings) now includes an example of a non-split quaternion algebra with trivial discriminant, namely the algebra with invariantsPossible future work: