DMUG-Archiv 2012

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

Re: Aufgabe::tupledDivisors

Am 04.04.2012 02:21, schrieb Udo und Susanne Krause:
Liebe Freundinnen und Freunde des karwöchentlichen Rechnens,

gelegentlich sollte man die ungeordneten multiplikativen Zerlegungen Z
einer positiven ganzen Zahl P in A ganzzahlige Faktoren kennen.

Natürlich ergibt sich Z einerseits durch Zusammenfassung der Primfaktoren
in A Gruppen, allenfalls unter Zuhilfenahme der 1, sofern nicht genügend
Primfaktoren vorhanden sind.

Andererseits ist Z eine Auswahl von A-Tupeln der Divisoren von P, die
Implementation bei Vorhandensein unbegrenzter Ressourcen ist schlicht

In[332]:= Z[A_Integer?Positive, P_Integer?Positive] :=
    Union[Sort /@ Select[Tuples[Divisors[P], A], (Times @@ # == P) &]]

Man finde eine effiziente Implementation für Z[A, P], etwa
tupledDivisors[A, P].
[divisor partition, multiplicative partition]

Mit den besten Grüssen
Udo.

P.S. 1: Beispiele

In[369]:= tupledDivisors[1, 36]
Out[369]= {{36}}

In[370]:= tupledDivisors[2, 36]
Out[370]= {{1, 36}, {2, 18},{3, 12}, {4, 9}, {6, 6}}

In[371]:= tupledDivisors[3, 36]
Out[371]= {{1, 1, 36}, {1, 2, 18}, {1, 3, 12}, {1, 4, 9},
    {1, 6, 6}, {2, 2, 9}, {2, 3, 6}, {3, 3, 4}}

In[372]:= tupledDivisors[4, 36]
Out[372]= {{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, 3, 3}}

In[373]:= tupledDivisors[5, 36]
Out[373]= {{1, 1, 1, 1, 36}, {1, 1, 1, 2, 18}, {1, 1, 1, 3, 12}, {1, 1, 1,
4, 9},
    {1, 1, 1, 6, 6}, {1, 1, 2, 2, 9}, {1, 1, 2, 3, 6}, {1, 1, 3, 3, 4},
    {1, 2, 2, 3, 3}}

In[374]:= tupledDivisors[6, 36]
Out[374]= {{1, 1, 1, 1, 1, 36}, {1, 1, 1, 1, 2, 18}, {1, 1, 1, 1, 3, 12},
{1, 1, 1, 1, 4, 9}, {1, 1, 1, 1, 6, 6}, {1, 1, 1, 2, 2, 9}, {1, 1, 1, 2,
3, 6},
    {1, 1, 1, 3, 3, 4}, {1, 1, 2, 2, 3, 3}}

P.S. 2: Effizienz

In[379]:= Length[Divisors[8 5 7 18 36]]
Out[379]= 140

In[380]:= Plus @@ Last /@ FactorInteger[8 5 7 18 36]
Out[380]= 12

In[381]:= Length[tupledDivisors[12, 8 5 7 18 36]] // Timing
Out[381]= {13.057, 6756}




Frohe Ostern!

Wenn man beim Prozess des sukzessiven Anhängens kleiner Teiler am Anfang der Faktorenlisten die Listen rausschmeißt, die zu hohe Produkte bekommen haben und diejenigen, die exakt stimmen, speichert, aber der weiteren Bearbeitung entzieht, scheint sich der Aufwand in tolerablen Grenzen zu halten (siehe Anhang).

Grüße,
  Peter

Attachment: tupledDivisors.nb
Description: Mathematica Notebook document

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

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