Primzahl-Software

 

Überblick

 

Programm 1: Berechnung und numerische Darstellung 

Programm 2: Grafische Darstellung bei verschiedenen Umbruchzahlen

Programm 3: Bytes aus Primzahlen (Prytes) 

Programm 4: Verteilung der zur Primzahlberechnung verwendeten Exponenten  

Programm 5: Berechnung und grafische Darstellung von Primfaktoren (aktuelle Seite)

 

 

5. Primfaktoren

 

Wenn man alle Primzahlen auf einem rechtwinkligen Achsensystem abbildet und deren Produkte auf der Fläche darstellt, so erhält man von links nach rechts und von oben nach unten aufsteigende Zahlenwerte. Diese Zahlen werden in der oben gezeigten Grafik als Grauwerte dargestellt, mit einem Unterschied: Die Grafik zeigt nicht die absoluten Produkte, sondern den Rest, der beim Teilen durch eine feste, einstellbare Zahl (Teiler) übrig bleibt (Modulo).

 

Ganz gleich, welchen Teiler man auch wählt: Es entsteht immer eine Art "Fliesenmuster", aus dem wir entnehmen können, dass hier eine bestimmte Regelmäßigkeit auftritt. Wie das Programm funktioniert, erfahren Sie in den Kommentaren des Quellcodes. Mit diesem Beispiel möchte ich einen Schlussstrich unter meine Primzahlen-Untersuchungen ziehen und lasse die Beantwortung der Frage, ob die in der Grafik gezeigte Regelmäßigkeit eine wichtige Aussage über die Primzahlen macht, dem Leser.

 

Quellcode

 

Public Class Form1

    Dim Primarray(10000000) As Byte

    Dim Primarray2(10000000) As Byte

    Dim Primarray3(10000000) As Integer

    Dim Primarray4(1000000) As Integer

    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 Integer

    Dim cnt As Integer

    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

        Primarray(1) = 1

        Primarray2(1) = 1

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

 

            For n = 1 To 4

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

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

                ' In array3 wird notiert, durch welchen Exponenten die Zahl zustande kam

                ' Die Werte werden später als Grauwerte dargestellt. Damit diese nicht zu

                ' dicht zusammen liegen, werden Sie mit 30 multipliziert (1 * 30 bis 8 * 30)

                Primarray3(15 + 30 * m + (2 ^ n)) = n * 30 ' 

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

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

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

                    Primarray3(15 + 30 * m - (2 ^ n)) = 120 + n * 30

                End If

            Next n

 

        Next m

 

        'Aus der obenen gefundenen Reihe von Zahlen ("Kandidaten") werden

        'diejenigen eliminiert, bei denen es sich um Produkte von Zahlen aus dieser Reihe handelt

        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

                        'Jeder Kandidat wird mit jedem multipliziert. 

                        ' Das Ergebnis trifft immer einen zuvor im

                        ' Array mit "1" markierten Kandidaten, der dann 

                        ' "abgeschossen" wird. Das heißt: Die 1 wird

                        ' durch eine Null überschrieben. Übrig bleiben die Primzahlen.

                        If (n * m) < 9000000 Then

                            Primarray(n * m) = 0

                        End If

                    End If

                Next n

            End If

        Next m

 

 

        For n = 0 To 8000000

            ' Aussortierung der Primfaktoren aus der Exponentenliste

            If Primarray(n) > 0 Then Primarray3(n) = 0

        Next

 

        ' Notwendig für Primfaktor-Funktion

        For n = 1 To 1000000

            If Primarray2(n) = 1 Then

                Primarray4(cnt) = n

                cnt = cnt + 1

            End If

 

        Next

        cnt = 0

        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

        Dim wert As Integer

        Dim probr As Integer

        Dim teiler As Integer

        probr = TextBox3.Text

        teiler = TextBox2.Text

        PictureBox1.Refresh()

        For i = 0 To 400

            For k = 0 To 800

                wert = (Primarray4(k) * Primarray4(i)) Mod teiler

                'ist dasselbe wie: 'wert = (Primarray6(k) * Primarray6(i)) - (teiler * (Int((Primarray6(k) * Primarray6(i)) / teiler)))

                farbe = Int(wert / (teiler / 256)) ' verhindert, dass farbe > 255 wird und passt farbskala an

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

                (farbe, farbe, farbe)), New Rectangle(probr * k, probr * i, probr, probr))

            Next

        Next

    End Sub

 

 

End Class