# Output function control and manipulation for efficient computation [closed]

I have taken note of a similar post related to modifying function parameters. I tried to adapt Kuba's solution to this post but I can't get it to work. I will illustrate my problem using a similar notation used in the other post.

I have a function, $f$, that has an arbitrary, but even number of arguments; i.e. $f(A,B,C,D,E,F)$. The parameters $A,B,C,D,E,F$ actually represent variables which I integrate over. Now two different variables may be switched, but the evaluation of the integration of such a function will not change since all we have done is switch the 'dummy' variable.

So I have a function that generates a lot of these such functions and I want Mathematica to use this to simplify the output. For example, if I have as the output of my function:

expr1 = f[2, 2, 1, 3, 3, 1] + f[2, 2, 3, 1, 1, 3] +
f[3, 3, 1, 2, 2, 1] + f[1, 1, 2, 3, 3, 2];


I want mathematica to generate the output:

4f(1,1,2,3,3,2)

Since the integration of all of these functions will be the same. Of course, more than 1 switch of variables can be made. The number of arguments can increase to an arbitrary even number. Additionally, any pair of arguments can be switched EXCEPT the last pair. i.e.

expr2 = f[1, 3, 2, 2, 3, 1] + f[2, 2, 1, 3, 3, 1] + f[2, 2, 3, 1, 1, 3]


should give:

2f(2,2,1,3,3,1) + f(2,2,3,1,1,3)

Since the first two functions are the same but the third is not - since the last pair in the third function has been switched by the second pair (compared to the second pair). So any pair can be switched BUT not the last pair of arguments.

Writing a function that acknowledges that these functions are the same enables a reduced number of integration evaluation - important when each integration takes long to evaluate.

Thanks very much for your help.

• SetAttributes[f, Orderless];f[2, 2, 1, 3, 3, 1] + f[2, 2, 3, 1, 1, 3] + f[3, 3, 1, 2, 2, 1] + f[1, 1, 2, 3, 3, 2] solves the first part Feb 18 '15 at 20:22
• Welcome to Mathematica.SE! I suggest the following: 1) As you receive help, try to give it too, by answering questions in your area of expertise. 2) Read the faq! 3) When you see good questions and answers, vote them up by clicking the gray triangles, because the credibility of the system is based on the reputation gained by users sharing their knowledge. Also, please remember to accept the answer, if any, that solves your problem, by clicking the checkmark sign!
– user9660
Feb 18 '15 at 20:26
• At the end I don't know if my answer was of any help so I removed it.
– Kuba
Feb 19 '15 at 16:03

Here is a way.

For example you can define :

f1[x__, p1_, p2_] := f2[x][p1, p2]
SetAttributes[f2, Orderless];

f3[x__][p1_, p2_] := f[x, p1, p2]


Test

Your initial output can be generated this way :

myargs = {{2, 2, 1, 3, 3, 1}, {1, 3, 2, 2, 3, 1}, {2, 2, 3, 1, 1, 3}};
mysum = Plus @@ f @@@ myargs


f[1, 3, 2, 2, 3, 1] + f[2, 2, 1, 3, 3, 1] + f[2, 2, 3, 1, 1, 3]

Then

mysum /. f -> f1


f2[1, 2, 2, 3][1, 3] + 2 f2[1, 2, 2, 3][3, 1]

mysum /. f -> f1 /. f2 -> f3


f[1, 2, 2, 3, 1, 3] + 2 f[1, 2, 2, 3, 3, 1]