Primzahl-Software

 

Überblick

 

Programm 1: Berechnung und numerische Darstellung (aktuelle Seite)

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

 

 

1. Berechnung und numerische Darstellung

 

Damit die in meinem Primzahlprogramm vorhandenen, verschiedenen Optionen besser verstanden und ausprobiert werden können, habe ich das komplette Programm in verschiedene, unabhängig voneinander lauffähige Einzelprogramme mit relativ kurzem Code und unterschiedlichen Aufgaben unterteilt.

 

Das erste Teilprogramm berechnet die Primzahlen und stellt sie numerisch in einem Textfenster dar.

Der Code zeigt übrigens, wie man mit AppendText eine Multiline-Textbox mit Zahlen füllt.

 

Rein programmiertechnisch gibt es zum Code der Primzahlberechnung wenig zu sagen. Interessant ist jedoch die Vorgehensweise bei der Berechnung, die durch Kommentare im Quellcode ausführlich erklärt wird.

 

Die Tatsache, dass alle Primzahlen schon berechnet sind, wenn die ersten Ziffern nach weniger als zwei Sekunden in der Textbox erscheinen, deutet auf die Schnelligkeit des Programms hin.

 

Zum Selbermachen des Programms benötigen Sie lediglich eine Form mit drei Buttons und zwei Textfenstern, die Sie ungefähr wie im Bild oben gezeigt anordnen. 

Kopieren Sie die Variablendeklarationen an den Anfang de Listings. Erzeugen Sie anschließend die leeren Funktionen der Buttons durch Anklicken derselben und kopieren Sie den Code aus unten stehendem Listing hinein. 

Nach einem Klick auf Button 1 (den Sie gerne auch mit Start oder Calculate beschriften dürfen), werden zunächst alle Primzahlen unter der Obergrenze von 9 Millionen berechnet. Anschließend erscheinen die unter der Obergrenze 500 gefundenen Primzahlen im Textfenster.

 

Quellcode

 

Public Class Form1

    Dim Primarray(10000000) As Byte

    Dim Primarray2(10000000) As Byte

    Dim page As Integer

 

__________________________________________________________________________________

 

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

 

        ' Diese Schleife erzeugt alle "Primzahlkandidaten", indem sie ab der Zahl 15 in Schritten von

        ' 30 vorwärts läuft und Zweierpotenzen bis zu 2 hoch 4 dazu addiert und davon subtrahiert.

 

        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

 

        'Aus der oberen 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

        leseprim()

    End Sub

_________________________________________________________________________________________________

    'Darstellung der Primzahlen in Intervallen von 5000 im Textfenster

    Private Sub leseprim()

        Application.DoEvents()

        TextBox1.Text = "   "

        For n = page To page + 5000

            If Primarray(n) = 1 Then

                TextBox1.AppendText(n & "     ")

            End If

        Next

    End Sub

_____________________________________________________________________________________

    ' Buttons zum "Aufschlagen" der nächsten bzw. vorhergehenden Seiten.

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

        page = page + 5000

        If page > 8980000 Then page = 8980000

        TextBox2.Text = page

        leseprim()

    End Sub

____________________________________________________________________________________

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

        page = page - 5000

        If page < 0 Then page = 0

        TextBox2.Text = page

        leseprim()

  End Sub

End Class