Ask Your Question
1

Roots of p-adic polynomials

asked 2013-11-04 14:54:57 +0100

lars.tennstedt gravatar image

updated 2017-07-31 21:47:15 +0100

FrédéricC gravatar image

Hello again,

I want to get the roots of a p-adic polynomial. I wrote the following code:

p = 2
q = 4
K = Qp(p)
L.<omega> = Qq(q)
O_L = L. integer_ring()
pi = L.uniformizer()
q = L.residue_class_degree()
f = X^q + pi*X
f.roots()

This rises following error:

NotImplementedError: root finding for this polynomial not implemented

I still use version 5.10 of Sage. The compile of the latest version 5.12 is ongoing. Do I miss something or is there no way to get the roots in this case?

Will this be implemented in the future or does someone know a workaround?

Thanks for your time again!

Bye Lars

edit retag flag offensive close merge delete

1 Answer

Sort by » oldest newest most voted
2

answered 2013-11-04 15:58:20 +0100

Luca gravatar image

I think polynomial factorization and roots are not implemented over the p-adics. Essentially, we miss Hensel lifting. Ticket http://trac.sagemath.org/ticket/14828 will add some useful functions for this, but I doubt it will enter any distribution before 6.x.

edit flag offensive delete link more

Comments

Thanks for your fast response. This is too bad. I took a look at this ticket and it looks promising. Unfortunately my knowledge of Python is not enough to help you. Is it even possible for me as a beginner in Python and Sage to implement Hensel lifting by myself or do I need deep knowledge of Python and Sage for this task? Is there an alternative to Sage which offers the function to compute p-adic roots of p-adic polynomials? Maybe KASH, Octave, Maple or Magma? Thanks again! Bye Lars

lars.tennstedt gravatar imagelars.tennstedt ( 2013-11-05 13:29:22 +0100 )edit

here is a very simple and buggy Hensel lift I wrote a long time ago (I needed to lift square roots) def hensel(P, r): "Basic Hensel lifting. P'(r) must be invertible." pK = P.base_ring() w = pK.uniformiser() r = r.lift_to_precision(min(2*r.precision_absolute(), P[0].precision_absolute())) zero = P(r) v = zero.valuation() if v <= 0: raise ValueError, "Impossible to lift." elif v >= P[0].precision_absolute(): return r else: return hensel(P, r - zero / P.derivative()(r)) It fails in many important border cases, but it did its job for me. If you understand it, you can certainly make it work for you. Magma has Hensel lifting.

Luca gravatar imageLuca ( 2013-11-06 05:39:41 +0100 )edit

Thanks for your response!

lars.tennstedt gravatar imagelars.tennstedt ( 2013-11-11 10:39:31 +0100 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2013-11-04 14:54:57 +0100

Seen: 1,322 times

Last updated: Nov 05 '13