Thanks for your answer! I was able to create the required homomorphism with your suggested method. Out of curiosity: how would you explicitly define what is mapped to the variable of the inner polynomial ring? (When for example, they have different names.) The homomorphism in your example clearly sends x in B to x in C, so why doesn't hom() tell this? Is there a way to find out what a homomorphism actually does, apart from by giving it some input?
My original problem was actually coercing from a multivariate polynomial ring over a polynomial ring to a single multivariate polynomial ring. In this case there is no coercion: sage: A = QQ['t'] sage: B = A['x','y'] sage: C = QQ['x','y', 't'] sage: C.coerce(B(1)) (...) TypeError: no canonical coercion from Multivariate Polynomial Ring in x, y over Univariate Polynomial Ring in t over Rational Field to Multivariate Polynomial Ring in x, y, t over Rational Field On Thursday, October 1, 2015 at 6:47:36 PM UTC+2, Nils Bruin wrote: > > On Thursday, October 1, 2015 at 8:15:39 AM UTC-7, len...@ackermans.info > wrote: >> >> In my code I often encounter elements of polynomial rings of polynomial >> rings. Since some functions only work on multivariate polynomial rings I >> need to create a homomorphism, but I'm unable to do this. What is the >> recommended way? >> > > This is actually one of the things where sage's coercion framework is > pretty advanced. You do have to make sure that the names of the variables > agree, tough. Sage uses those names to figure out how to coerce. To define > the homomorphism: > > sage: A=QQ['x'] > sage: B=A['y'] > sage: C=QQ['x','y'] > sage: B.hom([C.1]) > Ring morphism: > From: Univariate Polynomial Ring in y over Univariate Polynomial Ring in > x over Rational Field > To: Multivariate Polynomial Ring in x, y over Rational Field > Defn: y |--> y > > The homomorphism is described by "send the generator of B (over A) to the > second generator of C, and figure out yourself how to coerce A into C". It > can do the latter because both A and C are generated over a common subring > (QQ) and the generator of A has a name that is equal to the name of a > generator of C: an obvious target. > > Indeed, these rules allow sage to even coerce B into C: you can just mix > them in expressions: > > sage: A.0+B.0+C.0 > 2*x + y > > It chooses the multivariate ring as the common parent: > > sage: parent(A.0+B.0+C.0) is C > True > > You can also obtain the coercion map sage uses itself and use it as the > homomorphism you asked for at the top: > > sage: C.coerce_map_from(B) > Conversion map: > From: Univariate Polynomial Ring in y over Univariate Polynomial Ring in > x over Rational Field > To: Multivariate Polynomial Ring in x, y over Rational Field > > > >> Further questions: >> Why is there no standard coercion between nested polynomial rings and >> multivariate polynomial rings? >> > > There is such a coercion > > Should we change functions on polynomials like factor() to work in the >> case of nested polynomial rings, by using a coercion to multivariate >> polynomial rings? >> > > In individual cases: possibly. In general: no. There could be merit in > "nested" arithmetic. > > -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at http://groups.google.com/group/sage-devel. For more options, visit https://groups.google.com/d/optout.