DMUG-Archiv 2012

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re[2]: Aufgabe::tupledDivisors

++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.



Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html