Open Bodigrim opened 5 years ago
I was looking into this issue out of curiosity and noticed that with cubic/quartic residue characters the values are roots of unity. Would it make sense to move roots of unity out of Dirichlet characters or to just reference the Dirichlet character module if implementing this?
Edit: Ignore this, can just use EisensteinIntegers module
Moving them out is a good idea, I think.
I agree roots of unity probably belong somewhere other than in Dirichlet characters, but cubic/quartic symbols should have a more specific type than root of unity. It would be nice to include a conversion function CubicResidueSymbol -> RootOfUnity
or something similar instead.
I completely agree, representing them as Eisenstein Integers looks nice with stuff like CubicResidueSymbol ω (or anything else more specific). It was an oversight, I think they are seperate issues.
Edit: I think you can only do CubicResidueSymbol -> Maybe RootOfUnity because of the 0 case.
CubicSymbol
is also fine from my perspective. But representing cubic symbols directly as EisensteinInteger
is probably painful because of the lack of exhausting pattern matching.
IMO we can iron out precise API details later, having more stuff at hand.
It may be fun to extend Math.NumberTheory.Moduli.Jacobi to cover not only quadratic reciprocity, but cubic as well.
Quadratic reciprocity symbol or Jacobi symbol answers the question whether an equation
x^2 = n (mod m)
has any solutions. Similarly, cubic residue symbol answers whetherx^3 = n (mod m)
has solutions.The values of Jacobi symbol are units of real integers (+ zero), while the values of cubic symbol are units of Eisenstein integers.
When this will be implemented, we can proceed to modular cubic roots (similar to Math.NumberTheory.Moduli.Sqrt) and eventually solve cubic and quartic modular equations in Math.NumberTheory.Moduli.Equations.
Steps to implement:
Define
data CubicSymbol = Zero | Omega | OmegaSquare | One
and definecubicSymbol :: EisensteinInteger -> EisensteinInteger -> CubicSymbol
in accordance to the definition of cubic residue character.Define the modular cube root in accordance to one of the algorithms in New Cube Root Algorithm. The API should be designed similar to
Math.NumberTheory.Moduli.Sqrt
.Develop an algorithm to solve cubic modular equations (similar to the real case) and implement it as
Math.NumberTheory.Moduli.Equations.solveCubic
.Develop an algorithm to solve quartic modular equations (similar to the real case) and implement it as
Math.NumberTheory.Moduli.Equations.solveCubic
.