# Algorithm for Weierstrass Preparation Theorem for Formal Power Series

The Weierstrass preparation theorem for formal power series rings guarantees that if a given formal series $f(z) = \sum a_k z^k \in R[[z]]$ where $R$ is a complete local ring with maximal ideal $M$ has $a_k \in M$ for $k < n$ and $a_n \in R^* = M^c$, then

$$f = (z^n + b_{n-1}z^{n-1} + \cdots + b_0)u$$ where $b_k \in M$ and $u$ is a unit in $R[[z]]$.

I need an explicit algorithm for calculating this Weierstrass polynomial (or distinguished polynomial) for a given $f$. In my case the coefficient ring is $R = \mathbb Z_3[[x]]$, formal power series over the 3-adics. So any algorithm would have to be robust enough to handle these coefficients.

Does anyone know of such an algorithm for a math software package?

-
Just a comment, since I don't know and don't have the time to check: maybe you want to look at the documentation of the constructor WEIER in FriCAS whether this is what you want. If so, the file weier.spad.pamphlet in the FriCAS distribution (fricas.sourceforge.net) contains the source. Don't hesitate to ask on fricas-devel@googlegroups.com –  Martin Rubey Oct 18 '10 at 7:22
I don't think either MAGMA or SAGE have such functionality built in. But it should be trivial to code in any package which handles power series with not-necessarily-field coefficients. Look at Manin's proof in Ch.5 sec.2 of Lang's "Cyclotomic Field", (p.130 of the combined edition), which gives an explicit formula. –  Tony Scholl Oct 18 '10 at 14:23
It seems that Manin's method suggests an algoriithm to approximate the unit power series (that I called "u" above) to any finite degree of precision. But being interested in the polynomial I would need to calculate u exactly so that I could find f*(u^-1). The package WEIER seems to only work for field coefficients, though I had trouble executing it. Entreaties to the FriCAS development group haven't produced a response. –  R. Nendorf Nov 8 '10 at 18:37

Here's an algorithm that I use. Let's call $S$ the degree-$n$ shift operation, sending $\sum c_kz^k$ to $\sum c_{n+k}z^k$, in other words the quotient when you divide a power series by $z^n$. Step 0: divide $f$ by $Sf$, giving you a power series $f_1$ such that $Sf_1\equiv 1$ modulo $M$. Step $i$, for $i > 0$: repeat. At each stage, you get a power series $f_i$ for which $Sf_i\equiv 1$ modulo $M^i$. For a quicker variant of Step $i$ (for $i > 0$), instead multiply by $2-Sf_i$. It works because you've constructed a convergent infinite product.