Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

This question already has an answer here:

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.

share|improve this question

marked as duplicate by Michael E2, Szabolcs, gpap, Artes, rm -rf Mar 11 at 0:53

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

1 Answer 1

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.

share|improve this answer
    
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 –  Stoc Mar 9 at 2:08
    
Which squares of the k's? I don't see the pattern -- the three are all different. –  Michael E2 Mar 9 at 2:35
    
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 –  Stoc Mar 9 at 15:34
    
@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). –  Michael E2 Mar 9 at 17:06

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