Ask Your Question
1

How to evaluate composed rational maps over finite fields?

asked 2025-06-29 18:45:52 +0200

Somudro gravatar image

My actual aim is to evaluate the composition of $n$ maps $h(x, y)=f_n(x, y)\circ \cdots \circ f_1(x, y)$ over the finite field $GF(q)$ for a prime $q$ at specified point $(X, Y)$. The map $h(x, y)$ is specified as a composite map. The maps $f_i(x, y)$s are not accessible, so they can not be evaluated at $(X, Y)$, recursively. Here is a toy example.

from sage.categories.morphism import SetMorphism

F = GF(23)
R.<x, y> = PolynomialRing(F)

# This part is not accessible
f0 = ((x^2 + 1)/x, (x^2*y - y)/x^2)
f1 = ((x^2 - 2*x + 8)/(x - 2), (x^2*y - 4*x*y - 4*y)/(x^2 - 4*x + 4))
f2 = ((x^2 + x + 5)/(x + 1), (x^2*y + 2*x*y - 4*y)/(x^2 + 2*x + 1))
f3 = ((x^3 + 11*x^2 - x - 4)/(x^2 + 11*x - 10), (x^3*y + 5*x^2*y + 7*x*y - 9*y)/(x^3 + 5*x^2 - 7*x - 9))

h0 = SetMorphism(Hom(F, F), f0)
h1 = SetMorphism(Hom(F, F), f1)
h2 = SetMorphism(Hom(F, F), f2)
h3 = SetMorphism(Hom(F, F), f3)
# This part is not accessible

h = h0*h1*h2*h3
print (h)
print (h(2, 4))

This outputs

Composite map:
  From: Finite Field of size 23
  To:   Finite Field of size 23
  Defn:   Generic endomorphism of Finite Field of size 23
        then
          Generic endomorphism of Finite Field of size 23
        then
          Generic endomorphism of Finite Field of size 23
        then
          Generic endomorphism of Finite Field of size 23
   ---------------------------------------------------------------------------
   TypeError                                 Traceback (most recent call last)
   Cell In[1], line 23
   21 h = h0*h1*h2*h3
   22 print (h)
   ---> 23 print (h(Integer(2), Integer(4)))

   File /home/sc_serv/sage/src/sage/categories/map.pyx:825, in sage.categories.map.Map.__call__()
   823     if not args and not kwds:
   824         return self._call_(x)
   --> 825     return self._call_with_args(x, args, kwds)
   826 
   827 cpdef Element _call_(self, x):

   File /home/sc_serv/sage/src/sage/categories/map.pyx:1765, in 
   sage.categories.map.FormalCompositeMap._call_with_args()
   1763 """
   1764 for f in self.__list[:-1]:
   -> 1765     x = f._call_(x)
   1766 return self.__list[-1]._call_with_args(x, args, kwds)
   1767 

   File /home/sc_serv/sage/src/sage/categories/morphism.pyx:593, in sage.categories.morphism.SetMorphism._call_()
   591     self._function = function
   592 
   --> 593 cpdef Element _call_(self, x):
   594     """
   595     INPUT:

   File /home/sc_serv/sage/src/sage/categories/morphism.pyx:612, in sage.categories.morphism.SetMorphism._call_()
   610         3
   611     """
   --> 612     return self._function(x)
   613 
   614 cpdef Element _call_with_args(self, x, args=(), kwds={}):

   TypeError: 'tuple' object is not callable

But, the composed rational map should look like,

h = ((x^24 + 2*x^23 + 2*x^22 + 4*x^21 + 6*x^20 + 11*x^19 - 5*x^18 - 2*x^17 + 9*x^16 + 6*x^15 - 4*x^14 + 11*x^13 + 11*x^11 - 4*x^10 + 6*x^9 + 9*x^8 - 2*x^7 - 5*x^6 + 11*x^5 + 6*x^4 + 4*x^3 + 2*x^2 + 2*x + 1)/(x^23 + 2*x^22 + 2*x^21 + 4*x^20 + 6*x^19 + 11*x^18 - 5*x^17 - 2*x^16 + 9*x^15 + 6*x^14 - 4*x^13 + 9*x^12 - 4*x^11 + 6*x^10 + 9*x^9 - 2*x^8 - 5*x^7 + 11*x^6 + 6*x^5 + 4*x^4 + 2*x^3 + 2*x^2 + x), (x^35*y + 3*x^34*y - 7*x^33*y - 3*x^32*y + x^31*y + 8*x^30*y + x^29*y + 3*x^28*y + 3*x^27*y + 2*x^26*y + 3*x^25*y + 7*x^24*y - x^23*y - 2*x^21*y + 9*x^20*y + 11*x^19*y + x^18*y + x^17*y + 11*x^16*y + 9*x^15*y - 2*x^14*y - x^12*y + 7*x^11*y + 3*x^10*y + 2*x^9*y + 3*x^8*y + 3*x^7*y + x^6*y + 8*x^5*y + x^4*y - 3*x^3*y - 7*x^2*y + 3*x*y + y)/(x^35 + 3*x^34 - 7*x^33 - 3*x^32 + x^31 + 8*x^30 + x^29 + 3*x^28 + 3*x^27 + 2*x^26 + 3*x^25 + 4*x^24 - 10*x^23 + 10*x^22 - 3*x^21 - x^20 - 2*x^19 + 2*x^18 + x^17 + 3*x^16 - 10*x^15 + 10*x^14 - 4*x^13 - 3*x^12 - 2*x^11 - 3*x^10 - 3*x^9 - x^8 - 8*x^7 - x^6 + 3*x^5 + 7*x^4 - 3*x^3 - x^2))

My questions are,

  1. How to evaluate the map $h$ on the point $(X=2, Y= 4)$. i.e., how to find $h(2, 4)$?
  2. How to find the rational map of $h$ and its degree?

I would be thankful if anyone suggests the method.

edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted
0

answered 2025-06-30 00:00:44 +0200

rburing gravatar image

updated 2025-07-01 22:11:55 +0200

Here is a way:

F = GF(23)
A2.<x,y> = AffineSpace(F, 2)
H = Hom(A2, A2)
h0 = H([(x^2 + 1)/x, (x^2*y - y)/x^2])
h1 = H([(x^2 - 2*x + 8)/(x - 2), (x^2*y - 4*x*y - 4*y)/(x^2 - 4*x + 4)])
h2 = H([(x^2 + x + 5)/(x + 1), (x^2*y + 2*x*y - 4*y)/(x^2 + 2*x + 1)])
h3 = H([(x^3 + 11*x^2 - x - 4)/(x^2 + 11*x - 10), (x^3*y + 5*x^2*y + 7*x*y - 9*y)/(x^3 + 5*x^2 - 7*x - 9)])
h = h3*h2*h1*h0

Answers to the questions:

$h(2,4)$:

sage: h((2,4))
(10, 12)

The rational map of $h$:

sage: h
Scheme endomorphism of Affine Space of dimension 2 over Finite Field of size 23
  Defn: Defined on coordinates by sending (x, y) to
        ((x^24 + 2*x^23 + 2*x^22 + 4*x^21 + 6*x^20 + 11*x^19 - 5*x^18 - 2*x^17 + 9*x^16 + 6*x^15 - 4*x^14 + 11*x^13 + 11*x^11 - 4*x^10 + 6*x^9 + 9*x^8 - 2*x^7 - 5*x^6 + 11*x^5 + 6*x^4 + 4*x^3 + 2*x^2 + 2*x + 1)/(x^23 + 2*x^22 + 2*x^21 + 4*x^20 + 6*x^19 + 11*x^18 - 5*x^17 - 2*x^16 + 9*x^15 + 6*x^14 - 4*x^13 + 9*x^12 - 4*x^11 + 6*x^10 + 9*x^9 - 2*x^8 - 5*x^7 + 11*x^6 + 6*x^5 + 4*x^4 + 2*x^3 + 2*x^2 + x), (x^35*y + 3*x^34*y - 7*x^33*y - 3*x^32*y + x^31*y + 8*x^30*y + x^29*y + 3*x^28*y + 3*x^27*y + 2*x^26*y + 3*x^25*y + 7*x^24*y - x^23*y - 2*x^21*y + 9*x^20*y + 11*x^19*y + x^18*y + x^17*y + 11*x^16*y + 9*x^15*y - 2*x^14*y - x^12*y + 7*x^11*y + 3*x^10*y + 2*x^9*y + 3*x^8*y + 3*x^7*y + x^6*y + 8*x^5*y + x^4*y - 3*x^3*y - 7*x^2*y + 3*x*y + y)/(x^35 + 3*x^34 - 7*x^33 - 3*x^32 + x^31 + 8*x^30 + x^29 + 3*x^28 + 3*x^27 + 2*x^26 + 3*x^25 + 4*x^24 - 10*x^23 + 10*x^22 - 3*x^21 - x^20 - 2*x^19 + 2*x^18 + x^17 + 3*x^16 - 10*x^15 + 10*x^14 - 4*x^13 - 3*x^12 - 2*x^11 - 3*x^10 - 3*x^9 - x^8 - 8*x^7 - x^6 + 3*x^5 + 7*x^4 - 3*x^3 - x^2))

Its degree:

sage: h.degree()
36

The defining rational functions:

sage: list(h)

or

sage: tuple(h)
edit flag offensive delete link more

Comments

@rburing Thank you so much. Excellent, it works. Also, I apologise for this delay to come back. I was incorporating this in my code. The only thing that I want to add is that would it be possible to extract the right-hand-side of the map of $h$? I need to modify the map. In this example, I need to extract the rational map ((x^24 + 2*x^23 + ... - 3*x^3 - x^2)) only.

Somudro gravatar imageSomudro ( 2025-07-01 20:02:51 +0200 )edit

Yes, you can do e.g. list(h) or tuple(h); I added it to my answer.

rburing gravatar imagerburing ( 2025-07-01 22:12:50 +0200 )edit

Many thanks. It works.

Somudro gravatar imageSomudro ( 2025-07-01 22:41:16 +0200 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2025-06-29 18:45:52 +0200

Seen: 25 times

Last updated: Jul 01