Etwas Mathe f.Interessenten zum WE

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Etwas Mathe f.Interessenten zum WE
von: Luc:-?
Geschrieben am: 12.09.2015 04:46:46

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) < nx Then _
                    ReDim Preserve nw(nx): nWerte(ix) = nw
                ix = ix + 1
            Next nw
        End If
        Collatz = nWerte
    Else: n = Startwert
nv:     If Folge Then ReDim nw(0): nw(0) = n
        While n <> 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 :-?

Bild

Betrifft: war mal ne Knobelei von mir (Spotlight 2006)
von: WF
Geschrieben am: 12.09.2015 08:06:19
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

Bild

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

Bild

Betrifft: Übrigens, ...
von: Luc:-?
Geschrieben am: 13.09.2015 14:48:46
…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 :-?

Bild

Betrifft: AW: Übrigens, ...
von: Daniel
Geschrieben am: 13.09.2015 15:19:41
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


Bild

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

Bild

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

Bild

Betrifft: schön spielen ohne streiten, bitte,
von: Michael
Geschrieben am: 15.09.2015 15:24:42
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

Bild

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

Bild

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

Bild

Betrifft: AW: Wo soll die denn sein? Zum Thema hast du ...
von: Daniel
Geschrieben am: 17.09.2015 19:08:11
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

Bild

Betrifft: Aha, wenn dich das substantivierte und ...
von: Luc:-?
Geschrieben am: 17.09.2015 19:17:39
…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 :-?

Bild

Betrifft: AW: Aha, wenn dich das substantivierte und ...
von: Daniel
Geschrieben am: 17.09.2015 20:21:33
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

Bild

Betrifft: Nee, ist ja auch eher dein Stil (s.ob.)! ;-]
von: Luc:-?
Geschrieben am: 18.09.2015 01:04:43
Ü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 :-?

Bild

Betrifft: Ja, das ist eine interessante Aufgabe, bei ...
von: Luc:-?
Geschrieben am: 12.09.2015 14:48:34
…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 :-?

Bild

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

Bild

Betrifft: Beachtet wdn muss bei Verwendung der UDF, ...
von: Luc:-?
Geschrieben am: 12.09.2015 15:38:37
…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 :-?

Bild

Betrifft: nachgerechnet
von: Michael
Geschrieben am: 13.09.2015 17:20:45
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.

Bild

Betrifft: 108 mit 113 Schritten stimmt
von: WF
Geschrieben am: 13.09.2015 18:32:52
.

Bild

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

Bild

Betrifft: Hier noch die Ergebnisdarstellung für mögliche ...
von: Luc:-?
Geschrieben am: 14.09.2015 15:56:32
…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 …

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Serienbrief über VBA mit Userform"