# How to make all numbers equal to one in a Series?

I have many outputs of one-dimensional Series expansions for which I am only interested in the general tending with the variable.

For example, I would like to be able to transform something like

3.4235 + (4.22-5.2342 I) a + 7.543 a^6 + O[a]^7


into just

1 + a + a^6 + O[a]^7


etc.

I have tried many things, including trying to collect the SeriesCoefficients and reassign them to 1, but I haven't been able to make it work yet.

Here's an example of an attempt that isn't yet working (note, if it did work as expected, I would still need to add a simple If[] to exclude assigning SeriesCoefficients or Chop@SeriesCoefficients that are 0 to 1).

 clear[test]; test = Series[1/(1 - b x), {x, 0, 4}];
Do[test = ReplaceAll[test, SeriesCoefficient[test, s] -> 3], {s, 0, 4}];
Print@test


Probably a much more efficient solution to this problem would be a more general rule that could be applied to the final output that simply checks the expression for "numbers" and makes them all 1. Surely there is a way to get mathematica to recognize numbers compared to symbols?

-

Rule suggestion:

3.4235 + (4.22 - 5.2342 I) a + 7.543 a^6 + O[a]^7 /. _Rational|_Real|_Complex -> 1

(* Out: 1+a+a^6+O[a]^7 *)


This simple rule unfortunately cannot easily be extended to handle integer coefficients. However, Mr. Wizard's solution does that.

-
Beautiful, this is exactly what I was looking for. –  Steve Jan 27 '14 at 21:48
Look out for Integer coefficients. ;) –  Kuba Jan 27 '14 at 21:50
And rationals... –  rasher Jan 27 '14 at 21:55
@Pickett: cleaner perhaps: Replace[3/4 + (4.22 - 5.2342 I) a + 7.543 a^6 + O[a]^7, _?NumberQ -> 1, {2}] - NVM - this does not do it. –  rasher Jan 27 '14 at 21:59
@Mr.Wizard Very true, it seems it will take some work to include Integer due to it being used in the hidden representation of series data. I removed Integer in the meantime. rasher: I think beginners like rules the way I wrote it more. –  Pickett Jan 27 '14 at 22:02

Let's look at the InputForm of your expression:

expr = 3.4235 + (4.22 - 5.2342 I) a + 7.543 a^6 + O[a]^7;
InputForm[expr]

SeriesData[a, 0, {3.4235, 4.22 - 5.2342*I, 0, 0, 0, 0, 7.543}, 0, 7, 1]


You want to set all the coefficients to one, so let's do that with Unitize:

MapAt[Unitize, expr, 3]

1 + a + a^6 + O[a]^7


Or, if you prefer, as a Rule:

expr /. c_List :> Unitize[c]

1 + a + a^6 + O[a]^7

-
Beat me to it ;-) –  rasher Jan 27 '14 at 22:11
@rasher I need to still win a few of those races or I'll feel old. :o) –  Mr.Wizard Jan 27 '14 at 22:14
Your rule method is not working for me in the general context, but the /. _Rational|_Real|_Complex -> 1 rule from above is. Perhaps there is more at work, but just letting people know. The Pickett solution will hit everything but integer coefficients, I suppose. For me, exact integer coefficients are absurdly rare, but for other problems that might be a concern. –  Steve Jan 28 '14 at 17:44
@Steve Please give me an example where it fails. Also, if it is only the Rule method is there any reason not to use MapAt? I feel the latter is a distinctly superior method and I am prepared to argue that case. –  Mr.Wizard Jan 28 '14 at 23:50
Hmm, I'm not sure I can provide a simple example where it fails, but in my research problem neither the MapAt or Unitize rules seem to work when implemented in the same way as the other rule. –  Steve Jan 30 '14 at 17:33

I like the solutions offered above. This my answer is only in order to have one more solution, though it is not as good as those above. If the O[a]^7 term is not dear to you, there is also such a way:

expr = 3.4235 + (4.22 - 5.2342 I) a + 7.543 a^6 + O[a]^7;

FromCoefficientRules[
CoefficientRules[expr // Normal] /. ({u_} -> v_) -> ({u} -> 1), a]

(*   1 + a + a^6  *)

-