Periodische Zahlen erkennen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Periodische Zahlen erkennen

    Ich bin gerade am Entwickeln eines Dezimal - Binär Umrechners für Kommazahlen, das Umrechnen geht bis jetzt tip-top.
    Er berechnet entweder bis die Zahl fertig ist oder bis 10 000 000 Nachkommastellen, nur jetzt würde ich gerne Einbauen das er auch Perioden erkennt und diese auch zb so aus gibt : (0.00101000111101011100) Und nicht mehr so : 0.001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101 usw...

    Leider habe ich noch nichts entdeckt wie ich das schaffen könnte...

    VB.NET-Quellcode

    1. Do
    2. input = (input * 2)
    3. If (input >= 1 Or input = 1) Then
    4. sw.Write("1")
    5. sw.Flush()
    6. input = (input - 1)
    7. Else
    8. sw.Write("0")
    9. sw.Flush()
    10. End If
    11. z = z + 1
    12. Loop Until input = 0 Or z = 10000000


    Das ist derzeit der Kern meines Programmes, es wird berechnet und sofort in eine Datei geschrieben.

    Lg,
    Peter alias Acheloos
    Wer kann schon die Garantie geben, dass sich die Zahl nicht erst nach der 1000sten Stelle wiederholt?
    Du musst also ein Limit setzen, wie tief du testen willst.
    Dann wirst du mit einzelnen Ziffern anfangen.

    Wiederholt sich eine einzelne Ziffer bis zur letzten Stelle? 0.000000000000000
    Wiederholen sich zwei... 0.101010101010101010
    Wiederholen sich drei... 0.110110110110110110
    ...

    Wiederholen sie sich erst ab der Xten Stelle? 0.1011011101010101010101010
    ich kenn mich mit Periodizität nicht so aus.

    Wenn P auftritt, tritt die immer gleich hinter dem Komma auf, oder gibts auch Fälle, wo zunächst eine einzigartige Ziffernfolge dem Komma folgt, und erst danach beginnen die Wiederholungen?

    Das wäre wichtig, denn wenn man das Komma als Fixpunkt betrachten könnte, wären Perioden wesentlich einfacher zu identifizieren (immer noch kompliziert genug!)
    ja, es gibt beide fälle

    z.b. 1,1555555555555555555555555555555555555555555555555555... (52/45)

    unendlich viele beispiele halt^^ warum sollte es denn auch nicht so sein:

    1,1 entspricht eigentlich 1,1000000....
    also sind quasi alle abbrechenden dezimalbrüche so
    uff - da wirds eine nicht so unaufwändige Muster-Erekennung:
    also man muß zu jeder Ziffer all ihre Vorkommnisse betrachten, und zwar immer die Bereiche zwischen den Vorkommnisssen. Und dann gugge, ob sich 2 gleiche, hintereinanderliegende Bereiche finden. Und dann, ob das immer so weiter geht.
    Das wäre wichtig, denn wenn man das Komma als Fixpunkt betrachten könnte
    Das Komma währe der Fixpunkt. Und er sollte es bis Tiefe 100 erkennen. Also 0,0100111010111110.........0100111010111110....

    Nur leider habe ich keine Ahnung wie ich das machen soll.
    Das mit den Stringvergleichen etc find ich irgendwie ungeil ... es handelt sich schließlich um ZAHLEN und da ist vermutlich eine mathematische Lösung "einfacher".

    1 / 3 = 0, Rest 1
    10 / 3 = 3, Rest 1

    Wir sehen also, dass an der zweiten Stelle derselbe Rest auftaucht den wir vorher schon mal hatten, also muss auch das Ergebnis sich ab dieser Stelle wiederholen. Daraus folgt:
    0 (Periode an Stelle 1),3

    IMHO muss man sich also nur die "Reste" in einer Liste merken, inklusive Position (also ein Dictionary) und das Problem ist "sauber" gelöst

    EDIT: Mit Petaods Beispiel:

    89/444 = 0.20045045045045...

    89 / 444 = 0, Rest 89
    890 / 444 = 2, Rest 2
    20 / 444 = 0, Rest 20
    200 / 444 = 0, Rest 200
    2000 / 444 = 4, Rest 224
    2240 / 444 = 5, Rest 20 !!! Also beginnt die Periode VOR dem ersten "Rest 20" !!!
    -> 89/444 = 0,20_045

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()

    sieht nach einem genialen Ansatz aus. Nur noch bischen verkürzt dargestellt, sodassich nicht folgen kann.

    Wie sähe etwa der Nachweis von Periodizität bei
    89/444 = 0.20045045045045
    aus?

    Und der TE benötigt diese Untersuchung ja im Binärsystem. Soweitich weiß sind im Binärsystem andere Brüche periodisch als im Dezimalsystem - lässt sich dein Ansatz auch darauf anwenden (nehme ich fast an, nur so richtig habich ihn ja noch garnet geschnallt)

    ErfinderDesRades schrieb:

    Wie sähe etwa der Nachweis von Periodizität bei

    siehe edit oben ;)

    siehe auch:
    arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm
    wenn man auf den "wie geht das button" klickt, kommt (zb):
    Der Dezimalbruch 0,1 soll ins 2er System umgewandelt werden.

    Gehe nach folgendem Verfahren vor, um die Nachkommaziffern zu erhalten:
    (1) Multipliziere die Zahl mit der Basis 2
    (2) Die Zahl vor dem Komma ist die nächste Ziffer des Ergebnisses
    (3) Schneide die Zahl vor dem Komma weg.
    (4) Wiederhole ab (1), bis der Rest 0 ist, sich ein Rest wiederholt
    oder die gewünschte Genauigkeit erreicht ist.

    2 · 0,1 = 0,2 --> Ziffer: 0
    2 · 0,2 = 0,4 --> Ziffer: 0
    2 · 0,4 = 0,8 --> Ziffer: 0
    2 · 0,8 = 1,6 --> Ziffer: 1
    2 · 0,6 = 1,2 --> Ziffer: 1
    2 · 0,2 = 0,4 --> Ziffer: 0

    Der "Rest" 0,4 trat im 2. Schritt bereits auf.
    Ab dort wiederholen sich die Nachkommaziffern periodisch.


    Resultat: 0,00011001100110011001100110011001100110011001100110011...


    Ich alter mathematischer Analferbet habs also "instinktiv" schon mal nicht falsch gemacht ;)


    Lösung?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Debug.Print(DezToBin(0.1D))
    4. Debug.Print(DezToBin(0.3D))
    5. Debug.Print(DezToBin(0.7D))
    6. End Sub
    7. Private Function DezToBin(ByVal d As Decimal) As String
    8. Dim sb As New System.Text.StringBuilder()
    9. Dim cnt As Integer = 0
    10. Dim restdic As New Dictionary(Of Decimal, Integer)
    11. Do
    12. d *= 2
    13. If restdic.ContainsKey(d) Then
    14. sb.Insert(restdic(d), "_")
    15. Exit Do
    16. Else
    17. restdic.Add(d, cnt)
    18. End If
    19. If d >= 1 Then
    20. d -= 1
    21. sb.Append("1")
    22. Else
    23. sb.Append("0")
    24. End If
    25. cnt += 1
    26. Loop Until d = 0 OrElse cnt = 10000
    27. sb.Insert(0, "0,")
    28. Return sb.ToString
    29. End Function
    30. End Class


    Gibt jedenfalls (für 0.1, 0.3 und 0.7) die Ergebnisse wie auf oben erwähnter Webseite

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „picoflop“ ()