Frage zu Permutationen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Frage zu Permutationen

    Ich sitzte gerade bei Experimenten mit Permutationen.

    VB.NET-Quellcode

    1. Dim Anzahl As Long = 0
    2. For i001 = 0 To 15
    3. For i002 = 0 To 15
    4. For i003 = 0 To 15
    5. For i004 = 0 To 15
    6. For i005 = 0 To 15
    7. For i006 = 0 To 15
    8. For i007 = 0 To 15
    9. For i008 = 0 To 15
    10. For i009 = 0 To 15
    11. Anzahl += 1
    12. Next
    13. Next
    14. Next
    15. Next
    16. Next
    17. Next
    18. Next
    19. Next
    20. Next


    Wenn ich das komplett durchlaufen lasse, dann zeigt Anzahl den Wert 68719476736.

    Kann man das Rückwärts rechnen? Also wenn ich jetzt als Beispiel die Zahl 9999 nehme,
    kann man dann mit einer mathematischen Formel festellen welcher Wert der Zähler einer
    jeden einzelnen For-Schleife hat?
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    Ähh … nein.
    Da 9999+0+0+0 = 9990+1+2+6 = 1234 + 1234 + 1234 + 6297 = …, sind für eine Summe die x Summanden nicht eindeutig bestimmbar, da unzählige Varianten zur selben Summe führen.
    Allein a + b = 1 ergibt (wenn man die negativen Zahlen einbezieht) unendlich viele Lösungen für a und b.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Kann man dazu überhaupt experimentieren? Das ist doch Mathematik. Und die Lösungen gibts alle schon.
    Aber ich schätze du suchst ganzzahlige Lösungen für nichtlineare Gleichungen und das gibts manchmal auch
    und manchmal gibt es das nicht (z.B. basiert da die Kryptographie drauf, dass nicht jede Funktion invertierbar ist.)

    Es gibt explizit für n^k = 9999 auch keine ganzzahligen Lösungen.

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim a = New List(Of Integer)
    3. For i = 2 To 100
    4. For j = 1 To 100
    5. If i ^ j < 10000 Then
    6. a.Add(i ^ j)
    7. Else
    8. Exit For
    9. End If
    10. Next
    11. Next
    12. For Each i In a.Distinct.OrderBy(Function(x) x)
    13. Console.WriteLine(i)
    14. Next
    15. Console.ReadKey()
    16. End Sub

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Haudruferzappeltnoch schrieb:

    Kann man dazu überhaupt experimentieren?
    Ich nenne das "Experimentelle Mathematik".
    Z.B. das Finden des tiefsten Punktes eines Eierbehälters aus der Kaufhalle mit unterschiedlich tiefen Bechern.
    Da gibt es Strategien, die man verfolgen kann, die man "nur" entsprechend parametrieren muss.
    Das ganze geht iterativ, wichtig ist es dann, eine geeignete Abbruchbedingung zu finden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Irgendwie lässt sich das aber trotzdem ausrechnen.

    C#-Quellcode

    1. public static void Main()
    2. {
    3. var count = 16;
    4. var total = 0L;
    5. for (int i1 = 0; i1 < count; i1++) // 68719476736
    6. for (int i2 = 0; i2 < count; i2++) // 4294967296
    7. for (int i3 = 0; i3 < count; i3++) // 268435456
    8. for (int i4 = 0; i4 < count; i4++) // 16777216
    9. for (int i5 = 0; i5 < count; i5++) // 1048576
    10. for (int i6 = 0; i6 < count; i6++) // 65536
    11. for (int i7 = 0; i7 < count; i7++) // 4096
    12. for (int i8 = 0; i8 < count; i8++) // 256
    13. for (int i9 = 0; i9 < count; i9++) // 16
    14. total++;
    15. Console.WriteLine(anzahl);
    16. }



    Beispiel Zahl 9999

    Wie man erkenne kann ist die Zahl 9999 irgendwo zwischen
    16^3 und 16^4 (4096, 65536). D.h. aber auch, dass nur die
    Variablen i6, i7, i8, i9 mit Werten belegt sein können.

    Berechnung
    9999 / 4096 = 2.441162109 >> 2 >> Rest 1807
    1807 / 256 = 7.05859375 >> 7 >> Rest 15
    => weiter kann nicht gerechnet werden.

    Result i6 = 2, i7 = 7, i9 = 14 (0-basierend 15 - 1)


    Weiteres Beispiel die Zahl 123456

    Wie man erkenne kann ist die Zahl 123456 irgendwo zwischen
    16^4 und 16^5 (65536, 1048576). D.h. aber auch, dass nur die
    Variablen i5, i6, i7, i8, i9 mit Werten belegt sein können.

    Berechnung
    123456 / 65536 = 1.883789063 >> 1 >> Rest 57920
    57920 / 4096 = 14.140625 >> 14 >> Rest 576
    576 / 256 = 2.25 >> 2 >> Rest 64

    Die Moduloberechnung liefert 0, daher wird 1 abgezogen, weil Variable i9 nie 16 erreichen wird.
    64 / 16 = 4 >> 3 >> Rest 16

    Result i5 = 1, i6 = 14, i7 = 2, i8 = 3, i9 = 15 (0-base 16 - 1)


    EDIT:
    @Haudruferzappeltnoch Bingo :thumbup:
    @oobdoo Die Berechnung die hier gezeigt wird, hat in dem Sinne nichts mit der Berechnung der Permutation zu tun, wenn schon, dann mit der Bruteforce-Berechnung.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    @exc-jdbi Was du berechnest sind die Koeffizienten der Darstellung 9999 = i0 * 16^0 + i1 * 16^1 + i2 * 16^2 + ...
    Also die Hexadezimale Darstellung.

    Wenn es das ist was @oobdoo haben will, von unten nach oben sind die Indizes schöner zuzuordnen:

    VB.NET-Quellcode

    1. Dim base = 16
    2. Dim a = Convert.ToString(9999, base).ToCharArray.Reverse.Select(Function(x) Convert.ToInt32(x, base))
    3. Console.WriteLine(String.Join(";"c, a)) ' gibt 15;0;7;2

    oobdoo schrieb:

    VB.NET-Quellcode

    1. Anzahl += 1
    Nur in genau dieser einen Zeile wird die Gesamtsumme verändert.
    Oder habe ich da ietwas falsch verstanden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!