Hi Max, On 2021-09-08, Max Alekseyev <max...@gmail.com> wrote: > I've found a couple of issues with differentiation in InfinitePolynomialRing > > (ISSUE #1) Differentiation fails in InfinitePolynomialRing(QQ), e.g. the > following code > > R.<x> = InfinitePolynomialRing(QQ) > f = x[0] + x[1] > derivative(f,x[1]) > > gives an error > TypeError: Argument 'var' has incorrect type (expected > sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular, > got InfinitePolynomial_dense)
Sure, that's not supposed to work. InfinitePolynomialRing knows nothing about symbolic calculus. That would be the job of symbolic expressions. > However, if we replace QQ with something more sophisticated, > differentiation starts suddenly work: > > K.<u> = PolynomialRing(QQ) > R.<x> = InfinitePolynomialRing(K) > f = x[0] + x[1] > derivative(f,x[1]) > > gives 1 as expected. Interesting. That's not supposed to work either. A possible explanation: InfinitePolynomialRing uses a *finite* polynomial ring under the hood, which is extended when a generator is requested with a higher index. If I recall correctly, methods that aren't explicitly implemented for elements of InfinitePolynomialRing are forwarded to the underlying finite polynomials. That could explain why it works at all. But I don't know why it only works if the base ring is a polynomial ring. > (ISSUE #2) Slightly modifying the second example above: > > K.<u> = PolynomialRing(QQ) > R.<x> = InfinitePolynomialRing(K) > f = x[0] + x[1] > derivative(f,x[2]) > > we get an error > ValueError: cannot differentiate with respect to x_2 > > However, if we try to execute the same 'derivative(f,x[2])' command again > in the same Sage session, it will succeed. > So, it appears that if we differentiate with respect to a new variable, > which was not accessed before, then differentiation would fail. I hope this > is not an intended behavior and can be easily fixed. When you create f, then it is implemented based on a ring with two variables x0 and x1. Thus, a method of an element of K['x0','x1'] is called, on x[2], which K['x0','x1'] doesn't know about. But by calling x[2], the underlying finite ring in the meantime is extended to K['x0', 'x1', 'x2'], thus, when you try to differentiate a second time, it is done in a ring in which x2 is known. At least that's my guess. As I said, differentiation is not supposed to work. But I (as original author) don't fully understand *why* it sometimes works and how to fix that (by "fix", I mean "make it not work and, in the best case, suggest to convert to a symbolic expression"). InfinitePolynomialRing was created for a very narrow purpose, namely computing symmetric Gröbner bases. In particular, calculus was not in the scope. If someone wants to extend its functionality, I wouldn't mind though. Best regards, Simon -- You received this message because you are subscribed to the Google Groups "sage-support" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-support+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sage-support/shahdk%245et%241%40ciao.gmane.io.