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