Similar to [whuber][1]'s [answer][2], we can use [Groupings][3] to simplify the generation patterns, it's introduced from Mathematica 11, and use parallel computing, which is a little faster. ``` LaunchKernels[]; st=AbsoluteTime[]; n=7; sets=Range[n]; target=100; patterns=Thread[Evaluate[HoldForm/@Block[{i=1},Groupings[sets,o->2]/.o:> Slot[Mod[i++,Length@sets-1,1]]]]&]; OP1[x_,y_]:=-x+y; OP2[t_Integer,u_Integer]:=10 t+u; op=Tuples[{Plus,Subtract,Times,Divide,OP1,OP2},Length@sets-1]; SetSharedVariable[L]; L={}; ParallelDo[Block[{expr=f@@o,val:=Quiet@ReleaseHold@expr}, If[val==target||val==-target,AppendTo[L,InputForm/@expr]]],{o,op},{f,patterns}]; Length[ans=Select[L,FreeQ[#,OP2[_,Except[_Integer]]|OP2[Except[_Integer],_],-1]&]] AbsoluteTime[]-st ``` For $n=\{{6,7,8}\}$, it take about $\{{1.43,\;19.69,\;860.85}\}$ seconds. When $n=9$, it doesn't finished for $4$ hours, I terminate it. Still very slow, I tried to convert all the patterns to C code, it's not difficult, the generated C code is more than 5,700 lines, the efficiency improvement is very obvious. Finally, the program takes about $10$ seconds to finds $422716$ distinct solutions, same result as whuber. [![enter image description here][4]][4] **Code** ``` n=9; gps=Block[{i=1,j=1},Groupings[Table[x,n],f->2]/. {f:>(F[#,Symbol["i"<>ToString@Mod[i++,n-1,1]],#2]&),x:>Symbol["n"<>ToString[Mod[j++,n,1]]]}] gen=StringTemplate["if(check1(``)){ sprintf(buffer, \"``\\n\", ``); if(check2(buffer)) printf(\"%s\", buffer); }"][ToString@CForm@#, StringReplace[ToString@#,{"F"|", "->"","["->"(","]"->")", "n"~~DigitCharacter:>"%d","i"~~DigitCharacter:>"%c"}], StringReplace[StringRiffle[#//.F[x___]:>{x}//Flatten,","],"i"->"o"] ]&/@gps//StringRiffle[#,"\n"]&; src="#include <stdio.h> #include <math.h> #include <string.h> #include <time.h> #define NUM 100 #define N 6 #define EPS 1e-8 char ops[N] = {'+', '-', '*', '/', '#', '@'}; char buffer[128]; double F(double x, int op, double y) { double arr[] = {x + y, x - y, x * y, x / y, 10 * x + y, -x + y}; return arr[op]; } int check1(double x) { return fabs(x - NUM) < EPS || fabs(x + NUM) < EPS; } int check2(char buffer[]) { return (!strstr(buffer, \"#(\") && !strstr(buffer, \")#\")); } void calc(int a[]) { int len = 0; int n1 = a[0], n2 = a[1], n3 = a[2], n4 = a[3], n5 = a[4], n6 = a[5], n7 = a[6], n8 = a[7], n9 = a[8]; #pragma omp parallel for schedule(dynamic) reduction(+:buffer) for (int i1 = 0; i1 < N; i1++) { for (int i2 = 0; i2 < N; i2++) for (int i3 = 0; i3 < N; i3++) for (int i4 = 0; i4 < N; i4++) for (int i5 = 0; i5 < N; i5++) for (int i6 = 0; i6 < N; i6++) for (int i7 = 0; i7 < N; i7++) for (int i8 = 0; i8 < N; i8++) { char o1 = ops[i1], o2 = ops[i2], o3 = ops[i3], o4 = ops[i4], o5 = ops[i5], o6 = ops[i6], o7 = ops[i7], o8 = ops[i8]; `` } } } int main() { clock_t t0 = clock(); freopen(\"output.txt\", \"w\", stdout); int a[] = {1,2,3,4,5,6,7,8,9}; calc(a); printf(\"Elapsed time: %g sec\\n\", (clock() - t0) / (double) CLOCKS_PER_SEC); return 0; } "; Export["main.c",TemplateApply@StringTemplate[src,gen],"Text"] Run["gcc -O2 main.c -fopenmp"] Run["a.exe"] // AbsoluteTiming list=ReadList["output.txt","String"] list // Most // Length LeftTeeArrow[x_,y_]:=-x+y; ans=ToExpression[StringReplace[Most@list,{"#"->"","@"->"~LeftTeeArrow~"}],InputForm,HoldForm] ReleaseHold[ans]//Union ``` [1]: https://mathematica.stackexchange.com/users/91/whuber [2]: https://mathematica.stackexchange.com/a/15117/2090 [3]: http://reference.wolfram.com/language/ref/Groupings.html [4]: https://i.sstatic.net/vEfcj.png