Implementing linear maps and their inverses in SageMath and Magma
I am currently trying to implement the linear maps in this post: https://math.stackexchange.com/questi... in Magma and SageMath. So far I have successfully implemented the maps in Magma and am currently trying to implement $X$ in SageMath.
My Magma code for $X$:
k := 8;
Fq := GF(2^k);
F := FunctionField(Fq);
places := Places(F, 1);
G := &+[places[i]: i in [2..k]];
B1 := Basis(G);
places := [places[i]: i in [k+1..2*k]];
X_matrix := Matrix([[Evaluate(f, P): P in places]: f in B1]);
X := function(f)
return Vector([Evaluate(f, P) : P in places]);
end function;
X_inv := function(v)
coeffs:= Solution(X_matrix, v);
return &+[coeffs[i] * B1[i]: i in [1..k]];
end function;
My SageMath code for $X$:
k = 8
m = 16
Fq = GF(2^k)
F.<x> = FunctionField(Fq)
places = F.places()
G = sum(places[i] for i in range(1,k))
B1 = list(reversed(G.basis_function_space()))
places = places[k:2*k]
X_matrix = matrix([[f.evaluate(p) for p in places] for f in B1])
def X(f):
return vector([f.evaluate(p) for p in places])
def X_inv(v):
coeffs = X_matrix.solve_right(v)
return sum(coeff * b for coeff, b in zip(coeffs, B1))
$X$ does not work correctly in SageMath. I have noticed that v
, B1
, and X_matrix
are symbolically represented in Magma with F
's generator inside X_inv
rather than Fq
's as they are outside.
v
:
outside X_inv
:
(1 Fq.1^25 Fq.1^50 Fq.1^198 Fq.1^223 Fq.1^238 Fq.1^104 Fq.1^75)
inside X_inv
:
(1 $.1^25 $.1^50 $.1^198 $.1^223 $.1^238 $.1^104 $.1^75)
B1
:
outside X_inv
:
[
($.1)^-1 * ($.1 + Fq.1)^-1 * ($.1 + Fq.1^2)^-1 * ($.1 + Fq.1^3)^-1 * ($.1 +
Fq.1^4)^-1 * ($.1 + Fq.1^5)^-1 * ($.1 + Fq.1^6)^-1,
($.1 + Fq.1)^-1 * ($.1 + Fq.1^2)^-1 * ($.1 + Fq.1^3)^-1 * ($.1 + Fq.1^4)^-1
* ($.1 + Fq.1^5)^-1 * ($.1 + Fq.1^6)^-1,
($.1) * ($.1 + Fq.1)^-1 * ($.1 + Fq.1^2)^-1 * ($.1 + Fq.1^3)^-1 * ($.1 +
Fq.1^4)^-1 * ($.1 + Fq.1^5)^-1 * ($.1 + Fq.1^6)^-1,
($.1)^2 * ($.1 + Fq.1)^-1 * ($.1 + Fq.1^2)^-1 * ($.1 + Fq.1^3)^-1 * ($.1 +
Fq.1^4)^-1 * ($.1 + Fq.1^5)^-1 * ($.1 + Fq.1^6)^-1,
($.1)^3 * ($.1 + Fq.1)^-1 * ($.1 + Fq.1^2)^-1 * ($.1 + Fq.1^3)^-1 * ($.1 +
Fq.1^4)^-1 * ($.1 + Fq.1^5)^-1 * ($.1 + Fq.1^6)^-1,
($.1)^4 * ($.1 + Fq.1)^-1 * ($.1 + Fq.1^2)^-1 * ($.1 + Fq.1^3)^-1 * ($.1 +
Fq.1^4)^-1 * ($.1 + Fq.1^5)^-1 * ($.1 + Fq.1^6)^-1,
($.1)^5 * ($.1 + Fq.1)^-1 * ($.1 + Fq.1^2)^-1 * ($.1 + Fq.1^3)^-1 * ($.1 +
Fq.1^4)^-1 * ($.1 + Fq.1^5)^-1 * ($.1 + Fq.1^6)^-1,
($.1)^6 * ($.1 + Fq.1)^-1 * ($.1 + Fq.1^2)^-1 * ($.1 + Fq.1^3)^-1 * ($.1 +
Fq.1^4)^-1 * ($.1 + Fq.1^5)^-1 * ($.1 + Fq.1^6)^-1
]
inside X_inv
:
[
($.1)^-1 * ($.1 + $.1)^-1 * ($.1 + $.1^2)^-1 * ($.1 + $.1^3)^-1 * ($.1 +
$.1^4)^-1 * ($.1 + $.1^5)^-1 * ($.1 + $.1^6)^-1,
($.1 + $.1)^-1 * ($.1 + $.1^2)^-1 * ($.1 + $.1^3)^-1 * ($.1 + $.1^4)^-1 *
($.1 + $.1^5)^-1 * ($.1 + $.1^6)^-1,
($.1) * ($.1 + $.1)^-1 * ($.1 + $.1^2)^-1 * ($.1 + $.1^3)^-1 * ($.1 +
$.1^4)^-1 * ($.1 + $.1^5)^-1 * ($.1 + $.1^6)^-1,
($.1)^2 * ($.1 + $.1)^-1 * ($.1 + $.1^2)^-1 * ($.1 + $.1^3)^-1 * ($.1 +
$.1^4)^-1 * ($.1 + $.1^5)^-1 * ($.1 + $.1^6)^-1,
($.1)^3 * ($.1 + $.1)^-1 * ($.1 + $.1^2)^-1 * ($.1 + $.1^3)^-1 * ($.1 +
$.1^4)^-1 * ($.1 + $.1^5)^-1 * ($.1 + $.1^6)^-1,
($.1)^4 * ($.1 + $.1)^-1 * ($.1 + $.1^2)^-1 * ($.1 + $.1^3)^-1 * ($.1 +
$.1^4)^-1 * ($.1 + $.1^5)^-1 * ($.1 + $.1^6)^-1,
($.1)^5 * ($.1 + $.1)^-1 * ($.1 + $.1^2)^-1 * ($.1 + $.1^3)^-1 * ($.1 +
$.1^4)^-1 * ($.1 + $.1^5)^-1 * ($.1 + $.1^6)^-1,
($.1)^6 * ($.1 + $.1)^-1 * ($.1 + $.1^2)^-1 * ($.1 + $.1^3)^-1 * ($.1 +
$.1^4)^-1 * ($.1 + $.1^5)^-1 * ($.1 + $.1^6)^-1
]
X_matrix
:
outside X_inv
:
[ Fq.1^10 Fq.1^177 Fq.1^26 Fq.1^128 Fq.1^206 Fq.1^98 Fq.1^161 Fq.1^173]
[ Fq.1^17 Fq.1^185 Fq.1^35 Fq.1^138 Fq.1^217 Fq.1^110 Fq.1^174 Fq.1^187]
[ Fq.1^24 Fq.1^193 Fq.1^44 Fq.1^148 Fq.1^228 Fq.1^122 Fq.1^187 Fq.1^201]
[ Fq.1^31 Fq.1^201 Fq.1^53 Fq.1^158 Fq.1^239 Fq.1^134 Fq.1^200 Fq.1^215]
[ Fq.1^38 Fq.1^209 Fq.1^62 Fq.1^168 Fq.1^250 Fq.1^146 Fq.1^213 Fq.1^229]
[ Fq.1^45 Fq.1^217 Fq.1^71 Fq.1^178 Fq.1^6 Fq.1^158 Fq.1^226 Fq.1^243]
[ Fq.1^52 Fq.1^225 Fq.1^80 Fq.1^188 Fq.1^17 Fq.1^170 Fq.1^239 Fq.1^2]
[ Fq.1^59 Fq.1^233 Fq.1^89 Fq.1^198 Fq.1^28 Fq.1^182 Fq.1^252 Fq.1^16]
inside X_inv
:
[ $.1^10 $.1^177 $.1^26 $.1^128 $.1^206 $.1^98 $.1^161 $.1^173]
[ $.1^17 $.1^185 $.1^35 $.1^138 $.1^217 $.1^110 $.1^174 $.1^187]
[ $.1^24 $.1^193 $.1^44 $.1^148 $.1^228 $.1^122 $.1^187 $.1^201]
[ $.1^31 $.1^201 $.1^53 $.1^158 $.1^239 $.1^134 $.1^200 $.1^215]
[ $.1^38 $.1^209 $.1^62 $.1^168 $.1^250 $.1^146 $.1^213 $.1^229]
[ $.1^45 $.1^217 $.1^71 $.1^178 $.1^6 $.1^158 $.1^226 $.1^243]
[ $.1^52 $.1^225 $.1^80 $.1^188 $.1^17 $.1^170 $.1^239 $.1^2]
[ $.1^59 $.1^233 $.1^89 $.1^198 $.1^28 $.1^182 $.1^252 $.1^16]
I have figured out how to symbolically represent X_matrix
and v
similarly in SageMath but am unsure how to do so with B1
.
B1
in SageMath:
[
1/(x^7 + (z8^6 + z8^5 + z8^4 + z8^3 + z8^2 + z8)*x^6 + z8^2*x^5 + (z8^7 + z8^4 + z8^3 + z8^2 + z8)*x^4 + (z8^5 + z8^4 + z8^3 + z8)*x^3 + (z8^5 + z8^4 + 1)*x^2 + (z8^6 + z8^5 + z8^4 + z8^2 + 1)*x),
1/(x^6 + (z8^6 + z8^5 + z8^4 + z8^3 + z8^2 + z8)*x^5 + z8^2*x^4 + (z8^7 + z8^4 + z8^3 + z8^2 + z8)*x^3 + (z8^5 + z8^4 + z8^3 + z8)*x^2 + (z8^5 + z8^4 + 1)*x + z8^6 + z8^5 + z8^4 + z8^2 + 1),
x/(x^6 + (z8^6 + z8^5 + z8^4 + z8^3 + z8^2 + z8)*x^5 + z8^2*x^4 + (z8^7 + z8^4 + z8^3 + z8^2 + z8)*x^3 + (z8^5 + z8^4 + z8^3 + z8)*x^2 + (z8^5 + z8^4 + 1)*x + z8^6 + z8^5 + z8^4 + z8^2 + 1),
x^2/(x^6 + (z8^6 + z8^5 + z8^4 + z8^3 + z8^2 + z8)*x^5 + z8^2*x^4 + (z8^7 + z8^4 + z8^3 + z8^2 + z8)*x^3 + (z8^5 + z8^4 + z8^3 + z8)*x^2 + (z8^5 + z8^4 + 1)*x + z8^6 + z8^5 + z8^4 + z8^2 + 1),
x^3/(x^6 + (z8^6 + z8^5 + z8^4 + z8^3 + z8^2 + z8)*x^5 + z8^2*x^4 + (z8^7 + z8^4 + z8^3 + z8^2 + z8)*x^3 + (z8^5 + z8^4 + z8^3 + z8)*x^2 + (z8^5 + z8^4 + 1)*x + z8^6 + z8^5 + z8^4 + z8^2 + 1),
x^4/(x^6 + (z8^6 + z8^5 + z8^4 + z8^3 + z8^2 + z8)*x^5 + z8^2*x^4 + (z8^7 + z8^4 + z8^3 + z8^2 + z8)*x^3 + (z8^5 + z8^4 + z8^3 + z8)*x^2 + (z8^5 + z8^4 + 1)*x + z8^6 + z8^5 + z8^4 + z8^2 + 1),
x^5/(x^6 + (z8^6 + z8^5 + z8^4 + z8^3 + z8^2 + z8)*x^5 + z8^2*x^4 + (z8^7 + z8^4 + z8^3 + z8^2 + z8)*x^3 + (z8^5 + z8^4 + z8^3 + z8)*x^2 + (z8^5 + z8^4 + 1)*x + z8^6 + z8^5 + z8^4 + z8^2 + 1),
x^6/(x^6 + (z8^6 + z8^5 + z8^4 + z8^3 + z8^2 + z8)*x^5 + z8^2*x^4 + (z8^7 + z8^4 + z8^3 + z8^2 + z8)*x^3 + (z8^5 + z8^4 + z8^3 + z8)*x^2 + (z8^5 + z8^4 + 1)*x + z8^6 + z8^5 + z8^4 + z8^2 + 1)
]
Any help would be much appreciated.