Homomorphism from power series ring to residue field

31 views
Skip to first unread message

switzel

unread,
Jun 9, 2015, 10:07:21 AM6/9/15
to sage-s...@googlegroups.com
If I have a power series ring and its residue field


R = PowerSeriesRing(GF(2),'t')
F = R.residue_field()

there is no natural coercion morphism:

R.hom(F)
TypeError: Natural coercion morphism from Power Series Ring in t over Finite Field of size 2 to Finite Field of size 2 not defined.

But maybe there should be?
One can work around this by specifying

R.hom([0], F)

But with it not being natural, how does one extend it to a polynomial ring?

PR = PolynomialRing(R,'x,y')
PF = PolynomialRing(F,'x,y')
PR.hom(PF)

luisfe

unread,
Jun 9, 2015, 10:30:45 AM6/9/15
to sage-s...@googlegroups.com
Within a specific interactive session, you could do the following, when creating the rings:

sage: R = PowerSeriesRing(GF(2),'t')
sage: F = R.residue_field()
sage: phi = R.hom([0], F)
sage: F.register_coercion(phi)

This way, you are indicating that the morphism phi should be considered a coercion morphism from R to F.
Then, you are done, Sage is smart enough to extend it to polynomial rings.

sage: PR = PolynomialRing(R,'x,y')
sage: PF = PolynomialRing(F,'x,y')
sage: PR.hom(PF)

Ring Coercion morphism:
  From: Multivariate Polynomial Ring in x, y over Power Series Ring in t over Finite Field of size 2
  To:   Multivariate Polynomial Ring in x, y over Finite Field of size 2

Note that you will encounter problems. There is already a canonical coercion from F to R, namely the inclusion. This can be seen as the composition of the canonical inclusions
F subset F['t'] subset F[['t']]. So, with both coercions you end up with:

sage: t = R.gen()
sage: one = F(1) 
sage: t+one
1+t
sage: (t+one).parent() is R
True
sage: one+t
1
sage: (one+t).parent() is R
False
sage: (one+t).parent() is F
True

Both elements are coerced to the ring of the left element. Thus, adding elements from R and F is not conmutative, nor PR and PF. This will soon end in trouble if you are not careful enough. I recommend you instead to define phi but without adding it to the coercion framework:

sage: R = PowerSeriesRing(GF(2),'t')
sage: t = R.gen()
sage: F = R.residue_field()
sage: phi = R.hom([0], F)
sage: one = F(1)

And then, be explicit in the operations when you want to pass to the residue field.

sage: phi(t) + one
1
sage: PR = PolynomialRing(R, 'x,y')
sage: PF = PolynomialRing(F, 'x,y')
sage: x, y = PR.gens()
sage: f = (1+t)+(1-t^2)*x + (1+2*t)*y^3
sage: f
y^3 + (1 + t^2)*x + 1 + t
sage: g = f.map_coefficients(phi); g
y^3 + x + 1
sage: g.parent() is PR
False
sage: g.parent() is PF
True

Stefan Witzel

unread,
Jun 10, 2015, 7:21:03 AM6/10/15
to sage-s...@googlegroups.com
Thank you, luisfe, for this detailed reply!
Of course it would be formally nice to have the map

lambda x: x.map_coefficients(phi)

be an actual sage homomorphism (which it will always be if phi is a
homomorphism of coefficient rings). But for now what you propose works
fine for me.
Reply all
Reply to author
Forward
0 new messages