++Hallo Peter,
scheint sich der Aufwand in tolerablen Grenzen zu halten (siehe Anhang).
hier ist noch eine von der Laufzeit her ganz unsinnige Variante, die aber
deshalb interessant ist, weil A For-Schleifen generiert werden:
In[15]:= Remove[tupledDivisors, returnQ]
Off[Part::pspec]
returnQ[j_Integer, l_List] :=
Count[l, 1] <= j && Max[Rest[l] - Most[l]] < 2
tupledDivisors[A_Integer?Positive, P_Integer?Positive] :=
Block[{X = Divisors[P], o, V = Array[o, {A}], X1, X2, X3, R,
C1 = Max[A - Plus @@ Last /@ FactorInteger[P], 0]},
Reap[
Fold[X1[X2[#2[[1]], #2[[2]]], #2[[1]] <= Length[X],
X3[#2[[1]]], #1] & ,
If[R = Times @@ (X[[#]] & /@ V); R == P, Sow[X[[#]] & /@ V];
If[returnQ[C1, V], Return[], Break[]],
If[R > P, If[returnQ[C1, V], Return[], Break[]]]],
Partition[Join[Reverse[V], {1}], 2, 1]
] /. {X1 :> For, X2 :> Set, X3 :> Increment}
][[2, 1]]
]
In[19]:= tupledDivisors[4, 36]
Out[19]= {{1, 1, 1, 36}, {1, 1, 2, 18}, {1, 1, 3, 12}, {1, 1, 4,
9}, {1, 1, 6, 6}, {1, 2, 2, 9}, {1, 2, 3, 6}, {1, 3, 3, 4}, {2, 2, 57.
3, 3}}
mit dieser Funktion wÃŒrde der Test
tupledDivisors[12, 24 36 64]
ca. 57.47 Tage laufen, jedoch mit tupledDivisors[] aus dem letzten Mail
In[28]:= Timing[tupledDivisors[6, 24 36 64];]
Out[28]= {0.156, Null}
bzw.
In[35]:= Timing[td[6, 24 36 64];]
Out[35]= {0.203, Null}
Gruss
Udo.