2

When working with finite fields, I often want to apply some transformation rules to the integers that appear either as coefficients in expressions. This becomes a problem when the transformation also gets applied to integral exponents.

As a simple example, suppose that I want to transform all the integer coefficients using the rule

n_Integer -> Mod[n + 2, 5] - 2

If I apply this rule to 13 x^3, both the coefficient and the exponent get transformed, so the result I get is

-(2/x^2)

...instead of the desired

-2*x^3

I've tried so many approaches, I can't list them all. Here's one example. This works for simple cases:

13 x^3
/. {Power[x, n_Integer] :> Power[x, ToString[n]]}
/. {n_Integer -> Mod[n + 2, 5] - 2}
/. {x_String -> ToExpression[x]}

-2*x^3

In general, however, I'd end up with expressions like

-2 x^(1 + "3")

...that would be impervious to the x_String -> ToExpression[x] transformation. (WHY?????)

Therefore I need a way to protect the exponents from transformation that can be more reliably reversed than converting them to strings.

Either that, or some other approach altogether, to transform the coefficients without transforming the exponents.

(FWIW, the "coefficient" corresponding to the constant term in a polynomial expression often does not belong to a Times expression.)


EDIT: OK, I found that changing the last transformation to {x_String :> ToExpression[x]} solves the problem (though I don't really understand why this delay is needed). Still, this solution strikes me as too-desperate a hack; there has to be better ways to solve this problem, so I'll let the question stand.

kjo
  • 11,717
  • 1
  • 30
  • 89

4 Answers4

2
 16 + 13 x^3 + 22 x^5 y^3 /. n_Integer rest_. :> (Mod[n + 2, 5] - 2) rest

1 - 2 x^3 + 2 x^5 y^3

kglr
  • 394,356
  • 18
  • 477
  • 896
2

When you want to do replacements with a pattern that shouldn't be changed, I like to use multiple replacement rules. In your example:

ReplaceAll[
    13 x^3,
    {
        p_Power :> p, (* pattern to avoid *)
        n_Integer :> Mod[n+2, 5] - 2
    }
]

-2 x^3

Carl Woll
  • 130,679
  • 6
  • 243
  • 355
1

You need to develop your pattern. See the Patterns and Transformation Rules tutorial.

For a single variable

13 x^3 /. n_Integer p_Power :> (Mod[n + 2, 5] - 2) p
-2 x^3

For multiple variables

13 x^3 y^4 /. n_Integer (p : _Power ..) :> (Mod[n + 2, 5] - 2) p
-2 x^3 y^4

Hope this helps.

Edmund
  • 42,267
  • 3
  • 51
  • 143
1

Note that Mod[n + 2, 5] - 2 is the same as Mod[n, 5, -2].

This performs algebraically the transformation you seem to be seeking:

modForm[p_, x_, m_, d_] := 
 x^Range[0, Length[#] - 1].# &@ Mod[CoefficientList[p, x], m, d]

p = (1 - 3 x^5) (2 - x^3)^2;
p // Expand
modForm[p, x, 5, -2]
(*
   4 - 4 x^3 - 12 x^5 + x^6 + 12 x^8 - 3 x^11
  -1 +   x^3 -  2 x^5 + x^6 +  2 x^8 + 2 x^11
*)
Michael E2
  • 235,386
  • 17
  • 334
  • 747