|
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +from flint import dirichlet_char, dirichlet_group, fmpz |
| 4 | +from flint.test.helpers import is_close_acb, raises |
| 5 | + |
| 6 | + |
| 7 | +def test_dirichlet_group_basics() -> None: |
| 8 | + g = dirichlet_group(5) |
| 9 | + assert g.size() == 4 |
| 10 | + assert g.q == 5 |
| 11 | + assert g.exponent() == 4 |
| 12 | + assert repr(g) == "Dirichlet group mod q = 5" |
| 13 | + assert str(g) == "Dirichlet group mod q = 5" |
| 14 | + |
| 15 | + assert raises(lambda: dirichlet_group(0), AssertionError) |
| 16 | + |
| 17 | + |
| 18 | +def test_dirichlet_char_properties() -> None: |
| 19 | + chi = dirichlet_char(7, 3) |
| 20 | + |
| 21 | + assert isinstance(chi.group(), dirichlet_group) |
| 22 | + assert chi.index() == 1 |
| 23 | + assert chi.modulus() == 7 |
| 24 | + assert chi.number() == 3 |
| 25 | + assert chi.order() == 6 |
| 26 | + assert chi.is_real() is False |
| 27 | + assert chi.is_primitive() is True |
| 28 | + assert chi.conductor() == 7 |
| 29 | + assert chi.is_principal() is False |
| 30 | + assert chi.parity() == 1 |
| 31 | + |
| 32 | + assert repr(chi) == "dirichlet_char(7, 3)" |
| 33 | + assert str(chi) == "dirichlet_char(7, 3)" |
| 34 | + |
| 35 | + assert raises(lambda: dirichlet_char(8, 2), AssertionError) |
| 36 | + |
| 37 | + |
| 38 | +def test_dirichlet_char_values_and_mul() -> None: |
| 39 | + chi = dirichlet_char(7, 3) |
| 40 | + principal = dirichlet_char(7, 1) |
| 41 | + chi5 = dirichlet_char(7, 5) |
| 42 | + |
| 43 | + assert is_close_acb(chi(7), 0) |
| 44 | + assert is_close_acb(chi(2), -0.5 + 0.866025403784439j, tol=1e-12, rel_tol=1e-12) |
| 45 | + assert is_close_acb(chi(fmpz(2)), -0.5 + 0.866025403784439j, tol=1e-12, rel_tol=1e-12) |
| 46 | + |
| 47 | + assert chi.chi_exponent(7) is None |
| 48 | + assert chi.chi_exponent(2) == 2 |
| 49 | + assert principal.chi_exponent(2) == 0 |
| 50 | + |
| 51 | + prod = chi * chi5 |
| 52 | + assert prod.number() == 1 |
| 53 | + for n in [1, 2, 3, 4, 5, 6, 7, 8]: |
| 54 | + assert is_close_acb(prod(n), chi(n) * chi5(n), tol=1e-12, rel_tol=1e-12) |
| 55 | + |
| 56 | + assert raises(lambda: chi * dirichlet_char(5, 1), AssertionError) |
| 57 | + assert raises(lambda: chi(object()), TypeError) # type: ignore[arg-type] |
| 58 | + assert raises(lambda: chi.chi_exponent(object()), TypeError) # type: ignore[arg-type] |
| 59 | + |
| 60 | + |
| 61 | +def test_dirichlet_char_special_functions() -> None: |
| 62 | + chi = dirichlet_char(7, 3) |
| 63 | + assert is_close_acb(chi.l_function(2), 0.902247025301257 + 0.232548981277895j, tol=1e-12, rel_tol=1e-12) |
| 64 | + assert is_close_acb(chi.l(2), chi.l_function(2), tol=1e-12, rel_tol=1e-12) |
| 65 | + |
| 66 | + zeta_chi = dirichlet_char(1, 1) |
| 67 | + assert is_close_acb(zeta_chi.hardy_z(1), -0.736305462867318, tol=1e-12, rel_tol=1e-12) |
0 commit comments