Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1444to1448
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Etwas Mathe f.Interessenten zum WE

Etwas Mathe f.Interessenten zum WE
12.09.2015 04:46:46
Luc:-?
Hi, Folks;
habe eine UDF zum Collatz-Problem, auch als Syracuse-Vermutung bekannt, geschrieben. Mit ihr kann, wie nachfolgd dargestellt, sowohl die Anzahl der Elemente bis zum erstmaligen Erreichen der 1 (als Teil des sich dann wiederholenden 4-2-1-Kreises) ermittelt als auch die Collatz-Folge ausgegeben wdn. Außerdem kann auch mit anderen (ungeraden) Faktoren als die originale 3 (Defaultwert für Arg3) experimentiert wdn.
 ABCDEFGHIJKLMNOPQRSTUVW
11111                   
222121                  
381643105168421            
4341421                 
561625168421              
6916563105168421           
7175267221134175226134020105168421   
84818421                
920529928147221134175226134020105168421
107163105168421             
11155241134175226134020105168421     
12101661263105168421          
1310402134020105168421          
1418527147221134175226134020105168421  
15181608154623703510653160804020105168421  
165161168421               
1713522175226134020105168421       
182152101892814722113417522613402010516842
1921884195829884422113417522613402010516842
20820120105168421            
218642216432168421            
2216525221134175226134020105168421    
2316160623703510653160804020105168421    
2411241241263105168421         
2524887257638195829884422113417522613402010516
261140326134020105168421         
271129 23278278241124623194471427121410732216148424212136418291
281952828147221134175226134020105168421 
2919882298844221134175226134020105168421 
3019160930154623703510653160804020105168421 
31A1:A30: {=Collatz(ZEILE())}B1:B30: {=MAX(INDEX(Collatz(ZEILE();1);ZEILE()))}
32C1:C30: {=VERGLEICH(MAX(INDEX(Collatz(ZEILE();1);ZEILE()));INDEX(Collatz(ZEILE();1);ZEILE();0);0)}D1:DK30: {=Collatz(ZEILE();1)}
Hier wurden nur die ersten 20 Elemente für n=1…30 dargestellt. Außerdem wurden mehrzellige MatrixFmln über den ganzen jeweiligen Bereich verwendet, weil die am Schnellsten berechnet zu wdn scheinen (auch schneller als der Nachbau mit StandardFmln!).
Weitergehende Infos zur Problematik sind auf Wikipedia zu finden! Hier noch die UDF:
Rem Liefert Anzahl iterativer Berechnungen bis FolgenWert=1 (inkl Arg1)
'   alternativ kann d.Collatz-Folge ab Start- bis Endwert ausgegeb wdn.
'   Achtung! Fkt kn auch in Vektoren or Matrizen (ZBereiche) angeordnet
'   Werte varbeit, aber nur Folgen aus Vektoren auf ZBereiche abbilden;
'   negat/gerad Arg3 wird auf d.nächstgröß ungerade gesetzt! Wenn 1 er-
'   reicht wird, bricht d.Berechn ab, d.h., d.Kreis 4-2-1 ist erreicht.
'   Vs1.1 -LSr:CyWorXxl -cd:20150910 -1pub:20150912herber -lupd:20150910n
Function Collatz(Startwert, Optional ByVal Folge As Boolean, _ Optional ByVal Faktor As Integer = 3) Dim ix As Long, iz As Long, lz As Long, n As Long, nix As Long, nx As Long, _ nz As Long, isMx As Boolean, nw, nWerte As Variant, wf As WorksheetFunction On Error GoTo fx: Set wf = WorksheetFunction: Faktor = Faktor + 1 - Faktor Mod 2 If IsArray(Startwert) Then If TypeName(Startwert) = "Range" Then nWerte = _ wf.Transpose(wf.Transpose(Startwert)) Else nWerte = Startwert On Error Resume Next If IsError(LBound(nWerte, 2)) Then ElseIf Folge And UBound(nWerte, 2) + 1 - LBound(nWerte, 2) = 1 Then nWerte = wf.Transpose(nWerte) Else: isMx = True End If On Error GoTo fx If isMx Then ix = LBound(nWerte, 2): iz = LBound(nWerte, 1) lz = iz: nz = UBound(nWerte, 1) + 1 - lz Else: ix = LBound(nWerte) End If For Each Startwert In nWerte n = Startwert: nix = 0: GoSub nv: nx = wf.Max(nx, nix) If isMx Then nWerte(iz, ix) = Collatz iz = (iz + 1 - lz) Mod nz + lz: ix = ix + 1 - Sgn(iz - lz) Else: nWerte(ix) = Collatz: ix = ix + 1 End If Next Startwert If Folge And Not isMx Then ix = LBound(nWerte) For Each nw In nWerte If UBound(nw) Sgn(Startwert) n = 2 ^ -1 * n * (2 * Faktor) ^ (n Mod 2) + (n Mod 2) * Sgn(Startwert) nix = nix + 1: If Folge Then ReDim Preserve nw(nix): nw(nix) = n Wend Collatz = IIf(Folge, nw, nix + Abs(Sgn(Startwert))) If Not IsEmpty(nWerte) Then Return End If fx: If CBool(Err.Number) Then Collatz = CVErr(xlErrNA) Set wf = Nothing End Function Viel Spaß beim Experimentieren!
Gruß+schöWE, Luc :-?

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
war mal ne Knobelei von mir (Spotlight 2006)
12.09.2015 08:06:19
mir
Hi Knobler,
nenne die kleinste Zahl X größer 100, bei der mehr als X Schritte notwendig sind, die Collatz-Folge zu beenden.
Salut WF

abgedrehte Geschichte
12.09.2015 13:23:14
Michael
Hi zusammen,
das ist ja mal wieder was für den mathematischen Spieltrieb, aber nicht vor nächster Woche.
Schönes Wochenende,
Michael

Übrigens, ...
13.09.2015 14:48:46
Luc:-?
…Michael,
ist dein Untertitel (wenn man erst nur ihn sieht) ziemlich missverständlich, denn abgedreht bedeutet eher, dass etwas erledigt ist („der Film ist im Kasten“), im Ggsatz zu abgefahren (wer abfährt ist solange in Fahrt bis er irgendwo ankommt) oder gar durchgedreht… ;-]
Als ZusatzAufgabe könnte man noch formulieren, ob diese Iterationszahl noch öfter und wie oft vorkommt und welche Zahlen das betrifft. Interessant wäre auch, wie groß der längste Pfad (Iterations- bzw Elemente­Anzahl) ist oder der maximale Elementwert und zu welchem n der gehört (eingeschränkt auf nϵ[1,20000]).
Gruß, Luc :-?

Anzeige
AW: Übrigens, ...
13.09.2015 15:19:41
Daniel
Luc,
"abgefahren" wäre deiner Logik nach übrigens genaus falsch, denn "fahren" können nur Fahrzeuge und die Personen oder Gegenstände, aber keine Probleme oder Aufgabenstellungen.
ausserdem können Worte ja durchaus mehrere Bedeutungen haben.
"abgedreht" wird ja im allgemeinen Sprachgebrauch nur in Bezug auf "Film" als Synonym für "erledigt" verwendet, ansonsten eher so wie hier.
Und da das hier ein Excel- und kein Filmforum ist, ist die Überschrift nicht missverständlich (in einem Filmforum wäre sie das vielleicht schon eher).
Gruss Daniel

Meister Schlau will wieder mal ein Haar in der ...
14.09.2015 15:20:29
Luc:-?
…Suppe finden! ;->
Allerdings ist das tatsächlich so 'ne Sache mit der Umgangssprache (inkl 'Missverständnisse vorpgmmiert')…
Luc :-?

Anzeige
AW: Meister Schlau will wieder mal ein Haar in der ...
14.09.2015 18:53:55
Daniel
Und dem Hernn Oberlehrer Luc fällt auf eine Gegenargument nicht mehr ein als eine Beleidigung.

schön spielen ohne streiten, bitte,
15.09.2015 15:24:42
Michael
liebe Excel-Freunde,
sonst gibt's keinen Nachtisch!
@Luc :-? vielen Dank für die nette Spielerei.
Die Wiki-Grafik zu den Pfadlängen gefällt mir. Sie erinnert mich an was anderes, aber ich komm nicht drauf - egal.
Schöne Grüße,
Michael

Bitte sehr, gern geschehen! ;-) owT
17.09.2015 18:58:35
Luc:-?
:-?

Wo soll die denn sein? Zum Thema hast du ...
17.09.2015 19:00:33
Luc:-?
…nun ja so rein gar nichts beigetragen… :->
Luc :-?

AW: Wo soll die denn sein? Zum Thema hast du ...
17.09.2015 19:08:11
Daniel
so schwer ist die nicht zu finden.
was sollte ich denn zum Thema sagen?
hattest du eine Frage gestellt?
nun gut, wenns dich interessiert, mir gefällt das Makro von Michael, kurz, schnell schlank.
bei grösseren Datenmengen ist es sowieso immer besser, nur die reinen Daten in den Zellen zu haben und keine Formeln, das braucht dann weniger Speicherplatz und ist viel schneller.
Spätestens, wenn man die Datei mit anderen teilen will, muss man die Formeln ja sowieso rauslöschen.
Gruß Daniel

Anzeige
Aha, wenn dich das substantivierte und ...
17.09.2015 19:17:39
Luc:-?
…personalisierte Adjektiv schlau beleidigt, Daniel,
werde ich darauf wohl in Zukunft als beschreibendes Merkmal deiner Person verzichten müssen… :-))
Dass du Michaels SubProz präferierst, ist dir unbenommen. Es könnte dir aber aufgefallen sein, dass meine UDF eine andere Aufgabe hat, als „nur“ WFs Aufgabe zu lösen. Oh, Pardon, du willst ja nicht schlau sein… :->
Luc :-?

AW: Aha, wenn dich das substantivierte und ...
17.09.2015 20:21:33
Daniel
Ach Luc, wir wissen doch alle wie du das gemeint hast.
also zieh dich jetzt bitte nicht auf solche Wortklaubereien zurück, das hast du doch nicht nötig.
Gruß Daniel

Anzeige
Nee, ist ja auch eher dein Stil (s.ob.)! ;-]
18.09.2015 01:04:43
Luc:-?
Übrigens, wenn die Xl-Macher auch so gedacht hätten wie du, lauter „kleine, feine und schnelle“ Spezial­Lösungen, für jeden besonderen Zweck eine andere, würde Xl wohl ganz anders aussehen. Aber, ob es dann ein Markterfolg geworden wäre…
Das könnten die Xl-Pgmmer natürlich intern gemacht und die kleinen Einheiten für die Nutzer­Verwendung zu allgemei­neren Fktt verknüpft haben…
Du scheinst also in Bezug auf VBA-Anwendung eher wie ein Standard-Pgmmierer als ein normaler Nutzer zu denken. Man muss aber beides tun, will man letztendlich nicht vor einem unüber­schaubaren Berg spezieller (Insel-)Lösungen stehen! Was du zu bevorzugen scheinst, ist die Gelegenheits­lösung, die für Lernende nützlich sein mag, wenn sie denn einfach genug ist, weniger aber für Dauer­Anwender. Damit verfolgst du einen Ansatz, dem wahr­scheinlich Tsde folgen und der dem meinen diametral entgegen­gesetzt ist. Na, dann bist du wenigstens in der Beziehung nicht allein… ;-]
Luc :-?

Anzeige
Ja, das ist eine interessante Aufgabe, bei ...
12.09.2015 14:48:34
Luc:-?
…deren Lösung die UDF evtl helfen könnte, Walter;
kann sein, dass ich deine Aufgabe damals mal gelesen hatte (wenn sie nicht vor 2005 gestellt wurde), aber das war mir natürlich nicht mehr bewusst. Bin ja auch eher zufällig kürzlich im Zusammenhang mit Turing-Maschinen auf dieses Problem gestoßen.
Die UDF habe ich geschrieben, weil mir ein Nachbau des Bildungs­Algorithmus der Folge mit Standard­Matrix­Fmln zu lange gerechnet hat (die Ausgangs­zelle blieb gefühlt ewig im Edit/Rechen-Modus).
Weil ich das Problem interessant fand, habe ich die UDF einfach mal aufgabenfrei zum Experimentieren eingestellt. Aber wer mag, kann sich ja an einer Fml (mit oder ohne UDF) zur Lösung deiner Aufgabe versuchen…
Gruß, Luc :-?

Anzeige
Ah, ja, 2006 hattest du ja geschrieben! Aber ...
12.09.2015 14:52:09
Luc:-?
…da hat mir das sicher auch noch nichts gesagt… ;-)
Luc :-?

Beachtet wdn muss bei Verwendung der UDF, ...
12.09.2015 15:38:37
Luc:-?
…dass sie ohne Argument2ff die Anzahl der Folgen­Elemente, nicht die Anzahl der Iterationen (mitunter als Collatz-Wert bezeichnet) zurückgibt. Es muss also 1 abgezogen wdn, um diese zu erhalten!
Luc :-?

nachgerechnet
13.09.2015 17:20:45
Michael
Hi zusammen,
mit
Sub collatzWF()
Dim bufC&(0 To 2), i&, j&, k&
Dim weiter As Boolean, nochweiter As Boolean
Const hart = True
Dim t(2) As Single
t(0) = Timer
i = 100
nochweiter = hart
For k = 1 To 100
While nochweiter
bufC(2) = i
j = 0
weiter = True
While weiter
bufC(0) = bufC(1): bufC(1) = bufC(2)
If (bufC(1) And 1) = 0 Then bufC(2) = bufC(1) / 2 Else bufC(2) = bufC(1) * 3 + 1
j = j + 1
'    Cells(i, j + 1).Value = bufC(2)
If bufC(0) = 4 And bufC(1) = 2 And bufC(2) = 1 Then weiter = False
If j > 1000 Then MsgBox "j>1000"
Wend
Cells(i - 98, 1).Value = i
Cells(i - 98, 2).Value = j
i = i + 1
If hart Then
If i > 10000 Or j = i Then nochweiter = False
Else
If i > 1000 Or j >= i Then nochweiter = False
End If
Wend
Next
t(1) = Timer
MsgBox "t= " & (t(1) - t(0)) * 1000 & " ms"
End Sub
komme ich auf 108: das sind 113 Schritte.
Komischerweise bekomme ich von 100 bis 10000 nur max. 261 Schritte: ist doch ein seltsames Ding.
Man beachte die Warnungen auf Wiki: bloß nicht das Gehirn verbiegen...
In manchen Branchen bedeutet "verbiegen" natürlich auch irgendwas, und das Hirn ist in sich schon genug verbogen und - wunden, sonst tät's ja nicht so gut funktionieren.
Schöne Grüße,
Michael
P.S.: übrigens ist die äußere Schleife mit dem k natürlich voll für die Katz, mich hat nur interessiert, wie es sich auswirkt, wenn man statt / ein \ verwendet, das ja eigentlich für Ganzzahldivision gedacht ist: es ist aber schlappe 10% langsamer.

Anzeige
108 mit 113 Schritten stimmt
13.09.2015 18:32:52
WF
.

na fein,
13.09.2015 19:34:09
Michael
Herr WF,
wenigstens WAS funzt heute nachmittag, das andre Zeug sträubt sich...
Gruß,
Michael

Hier noch die Ergebnisdarstellung für mögliche ...
14.09.2015 15:56:32
Luc:-?
…Aufgaben, natürlich unter Verwendung der gezeigten UDF:
 GHIJKLMNOPQ
31ƒ(n)>n3,6,7,9,11,14,15,18,19,27,31,41,47,54,55,62,63,71,73,82,83,91,94,95,97,108,109,110{=WECHSELN(GLÄTTEN(VJoin(WENN(Collatz(ZEILE(A1:A20000))-1>ZEILE(A1:A20000);ZEILE(A1:A20000);"");;-2));" ";",")}
32min(n) f. n≥100108{=MIN(WENN(Collatz(ZEILE(A100:A150))-1>ZEILE(A100:A150);ZEILE(A100:A150)))}
33Elementeanzahl114{=Collatz(MIN(WENN(Collatz(ZEILE(A100:A150))-1>ZEILE(A100:A150);ZEILE(A100:A150))))}
34Pfadlänge/Iteratt113{=Collatz(MIN(WENN(Collatz(ZEILE(A100:A150))-1>ZEILE(A100:A150);ZEILE(A100:A150))))-1}
35ƒ(n)>n f.n>100108,109,110{=WECHSELN(GLÄTTEN(VJoin(WENN(Collatz(ZEILE(A100:A20000))-1>ZEILE(A100:A20000);ZEILE(A100:A20000);"");;-2));" ";",")}
36Anzahl ƒ(n)>n3{=ANZAHL(WENN(Collatz(ZEILE(A100:A20000))-1>ZEILE(A100:A20000);Collatz(ZEILE(A100:A20000));""))}
37max Pfadlänge278{=MAX(Collatz(ZEILE(D1:D20000)))-1}
38n m.max Pfadlg17 647{=VERGLEICH(MAX(Collatz(ZEILE(D1:D20000)));Collatz(ZEILE(D1:D20000));0)}
Anmerkung: n=20 000 scheint so ziemlich die Grenze für die Ermittlung der Folge in Xl zu sein. Ohne das kann man auch für n=2,125×10^9 die Elemente­anzahl/Pfad­länge 146/145 erhalten.
Gruß, Luc :-?
Besser informiert mit …
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige