Opened 11 years ago

# Bug in power series sqrt

Reported by: Owned by: robertwb somebody major sage-7.0 commutative algebra power series N/A

```sage: t = QQ[['t']].0
sage: sqrt(1+t)
1 + 1/2*t - 1/8*t^2 + 1/16*t^3 - 5/128*t^4 + 7/256*t^5 - 21/1024*t^6 + 33/2048*t^7 - 429/32768*t^8 + 715/65536*t^9 - 2431/262144*t^10 + 4199/524288*t^11 - 29393/4194304*t^12 + 52003/8388608*t^13 - 185725/33554432*t^14 + 334305/67108864*t^15 - 9694845/2147483648*t^16 + 17678835/4294967296*t^17 - 64822395/17179869184*t^18 + 119409675/34359738368*t^19 + O(t^20)
sage: sqrt(2+t)
------------------------------------------------------------
Traceback (most recent call last):
```

Now this error is expected because `sqrt()` has an `extend` keyword that allows to extend the base ring, and to give the name of the generator of the quadratic field, but this does not work:

```sage: K.<t> = PowerSeriesRing(QQ, 5)
sage: (t+2).sqrt(extend=True, name='sqrt2')
sqrt2
```

The expected output would be `sqrt2 + sqrt2*x/4 + sqrt2*x^2/32 +...`

However, more convenient would be to make the default of `extend` to be `True` and for square roots of integers `N` the name `sqrtN` provided. Only raise an error for nonintegers if no name is given.

### comment:1 Changed 11 years ago by jason

Related:

```[00:12] <jason--> sage: t = QQ[['t']].0
[00:12] <jason--> sage: 1/(1-t)
[00:12] <jason--> 1 + t + t^2 + t^3 + t^4 + t^5 + t^6 + t^7 + t^8 + t^9 + t^10 + t^11 + t^12 + t^13 + t^14 + t^15 + t^16 + t^17 + t^18 + t^19 + O(t^20)
[00:12] <jason--> but log(1+t) doesn't work, for example
[00:12] <jason--> should it?
[00:12] <craigcitro> in principle, yes. :)
[00:13] <craigcitro> see if (1+t) has a log method ...
[00:13] <jason--> and sin(t), cos(t), etc.
[00:13] <jason--> so maybe a fallback method that calls for a taylor series?
```

### comment:2 Changed 6 years ago by chapoton

• Keywords power series added
• Report Upstream set to N/A

### comment:3 Changed 6 years ago by jdemeyer

• Milestone changed from sage-5.11 to sage-5.12

### comment:4 Changed 6 years ago by vbraun_spam

• Milestone changed from sage-6.1 to sage-6.2

### comment:5 Changed 5 years ago by vbraun_spam

• Milestone changed from sage-6.2 to sage-6.3

### comment:6 Changed 5 years ago by vbraun_spam

• Milestone changed from sage-6.3 to sage-6.4

### comment:7 Changed 4 years ago by mmezzarobba

• Milestone changed from sage-6.4 to sage-duplicate/invalid/wontfix
• Status changed from new to needs_review

Message fixed in #6998.

### comment:8 Changed 4 years ago by vdelecroix

In the description there is

```Perhaps the error is just bad, but it should be able
to compute this by extending to a field with sqrt(2).
```

Note that the following works, but it is not very direct

```sage: (2+t).change_ring(QuadraticField(2)).sqrt()
a + 1/4*a*t - 1/32*a*t^2 + 1/128*a*t^3 - ... + O(t^20)
```

### comment:9 Changed 4 years ago by vdelecroix

• Status changed from needs_review to needs_info

### comment:10 Changed 4 years ago by rws

• Milestone changed from sage-duplicate/invalid/wontfix to sage-7.0

In the meantime the error changed to:

```/home/ralf/sage/src/sage/rings/power_series_ring_element.pyx in sage.rings.power_series_ring_element.PowerSeries.sqrt (build/cythonized/sage/rings/power_series_ring_element.c:13321)()
1295                     return a
1296             elif formal_sqrt:
-> 1297                 raise ValueError, "unable to take the square root of %s"%u
1298             else:
1299                 raise ValueError, "power series does not have a square root since it has odd valuation."

ValueError: unable to take the square root of 3
```

There are also these keywords to consider. However `extend=True` returns not a square root of the series but the square root of the extension ring, and I am not sure what use it is, I think it's simply a bug:

```          - ``extend`` - bool (default: False); if True, return a square
root in an extension ring, if necessary. Otherwise, raise
a ValueError if the square root is not in the base power series
ring. For example, if ``extend`` is True the square root of a
power series with odd degree leading coefficient is
defined as an element of a formal extension ring.

- ``name`` - string; if ``extend`` is True, you must also specify the     print
name of the formal square root.

sage: K.<t> = PowerSeriesRing(QQ, 5)
sage: two = K(2)
sage: sqrt2 = two.sqrt(extend=True, name='sqrt2')
sage: (t+sqrt2^2).sqrt()
---------------------------------------------------------------------------
NotImplementedError                       Traceback (most recent call last)
<ipython-input-9-0401d4729a88> in <module>()
----> 1 (t+sqrt2**Integer(2)).sqrt()

/home/ralf/sage/src/sage/structure/element.pyx in sage.structure.element.CommutativeRingElement.sqrt (build/cythonized/sage/structure/element.c:19922)()
2424         from sage.rings.integral_domain import is_IntegralDomain
2425         P=self._parent
-> 2426         is_sqr, sq_rt = self.is_square( root = True )
2427         if is_sqr:
2428             if all:

/home/ralf/sage/src/sage/structure/element.pyx in sage.structure.element.CommutativeRingElement.is_square (build/cythonized/sage/structure/element.c:19744)()
2328             framework.
2329         """
-> 2330         raise NotImplementedError("is_square() not implemented for elements of %s" % self.parent())
2331
2332     def sqrt(self, extend=True, all=False, name=None):

NotImplementedError: is_square() not implemented for elements of Univariate Quotient Polynomial Ring in sqrt2 over Power Series Ring in t over Rational Field with modulus x^2 - 2
```

So effectively the original issue (giving a correct result for `(2+t).sqrt()` regardless of whether automagically or by giving the `extend` keyword) is not fixed.

Last edited 4 years ago by rws (previous) (diff)

### comment:11 Changed 4 years ago by rws

I also think the default of `extend` should be true and for square roots of integers `N` the name `sqrtN` provided. Only raise an error for nonintegers if no name is given.

EDIT: typos

Last edited 4 years ago by rws (previous) (diff)

### comment:12 Changed 4 years ago by rws

• Component changed from basic arithmetic to commutative algebra
• Description modified (diff)
• Status changed from needs_info to needs_work
Note: See TracTickets for help on using tickets.