Skip to content

Commit

Permalink
FakeFmpqMat -> QQMatrix for AlgAssAbsOrd[Idl]
Browse files Browse the repository at this point in the history
  • Loading branch information
thofma committed Jan 31, 2025
1 parent 82057df commit 17c0c99
Show file tree
Hide file tree
Showing 15 changed files with 427 additions and 157 deletions.
221 changes: 221 additions & 0 deletions src/AlgAss/Conversions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,227 @@ It is assumed that $p$ is prime.
"""
quo(I::Union{ AbsNumFieldOrderIdeal, AlgAssAbsOrdIdl }, J::Union{ AbsNumFieldOrderIdeal, AlgAssAbsOrdIdl }, p::Union{ Integer, ZZRingElem }) = StructureConstantAlgebra(I, J, p)

function StructureConstantAlgebra(I::AlgAssAbsOrdIdl, J::AlgAssAbsOrdIdl, p::IntegerUnion)
@assert order(I) === order(J)

O = order(I)
Oalgebra = _algebra(O)

n = degree(O)
BmatJinI = _hnf_integral(basis_matrix(J, copy = false)*basis_mat_inv(I, copy = false), :lowerleft)
@assert isone(denominator(BmatJinI)) "J is not a subset of I"
BmatJinI = numerator(BmatJinI)
basis_elts = Vector{Int}()
for i = 1:n
if valuation(BmatJinI[i, i], p) == 0
continue
end

push!(basis_elts, i)
end

r = length(basis_elts)
Fp = GF(p, cached = false)

if r == 0
A = zero_algebra(Fp)

local _image_zero

let A = A
function _image_zero(a::Union{ AbsNumFieldOrderElem, AlgAssAbsOrdElem })
return A()
end
end

local _preimage_zero

let O = O
function _preimage_zero(a::AssociativeAlgebraElem)
return O()
end
end

OtoA = AbsOrdToAlgAssMor{typeof(O), elem_type(Fp)}(O, A, _image_zero, _preimage_zero)
return A, OtoA
end

BI = basis(I, copy = false)
BmatI = basis_matrix(I, copy = false)
BmatIinv = inv(BmatI)

mult_table = Array{elem_type(Fp), 3}(undef, r, r, r)
for i = 1:r
M = representation_matrix(_elem_in_algebra(BI[basis_elts[i]], copy = false))
M = mul!(M, BmatI, M)
M = mul!(M, M, BmatIinv)
@assert denominator(M) == 1
M = numerator(M) # M is now the representation matrix in the basis of I
# TODO: fix type
if r != degree(O)
M = reduce_rows_mod_hnf!(M, BmatJinI, basis_elts)
end
for j = 1:r
for k = 1:r
mult_table[i, j, k] = Fp(M[basis_elts[j], basis_elts[k]])
end
end
end

A = StructureConstantAlgebra(Fp, mult_table)
if is_commutative(O)
A.is_commutative = 1
end

t = zero_matrix(QQ, 1, n)

local _image

let BmatJinI = BmatJinI, I = I, r = r, A = A, t = t, Fp = Fp
function _image(a::AlgAssAbsOrdElem)
elem_to_mat_row!(t, 1, _elem_in_algebra(a, copy = false))
t = mul!(t, t, basis_mat_inv(I, copy = false))
@assert isone(denominator(t)) "Not an element of the domain"
c = reduce_vector_mod_hnf(numerator(t), BmatJinI)
return A([ Fp(c[i]) for i in basis_elts ])
end
end

local _preimage

temppp = zero(Oalgebra)

let BI = BI, basis_elts = basis_elts, r = r, Oalgebra = Oalgebra, temppp = temppp
function _preimage(a::AssociativeAlgebraElem)
acoords = map(x -> QQ(lift(ZZ, x)), coefficients(a, copy = false))
z = zero(Oalgebra)
for i in 1:r
if is_zero(acoords[i])
continue
end
temppp = mul!(temppp, acoords[i], BI[basis_elts[i]])
z = add!(z, z, temppp)
end
_zz = O(z)
return _zz
end
end

OtoA = AbsOrdToAlgAssMor{typeof(O), elem_type(Fp)}(O, A, _image, _preimage)

return A, OtoA
end

function StructureConstantAlgebra(I::AbsNumFieldOrderIdeal, J::AbsNumFieldOrderIdeal, p::IntegerUnion)
@assert order(I) === order(J)

O = order(I)
Oalgebra = _algebra(O)

n = degree(O)
BmatJinI = _hnf_integral(basis_matrix(J, copy = false)*basis_mat_inv(I, copy = false), :lowerleft)
@assert isone(BmatJinI.den) "J is not a subset of I"
BmatJinI = BmatJinI.num
basis_elts = Vector{Int}()
for i = 1:n
if valuation(BmatJinI[i, i], p) == 0
continue
end

push!(basis_elts, i)
end

r = length(basis_elts)
Fp = GF(p, cached = false)

if r == 0
A = zero_algebra(Fp)

local _image_zero

let A = A
function _image_zero(a::Union{ AbsNumFieldOrderElem, AlgAssAbsOrdElem })
return A()
end
end

local _preimage_zero

let O = O
function _preimage_zero(a::AssociativeAlgebraElem)
return O()
end
end

OtoA = AbsOrdToAlgAssMor{typeof(O), elem_type(Fp)}(O, A, _image_zero, _preimage_zero)
return A, OtoA
end

BI = basis(I, copy = false)
BmatI = basis_matrix(I, copy = false)
BmatIinv = inv(BmatI)

mult_table = Array{elem_type(Fp), 3}(undef, r, r, r)
for i = 1:r
M = FakeFmpqMat(representation_matrix(_elem_in_algebra(BI[basis_elts[i]], copy = false)))
M = mul!(M, BmatI, M)
M = mul!(M, M, BmatIinv)
@assert M.den == 1
M = M.num # M is now the representation matrix in the basis of I
if r != degree(O)
M = reduce_rows_mod_hnf!(M, BmatJinI, basis_elts)
end
for j = 1:r
for k = 1:r
mult_table[i, j, k] = Fp(M[basis_elts[j], basis_elts[k]])
end
end
end

A = StructureConstantAlgebra(Fp, mult_table)
if is_commutative(O)
A.is_commutative = 1
end

t = FakeFmpqMat(zero_matrix(ZZ, 1, n))

local _image

let BmatJinI = BmatJinI, I = I, r = r, A = A, t = t, Fp = Fp
function _image(a::Union{AbsNumFieldOrderElem, AlgAssAbsOrdElem})
elem_to_mat_row!(t.num, 1, t.den, _elem_in_algebra(a, copy = false))
t = mul!(t, t, basis_mat_inv(I, copy = false))
@assert isone(t.den) "Not an element of the domain"
c = reduce_vector_mod_hnf(t.num, BmatJinI)
return A([ Fp(c[i]) for i in basis_elts ])
end
end

local _preimage

temppp = zero(Oalgebra)

let BI = BI, basis_elts = basis_elts, r = r, Oalgebra = Oalgebra, temppp = temppp
function _preimage(a::AssociativeAlgebraElem)
acoords = map(x -> QQ(lift(ZZ, x)), coefficients(a, copy = false))
z = zero(Oalgebra)
for i in 1:r
if is_zero(acoords[i])
continue
end
temppp = mul!(temppp, acoords[i], BI[basis_elts[i]])
z = add!(z, z, temppp)
end
_zz = O(z)
return _zz
end
end

OtoA = AbsOrdToAlgAssMor{typeof(O), elem_type(Fp)}(O, A, _image, _preimage)

return A, OtoA
end

function StructureConstantAlgebra(I::Union{ AbsNumFieldOrderIdeal, AlgAssAbsOrdIdl }, J::Union{AbsNumFieldOrderIdeal, AlgAssAbsOrdIdl}, p::IntegerUnion)
@assert order(I) === order(J)

Expand Down
30 changes: 15 additions & 15 deletions src/AlgAssAbsOrd/Elem.jl
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@ end
end

(O::AlgAssAbsOrd{S, T})(arr::Vector{ZZRingElem}) where {S, T} = begin
M = basis_matrix(FakeFmpqMat, O, copy = false)
M = basis_matrix(O, copy = false)
N = matrix(ZZ, 1, degree(O), arr)
NM = N*M
x = elem_from_mat_row(algebra(O), NM.num, 1, NM.den)
x = elem_from_mat_row(algebra(O), NM, 1)
return AlgAssAbsOrdElem{S, T}(O, x, deepcopy(arr))
end

Expand Down Expand Up @@ -366,31 +366,31 @@ The multiplication is from the left if `action == :left` and from the right if
function representation_matrix(x::AlgAssAbsOrdElem, action::Symbol = :left)

O = parent(x)
M = basis_matrix(FakeFmpqMat, O, copy = false)
M1 = basis_mat_inv(FakeFmpqMat, O, copy = false)
M = basis_matrix(O, copy = false)
M1 = basis_matrix_inverse(O, copy = false)

B = FakeFmpqMat(representation_matrix(elem_in_algebra(x, copy = false), action))
B = representation_matrix(elem_in_algebra(x, copy = false), action)
B = mul!(B, M, B)
B = mul!(B, B, M1)

@assert B.den == 1
return B.num
@assert is_one(denominator(B))
return numerator(B)
end

function representation_matrix_mod(x::AlgAssAbsOrdElem, d::ZZRingElem, action::Symbol = :left)
O = parent(x)
M = basis_matrix(FakeFmpqMat, O, copy = false)
M1 = basis_mat_inv(FakeFmpqMat, O, copy = false)
M = basis_matrix(O, copy = false)
M1 = basis_matrix_inverse(O, copy = false)

A = FakeFmpqMat(representation_matrix(elem_in_algebra(x, copy = false), action))
d2 = M.den * M1.den*A.den
A = representation_matrix(elem_in_algebra(x, copy = false), action)
d2 = denominator(M) * denominator(M1) * denominator(A)
d2c, d2nc = ppio(d2, d)
d1 = d * d2c
A1 = A.num
mod!(A.num, d1)
S1 = mod(M.num, d1)
A1 = numerator(A)
mod!(A1, d1)
S1 = mod(numerator(M), d1)
mul!(A1, S1, A1)
S2 = mod(M1.num, d1)
S2 = mod(numerator(M1), d1)
mul!(A1, A1, S2)
mod!(A1, d1)
divexact!(A1, A1, d2c)
Expand Down
2 changes: 1 addition & 1 deletion src/AlgAssAbsOrd/ICM.jl
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ function ideals_containing(S::T, a::T2, R::T) where { T <: Union{ AbsNumFieldOrd
end
end
if typeof(R) <: AlgAssAbsOrd
M = basis_matrix(potential_basis, FakeFmpqMat)
M = basis_matrix(potential_basis)
return ideal(algebra(R), R, M)
else
M = basis_matrix(potential_basis, FakeFmpqMat)*basis_mat_inv(FakeFmpqMat, R, copy = false)
Expand Down
Loading

0 comments on commit 17c0c99

Please sign in to comment.