1
$\begingroup$

I have an expression:

(C1*R*(10*k12*k21 - 20*k11*k22 - k21^2*Cos[4*t] + 10*k11^2 + 10*k12^2 + 3*k21^2 + 10*k22^2 - 
 4*k12*k21*Cos[2*t] - 2*k12*k21*Cos[4*t] + 4*k11*k21*Sin[2*t] + 2*k11*k21*Sin[4*t] - 
 4*k21*k22*Sin[2*t] - 2*k21*k22*Sin[4*t]))/32 

and I would like to factor this in terms of squares of the ks. (e.g., (k12^2 - k21^2), (k22 - k11)^2, (k12 + k21)^2, etc.)

If the trigonometric identities can be simplified, then that's perfect. Any help would be appreciated.

$\endgroup$
0

1 Answer 1

4
$\begingroup$

From Daniel Lichtblau's answer, Working with symmetric polynomials, it's easy to do as much as is specified. I interpret "factor" to mean "write in terms of," but I'm not sure exactly what quadratic terms are implied.

subs = {q1 -> (k12^2 - k21^2), q2 -> (k22 - k11)^2, q3 -> (k12 + k21)^2};
polys = Subtract @@@ subs;
gb = GroebnerBasis[polys, {x, y}];

expr = (C1*
     R*(10*k12*k21 - 20*k11*k22 - k21^2*Cos[4*t] + 10*k11^2 + 10*k12^2 + 
       3*k21^2 + 10*k22^2 - 4*k12*k21*Cos[2*t] - 2*k12*k21*Cos[4*t] + 
       4*k11*k21*Sin[2*t] + 2*k11*k21*Sin[4*t] - 4*k21*k22*Sin[2*t] - 
       2*k21*k22*Sin[4*t]))/32;
PolynomialReduce[expr, gb, {k11, k12, k21, k22}][[2]]

If you want Mathematica to find some way to express expr in terms of quadratic expressions in the ks, create a list qs of the possible forms you would consider acceptable and create variables q[i], i = 1, ... up to the number of forms in qs. Then the above method will find a solution, but it won't be unique.

ks = {k11, k12, k21, k22};
qs = Flatten@
   MapThread[{#1^2 - #2^2, #1^2 + #2^2, (#1 - #2)^2, (#1 + #2)^2} &, 
    Transpose@Subsets[ks, {2}]];
subs = Thread[Array[q, Length@qs] -> qs];
polys = Subtract @@@ subs;
gb = GroebnerBasis[polys, {x, y}];

expr = (C1*
     R*(10*k12*k21 - 20*k11*k22 - k21^2*Cos[4*t] + 10*k11^2 + 
       10*k12^2 + 3*k21^2 + 10*k22^2 - 4*k12*k21*Cos[2*t] - 
       2*k12*k21*Cos[4*t] + 4*k11*k21*Sin[2*t] + 2*k11*k21*Sin[4*t] - 
       4*k21*k22*Sin[2*t] - 2*k21*k22*Sin[4*t]))/32;
quadReduced = PolynomialReduce[expr, gb, {k11, k12, k21, k22}~Join~Array[q, Length@qs]][[2]]

Use

quadReduce /. subs

to get expr back.

$\endgroup$
4
  • $\begingroup$ thanks for your answer...it helps a lot..i was wondering if it may be possible to write the above expression in terms of squares of the k's without actually myself defining them (I have some other onerous expressions and I wanted to simplify them in this fashion -- i don't really know the end product of these). Any other advice would be much appreciated. thanks again $\endgroup$
    – Stoc
    Mar 9, 2014 at 2:08
  • $\begingroup$ Which squares of the k's? I don't see the pattern -- the three are all different. $\endgroup$
    – Michael E2
    Mar 9, 2014 at 2:35
  • $\begingroup$ oh..i meant that the expressions themselves (i.e., those in subs) should be found automatically without me having to actually pre-define them -- for any expression...is this possible? it was just that i kind of knew the answer beforehand for this expression and so I put them in the question formulation, however, I have some other tedious expressions for which I do not know the end result...please let me know if I am not clear enough..thanks again $\endgroup$
    – Stoc
    Mar 9, 2014 at 15:34
  • $\begingroup$ @Stoc See if the second way does what you're after. You might want something in between, but I don't know how to do that automatically. If you have a basis in mind, you just have to be able to program it (for qs). $\endgroup$
    – Michael E2
    Mar 9, 2014 at 17:06

Not the answer you're looking for? Browse other questions tagged or ask your own question.