OK, possibly I now understand Matthias Köppe's comment on the PR.  He said 
that the pushout of R and S looks suspicious (this is indeed computed in 
ModuleAction.__init__ and seems to govern the process):

sage: R
Univariate Polynomial Ring in z over Rational Field
sage: S
Univariate Polynomial Ring in z over Full MatrixSpace of 1 by 1 dense 
matrices over Rational Field
sage: pushout(R, S)
Univariate Polynomial Ring in z over Full MatrixSpace of 1 by 1 dense 
matrices over Univariate Polynomial Ring in z over Rational Field

I have not yet understood the documentation.  It says:

    try to construct a reasonable object `Y` and return maps such that 
canonically `R <- Y -> S`.

I would have thought that the most reasonable object in the case above 
would be S itself (I find the arrows are surprising, shouldn't they be the 
other way round?).

Martin
On Saturday 13 January 2024 at 11:47:20 UTC+1 Martin R wrote:

> I find the MatrixSpace example interesting:
>
> sage: R = MatrixSpace(QQ, 1)
> sage: P = PolynomialRing(R, names="z")
> sage: Q = PolynomialRing(QQ, names="z")
> sage: Q.gen() * P.gen()
> [z]*z
> sage: P.gen() * Q.gen()
> [z]*z
> sage: coercion_model.analyse(P.gen(), Q.gen(), operator.mul)
> (['Action discovered.',
>   Right scalar multiplication by Univariate Polynomial Ring in z over 
> Rational Field on Univariate Polynomial Ring in z over Full MatrixSpace of 
> 1 by 1 dense matrices over Rational Field],
>  Univariate Polynomial Ring in z over Full MatrixSpace of 1 by 1 dense 
> matrices over Univariate Polynomial Ring in z over Rational Field)
>
> So, the action of QQ[z] on Mat_n(QQ) [z]  returns something in 
> Mat_n(QQ[z]) [z].
>
> Where are these actions are actually coded?
>
> I am currently trying to figure out what ModuleAction.__init__ is doing.
>
> Martin
> On Saturday 13 January 2024 at 10:13:03 UTC+1 Martin R wrote:
>
>> How can I find out what causes this?  How can I find out where this 
>> action is defined?
>>
>> I played around a little, but without any insights.  It seems that most 
>> of the time, the coercion tries to do the embedding in the base ring, but 
>> not always.  The MatrixSpace seems to be another exception.
>>
>> I admit, it does look odd to me, because we usually treat variable names 
>> as the distinguishing feature of polynomial rings, don't we?
>>
>> Martin
>>
>> def test(R):
>>     """
>>     sage: test(QQ)
>>     z^2
>>     sage: test(ZZ)
>>     z^2
>>     sage: test(PolynomialRing(ZZ, "a"))
>>     z^2
>>     sage: test(PolynomialRing(ZZ, "a, b"))
>>     z^2
>>     sage: test(SymmetricFunctions(QQ).s())
>>     s[]*z^2
>>
>>     sage: test(MatrixSpace(QQ, 2))
>>     [z 0]
>>     [0 z]*z
>>     sage: test(PolynomialRing(ZZ, "z"))
>>     z*z
>>     sage: test(InfinitePolynomialRing(QQ, "a"))
>>     z*z
>>
>>     """
>>     P = PolynomialRing(R, names="z")
>>     p = P.gen()
>>     Q = PolynomialRing(QQ, names="z")
>>     q = Q.gen()
>>     return p*q
>>
>> On Saturday 13 January 2024 at 00:30:02 UTC+1 Nils Bruin wrote:
>>
>>> This might be at fault:
>>>
>>> sage: coercion_model.analyse(q,e)
>>> (['Action discovered.',
>>>   Left scalar multiplication by Multivariate Polynomial Ring in z, q 
>>> over Rational Field on Multivariate Polynomial Ring in z, q over Infinite 
>>> polynomial ring in F over Rational Field],
>>>  Multivariate Polynomial Ring in z, q over Infinite polynomial ring in F 
>>> over Multivariate Polynomial Ring in z, q over Rational Field)
>>>
>>> it looks like somehow an action is found before "common parent" 
>>> multiplication is used.
>>>
>>>
>>>
>>> On Friday 12 January 2024 at 17:24:00 UTC-5 Martin R wrote:
>>>
>>> I am not quite sure I understand how this works / what is used:
>>>
>>> sage: pushout(e.parent(), z.parent())
>>> Multivariate Polynomial Ring in z, q over Infinite polynomial ring in F 
>>> over Multivariate Polynomial Ring in z, q over Rational Field
>>> sage: coercion_model.common_parent(z, e)
>>> Multivariate Polynomial Ring in z, q over Infinite polynomial ring in F 
>>> over Rational Field
>>>
>>> Martin
>>> On Friday 12 January 2024 at 22:47:49 UTC+1 Martin R wrote:
>>>
>>> Hm, that's somewhat unfortunate - I don't see how to work around it.  I 
>>> guess I would have to force all elements to be in P (using the notation of 
>>> the example), but this is, I think, not possible.
>>>
>>> Do you know where this behaviour is determined?
>>>
>>> On Friday 12 January 2024 at 22:09:41 UTC+1 Nils Bruin wrote:
>>>
>>> On Friday 12 January 2024 at 14:30:06 UTC-5 Martin R wrote:
>>>
>>> I made a tiny bit of progress, and now face the following problem:
>>>
>>> sage: I.<F> = InfinitePolynomialRing(QQ) 
>>> sage: P.<z, q> = I[] 
>>> sage: e = z*q 
>>> sage: Q.<z, q> = QQ[] 
>>> sage: z*e
>>> z*z*q 
>>>
>>> Is this correct behaviour?
>>>
>>> I don't think it's desperately wrong. To sage, these structures look 
>>> like:
>>>
>>> sage: P.construction()
>>> (MPoly[z,q], Infinite polynomial ring in F over Rational Field)
>>> sage: Q.construction()
>>> (MPoly[z,q], Rational Field)
>>> sage: parent(z*e).construction()
>>> (MPoly[z,q],
>>>  Infinite polynomial ring in F over Multivariate Polynomial Ring in z, q 
>>> over Rational Field)
>>>
>>> Note that an "infinite polynomial ring" is a different object than an 
>>> MPoly, and obviously it has different rules/priorities for finding common 
>>> overstructures.
>>>  
>>>
>>>

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/sage-devel/698ba3bd-9dab-47f6-800c-572084d4c89fn%40googlegroups.com.

Reply via email to