Primzahl-Software

 

Überblick

 

Programm 1: Berechnung und numerische Darstellung 

Programm 2: Grafische Darstellung bei verschiedenen Umbruchzahlen

Programm 3: Bytes aus Primzahlen (Prytes)  (aktuelle Seite)

Programm 4: Verteilung der zur Primzahlberechnung verwendeten Exponenten

Programm 5: Berechnung und grafische Darstellung von Primfaktoren

 

 

3. Bytes aus Primzahlen

 

Wie bereits zu Anfang erwähnt, gibt es in jeder Zahlenmenge zwischen den Grenzen ( n+1)*30  und n*30 genau acht Positionen, an denen sich entweder Primzahlen oder Primfaktoren befinden können. Schreiben wir eine 1, wenn es sich um eine Primzahl handelt, und eine 0, wenn es sich um einen Primfaktor handelt, so erhalten wir eine 8-Bit-Zahl. Verwandeln wir diese Zahl wiederum in einen Grauwert, so erhalten wir eine Grauskala von 0 (schwarz) bis 255 (weiß), die wir den RGB-Werten eines farbigen Pixels oder eines farbigen Quadrates zuordnen können. Auf diese Weise kann für alle Dreißiger-Gruppen innerhalb der im Programm untersuchten Zahlenmenge (9 Millionen) ein graues Pixel bzw. eine graue Fläche erzeugt werden. Im obigen Bild werden diese Grauwerte horizontal aneinander gereiht, wobei der Umbruch im gezeigten Fall bei der Zahl 794 erfolgt. Die Kästchengröße beträgt 1, so dass die Anzahl der grauen Punkte genau der Anzahl der in der PictureBox darstellbaren Pixel entspricht. Multipliziert man die Zahl der im Bild sichtbaren Grau-Pixel mit 30, so erhält man den Wert 9 Millionen. Das bedeutet: Das Bild zeigt alle im untersuchten Bereich vorhandenen Primzahl-Bytes (Prytes). Sowohl bei der vorliegenden als auch bei allen niedrigeren Umbruchzahlen ist, bis auf einige schwach angedeutete Streifen, kein regelmäßiges Muster zu erkennen.

 

Im Folgenden der Quellcode der dritten Programm-Variante. Nach der bereits bekannten Berechnung und Darstellung der Primzahlen als Kästchen werden die aus jeweils acht Werten gebildeten Prytes nach einem Klick auf den Button Berechne Prytes sichtbar. Nach jeder Änderung der Kästchengröße oder der Umbruchzahl werden die Primzahlen wieder als Kästchen dargestellt, so dass jedesmal ein erneuter Klick auf Brechne Prytes erforderlich ist. Dies kann natürlich durch eine Ergänzung des Programmcodes vermieden werden. Da die Software zum besseren Verständnis möglichst einfach bleiben sollte, habe ich auf diesen "Luxus" bewusst verzichtet.

 

 

Quellcode

 

Public Class Form1

    Dim Primarray(10000000) As Byte

    Dim Primarray2(10000000) As Byte

    Dim Prytearray(2000000) As Byte

    Dim breite As Integer = 4

    Dim weite As Integer = 30

    Dim zeilen As Integer

    Dim pryte As Byte

    Dim r As Integer

    Dim farbe As Single

 

 

 

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 

        ' Beim Zusammenfügen zu einem Gesamtprogramm muss der folgende Code zur Berechnung der 

        ' Primzahlen nur ein Mal vorhanden sein

 

        For m = 0 To 300000 '(Obergrenze = m * 30. In diesem Falle also: 30 * 300000 = 9 Millionen)

            Primarray(1) = 1

            Primarray2(1) = 1

            For n = 1 To 4

                Primarray(15 + 30 * m + (2 ^ n)) = 1

                Primarray2(15 + 30 * m + (2 ^ n)) = 1

                If (15 + 30 * m - (2 ^ n)) > 0 Then

                    Primarray(15 + 30 * m - (2 ^ n)) = 1

                    Primarray2(15 + 30 * m - (2 ^ n)) = 1

                End If

            Next n

        Next m

 

         For m = 2 To 3000

            If Primarray2(m) = 1 Then 'Wenn ein Kandidat gefunden wurde (z.B. 41 oder 49),

                'wird folgende Schleife gestartet:

                For n = m To Int(9000000 / m)

                    If Primarray2(n) = 1 Then

                        If (n * m) < 9000000 Then

                            Primarray(n * m) = 0

                        End If

                    End If

                Next n

            End If

        Next m

        display()

End Sub

 

    

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        weite = weite + 1

        If weite > 1000 Then weite = 1000

        TextBox2.Text = weite

        display()

End Sub

 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        weite = weite - 1

        If weite < 1 Then weite = 1

        TextBox2.Text = weite

        display() 

End Sub

 

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

        breite = breite + 1

        If breite > 12 Then breite = 12

        TextBox3.Text = breite

        display()

End Sub

 

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

        breite = breite - 1

        If breite < 1 Then breite = 1

        TextBox3.Text = breite

        display()

End Sub

 

Private Sub display()

        PictureBox1.Refresh()

 

        For n = 0 To 450 / breite

            For i = 0 To weite

                If Primarray(n * weite + i) = 1 Then

                    PictureBox1.CreateGraphics.FillRectangle(New SolidBrush(System.Drawing.Color.FromArgb _

                   (255, 200, 40)), New Rectangle(breite * (i - 1), breite * n, breite, breite))

                End If

            Next

        Next n

End Sub

   

 

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click

         'Pryteberechnung

        Dim aa As Byte

        Dim bb As Byte

        Dim cc As Byte

        Dim dd As Byte

        Dim ee As Byte

        Dim ff As Byte

        Dim gg As Byte

        Dim hh As Byte

        r = 0

        For n = 0 To 8000000 Step 30

            aa = Primarray(n + 1)

            bb = Primarray(n + 7)

            cc = Primarray(n + 11)

            dd = Primarray(n + 13)

            ee = Primarray(n + 17)

            ff = Primarray(n + 19)

            gg = Primarray(n + 23)

            hh = Primarray(n + 29)

 

            pryte = 128 * aa + 64 * bb + 32 * cc + 16 * dd + 8 * ee + 4 * ff + 2 * gg + 1 * hh

            Prytearray(r) = pryte

            r = r + 1

        Next

        zeigepryte()

 

End Sub

 

Private Sub zeigepryte()

        PictureBox1.Refresh()

        Dim v As Integer

        Dim w As Integer

 

        v = 0

        w = 0

 

        For n = 0 To 280000

 

            farbe = Prytearray(n)

            PictureBox1.CreateGraphics.FillRectangle(New SolidBrush(System.Drawing.Color.FromArgb _
            (farbe, farbe, farbe)), New Rectangle(w * breite, v * breite, breite, breite))

            w = w + 1

            If w > weite Then

                w = 0

                v = v + 1

                If v > Int(500 / breite) Then

                    Exit For

                End If

             End If

        Next n

        v = 0

        w = 0

    End Sub

 

End Class