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.

I express multilinear functions in the following format. Is there any ready command to convert them to multilinear functions easily?

Input

posTerms = {2, 4, 9, 13, 19};
negTerms = {6, 11, 26};
IntegerString[posTerms, 2]
IntegerString[negTerms, 2]

{"10", "100", "1001", "1101", "10011"}
{"110", "1011", "11010"}

Intended Output

x_2+x_3+x_4*x_1+x_4*x_3*x_1+x_5*x_2*x_1-(x_3*x_2+x_4*x_2*x_1+x_5*x_4*x_2)

Intended Output in Mathematica

Subscript[p, 2]+Subscript[p, 3]+Subscript[p, 4]*Subscript[p, 1]+Subscript[p, 4]*Subscript[p, 3]*Subscript[p, 1]+Subscript[p, 5]*Subscript[p, 2]*Subscript[p, 1]

-Subscript[p, 3]*Subscript[p, 2]-Subscript[p, 4]*Subscript[p, 2]*Subscript[p, 1]-Subscript[p, 5]*Subscript[p, 4]*Subscript[p, 2]
share|improve this question

2 Answers 2

up vote 3 down vote accepted

How about

FromCoefficientRules[#, Subscript[x, #] & /@ Reverse@Range@Length@#[[1, 1]]] &@
    Thread[PadLeft@IntegerDigits[posTerms, 2] -> 1] - 
   FromCoefficientRules[#, Subscript[x, #] & /@ Reverse@Range@Length@#[[1, 1]]] &@
 Thread[PadLeft@IntegerDigits[negTerms, 2] -> 1]

enter image description here

As belisarius wrote in comment it can be reduced to

Subtract @@ (FromCoefficientRules[#, Subscript[x, #] & /@ Reverse@Range@Length@#[[1, 1]]] &@
     Thread[PadLeft@IntegerDigits[#, 2] -> 1] & /@ {posTerms, negTerms})

Also there is another short solution

Subtract @@ (Total[Times @@ MapIndexed[Subscript[x, #2[[1]]]^# &, Reverse[#]] & /@ 
   IntegerDigits[#, 2]] & /@ {posTerms, negTerms})

It is shorter than belisarius's solution by 13 characters :)

share|improve this answer
1  
@hhh It is because I incorrectly aligned posTerms with negTerms. See my update, does it work now? –  ybeltukov Nov 6 '13 at 22:56
    
I cannot fully understand this: suppose I specify the terms with {1,3,7} to mean p_1p_3p_7 -- is it easier to get the multilinear term from it? So here terms Subscript[x, #] & /@ {1, 3, 7} and now just multiplication. Where is the multiplication? –  hhh Nov 10 '13 at 19:14
    
Moved the new q here. –  hhh Nov 10 '13 at 19:23

Also

-Differences[Tr[Times @@@ (Position[Reverse@#, 1] & /@ # /. {n_Integer} -> 
                            Subscript[x, n])] & /@ (IntegerDigits[#, 2] & /@ {posTerms, negTerms})]

Mathematica graphics

Equivalent:

Subtract@@Tr/@ Map[Times @@ (Position[Reverse@#, 1] /. {n_Integer} -> 
                           Subscript[x, n]) &, (IntegerDigits[#, 2] & /@ {posTerms, negTerms}), {2}]
share|improve this answer
    
I like shorter +1. –  hhh Nov 7 '13 at 0:21
1  
@hhh So here you have a shorter version of ybeltukov's answer too Subtract @@ (FromCoefficientRules[#, Subscript[x, #] & /@ Reverse@Range@Length@#[[1, 1]]] &@ Thread[PadLeft@IntegerDigits[#, 2] -> 1] & /@ {posTerms, negTerms}) –  belisarius Nov 7 '13 at 0:35

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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