Skip to content

Commit 81e609d

Browse files
committed
Improve conversion between GAP and OSCAR finite fields
Before: julia> FO = GF(3,4); FG = GAP.Globals.GF(3,4); julia> f, finv = Oscar._iso_oscar_gap_field_finite_functions(FO, FG); julia> e = one(FO) ; @Btime f(e); 1.875 μs (28 allocations: 832 bytes) julia> e = one(FG) ; @Btime finv(e); 3.594 μs (38 allocations: 1.62 KiB) After: julia> FO = GF(3,4); FG = GAP.Globals.GF(3,4); julia> f, finv = Oscar._iso_oscar_gap_field_finite_functions(FO, FG); julia> e = one(FO) ; @Btime f(e); 1.429 μs (24 allocations: 624 bytes) julia> e = one(FG) ; @Btime finv(e); 2.991 μs (39 allocations: 1.64 KiB)
1 parent 2d78be0 commit 81e609d

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

src/GAP/iso_oscar_gap.jl

+17-14
Original file line numberDiff line numberDiff line change
@@ -121,20 +121,25 @@ function _iso_oscar_gap_field_finite_functions(FO::Union{FqPolyRepField, FqField
121121

122122
if FO isa FqField
123123
f = function(x)
124-
v = [GAP.Obj(Nemo._coeff(x, i)) for i in 0:(d - 1)]
125-
return sum([v[i]*basis_FG[i] for i in 1:d])
124+
return sum([GAP.Obj(Nemo._coeff(x, i-1))*basis_FG[i] for i in 1:d])
126125
end
127126
else
128127
f = function(x)
129-
v = [GAP.Obj(coeff(x, i)) for i in 0:(d - 1)]
130-
return sum([v[i]*basis_FG[i] for i in 1:d])
128+
return sum([GAP.Obj(coeff(x, i-1))*basis_FG[i] for i in 1:d])
131129
end
132130
end
133-
134-
finv = function(x::GAP.Obj)
135-
v = GAPWrap.Coefficients(basis_FG, x)
136-
v_int = [ZZRingElem(GAPWrap.IntFFE(v[i])) for i = 1:d]
137-
return sum([v_int[i]*basis_F[i] for i = 1:d])
131+
if p < 2^60
132+
finv = function(x::GAP.Obj)
133+
v = GAPWrap.Coefficients(basis_FG, x)
134+
v_int = [GAPWrap.IntFFE(v[i])::Int for i = 1:d]
135+
return FO(v_int)
136+
end
137+
else
138+
finv = function(x::GAP.Obj)
139+
v = GAPWrap.Coefficients(basis_FG, x)
140+
v_int = [ZZRingElem(GAPWrap.IntFFE(v[i]))::ZZRingElem for i = 1:d]
141+
return FO(v_int)
142+
end
138143
end
139144
else
140145
# Create an Oscar field `FO2` that is compatible with `FG`
@@ -149,21 +154,19 @@ function _iso_oscar_gap_field_finite_functions(FO::Union{FqPolyRepField, FqField
149154
if FO isa FqField
150155
f = function(x)
151156
y = preimage(emb, x)
152-
v = [GAP.Obj(Nemo._coeff(y, i)) for i in 0:(d - 1)]
153-
return sum([v[i]*basis_FG[i] for i in 1:d])
157+
return sum([GAP.Obj(Nemo._coeff(y, i-1))*basis_FG[i] for i in 1:d])
154158
end
155159
else
156160
f = function(x)
157161
y = preimage(emb, x)
158-
v = [GAP.Obj(coeff(y, i)) for i in 0:(d - 1)]
159-
return sum([v[i]*basis_FG[i] for i in 1:d])
162+
return sum([GAP.Obj(coeff(y, i-1))*basis_FG[i] for i in 1:d])
160163
end
161164
end
162165

163166
finv = function(x::GAP.Obj)
164167
v = GAPWrap.Coefficients(basis_FG, x)
165168
v_int = [ZZRingElem(GAPWrap.IntFFE(v[i])) for i = 1:d]
166-
return emb(sum([v_int[i]*basis_F[i] for i = 1:d]))
169+
return emb(FO2(v_int))
167170
end
168171
end
169172

0 commit comments

Comments
 (0)