Laurent series error q^2+O(q) is not O(q)

I get an error for the following code:

R.<q>=LaurentSeriesRing(QQ,1)
O(q)+q^2


Any explanation? (works for PowerSeriesRing) Here is the error:

Error in lines 2-2 Traceback (most recent call last): File "/cocalc/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 996, in execute exec compile(block+'\n', '', 'single') in namespace, locals File "", line 1, in <module> File "sage/structure/element.pyx", line 1192, in sage.structure.element.Element.__add__ (/ext/sage/sage-8.0/src/build/cythonized/sage/structure/element.c:10640) return (<element>left)._add_(right) File "sage/rings/laurent_series_ring_element.pyx", line 622, in sage.rings.laurent_series_ring_element.LaurentSeries._add_ (/ext/sage/sage-8.0/src/build/cythonized/sage/rings/laurent_series_ring_element.c:8637) return right.add_bigoh(self.prec()) File "sage/rings/laurent_series_ring_element.pyx", line 691, in sage.rings.laurent_series_ring_element.LaurentSeries.add_bigoh (/ext/sage/sage-8.0/src/build/cythonized/sage/rings/laurent_series_ring_element.c:9742) u = self.__u.add_bigoh(prec - self.__n) File "sage/rings/power_series_ring_element.pyx", line 797, in sage.rings.power_series_ring_element.PowerSeries.add_bigoh (/ext/sage/sage-8.0/src/build/cythonized/sage/rings/power_series_ring_element.c:9029) return self._parent(v, prec) File "sage/structure/parent.pyx", line 936, in sage.structure.parent.Parent.__call__ (/ext/sage/sage-8.0/src/build/cythonized/sage/structure/parent.c:9826) return mor._call_with_args(x, args, kwds) File "sage/structure/coerce_maps.pyx", line 173, in sage.structure.coerce_maps.DefaultConvertMap_unique._call_with_args (/ext/sage/sage-8.0/src/build/cythonized/sage/structure/coerce_maps.c:5322) raise File "sage/structure/coerce_maps.pyx", line 166, in sage.structure.coerce_maps.DefaultConvertMap_unique._call_with_args (/ext/sage/sage-8.0/src/build/cythonized/sage/structure/coerce_maps.c:5161) return C._element_constructor(x, *args) File "/ext/sage/sage-8.0/local/lib/python2.7/site-packages/sage/rings/power_series_ring.py", line 783, in _element_constructor_ raise ValueError("prec (= %s) must be non-negative" % prec) ValueError: prec (= -1) must be non-negative

edit retag close merge delete

Sort by » oldest newest most voted

What is the expectation?

Default precision has an other sense here... For instance:

sage: R.<q>=LaurentSeriesRing(QQ, default_prec=10)
sage: R(q^100)
q^100
sage: R(q^100)/R(1+q)
q^100 - q^101 + q^102 - q^103 + q^104 - q^105 + q^106 - q^107 + q^108 - q^109 + O(q^110)
sage: R(q^-100)/R(1+q)
q^-100 - q^-99 + q^-98 - q^-97 + q^-96 - q^-95 + q^-94 - q^-93 + q^-92 - q^-91 + O(q^-90)


The word default precision tells just how many significant terms should be computed and shown. It is not about an ideal, computations may show O(q^110) . Which is not O(q^10).

The initialization of an element of the ring is an other story, and sage assume the user knows what makes sense, and what not.

So q^2 + O(q) simply makes no sense. The error ValueError: prec (= -1) must be non-negative is telling enough. Same for q^2017 + O(q) where the error is of course ValueError: prec (= -2016) must be non-negative.

more

The expectation is O(q). The same code works for power series and gives the desired result O(q)

( 2017-10-19 16:08:25 +0200 )edit

OK, right, this should not happen.

But there is a good way to prevent thing going wrong like the above. Simply use

R.<q>=LaurentSeriesRing(QQ, default_prec=10)
a = R(q^2)


and there is no problem to work inside this ring. For instance:

sage: a
q^2
sage: a.precision_absolute()
+Infinity
sage: a.precision_relative()
+Infinity


The big problem i see is related to a bug (rather than feature) in the function add_bigoh, which crashes in a.add_bigoh(1) or in (a^3).add_bigoh(5) ... I think it is simple to fix the code. (I would fix it, but am still new in sage devel, no git use so far...)

Thanks for the post!

( 2017-10-23 22:45:45 +0200 )edit

Sorry, I don't really understand your way of preventing. I showed a simple example of how things can go wrong, which makes computations in Laurent series rings impossible because you can't even perform addition in there. For example,

a=R(1+q+O(q^2))
b=R(-1-q-O(q^4))
c=R(q^3+O(q^4))
print a+b+c


gives an error. I think you are right about the function add_bigoh. I tried to understand how to report bugs in here, but it seems overly complicated tbh, so if you or anyone could report that, it would be great! Also, it just seems that the whole LaurentSeriesRing is underdeveloped (earlier I asked about lifting homomorphisms from the base ring to Laurent series, which is implemented for polynomials but not for series),which is weird because Laurent series are better than power

( 2017-10-24 01:22:34 +0200 )edit