Primzahl-Software
Überblick
Programm 1: Berechnung und numerische Darstellung
Programm 2: Grafische Darstellung bei verschiedenen Umbruchzahlen (aktuelle Seite)
Programm 3: Bytes aus Primzahlen (Prytes)
Programm 4: Verteilung der zur Primzahlberechnung verwendeten Exponenten
Programm 5: Berechnung und grafische Darstellung von Primfaktoren
Programm 2:
1. Grafische Darstellung bei verschiedenen Umbruchzahlen
Das hier gezeigte Programm läuft selbständig ohne Zusatzprogramme und berechnet, wie im ersten Fall, zunächst die Primzahlen. Im Gegensatz zu Programm 1 werden diese hier jedoch als "Kästchen" einstellbarer Größe und mit einstellbarer Umbruchzahl dargestellt. Das Bild oben zeigt einen Umbruch von 212 bei einer Kästchengröße von 2. Deutlich sind vertikale und diagonale Unterbrechungen zu erkennen.
2. Überlagerung verschiedener Umbruchzahlen
Im Bild unten wurden automatisch verschiedene Umbrüche von 30 bis 15 übereinander gezeichnet, ohne den Bildschirm zwischendurch zu löschen. Dabei entsteht immer das gleiche, typische Muster, das sich durch Erhöhung der Umbruchzahl und der Kästchenbreite noch vergrößern lässt.
Dieses Muster lässt sich mittels Bleistift und Papier leicht erklären, wenn man für mehrere, aufeinanderfolgende Umbruchzahlen die Positionen der Zahlen notiert und die einzelnen Blöcke vergleicht, zum Beispiel:
1 2 3 4 5 Umbruch nach 5
6 7 8 9 10
11 12 13 14 15
1 2 3 4 5 6 Umbruch nach 6
7 8 9 10 11 12
13 14 15 16 17 18
1 2 3 4 5 6 7 Umbruch nach 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
In der ersten Zeile bleiben die Zahlen unverändert, was sich auch in der Grafik zeigt: Das Primzahlmuster der oberen Zeile (7, 11, 13, 17...) bleibt unverändert
In der zweiten Zeile haben wir stets aufeinanderfolgende Zahlen. Da beim Hochzählen im Abstand 1 auch zwangsweise irgendwann eine Primzahl erscheint, muss jede Spalte in der zweiten Zeile zwangsweise auch eine Markierung erhalten. Das Ergebnis: Eine durchgezogene Linie.
In der dritten Zeile erscheinen an Position 1 stets ungerade Zahlen, an Position 2 jedoch stets gerade Zahlen. Da gerade Zahlen niemals Primzahlen werden können, bleibt jede zweite Position unmarkiert. Da eine ungerade Zahl beim Hochzählen jedoch irgendwann einmal Primzahl sein kann (Umbruch nach 6 führt zu einer 13 an Position 1), muss hier zwangsweise auch irgendwann eine Markierung erfolgen. Das Resultat: In der dritten Zeile wechseln sich die Zustände: Markierung - keine Markierung regelmäßig ab. Die gleichen Überlegungen lassen sich auch für die folgenden Zeilen durchführen.
Der folgende, kommentierte Quellcode zeigt, wie das Programm funktioniert. Erfahrene VB-Programmierer können die einzelnen, mit Absicht kurz gehaltenen Programmteile dann später zu einem Gesamtprogramm zusammenfügen. Bringen Sie für dieses individuelle Stand-Alone-Programm sechs Buttons, zwei Textboxen und eine PictureBox auf die Form und kopieren Sie den unten stehenden Code die leeren Funktionen. Die blaue Hintergrundfarbe der Picture-Box wurde im Beispielprogramm in deren Property-Page gewählt.
Quellcode:
Public Class Form1
Dim Primarray(10000000) As Byte
Dim Primarray2(10000000) As Byte
Dim breite As Integer = 4
Dim weite As Integer = 30
Dim zeilen 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
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 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
display()
End Sub
'_______________________________________________________________________________________________________
' Änderung der Umbruchzahl
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
'___________________________________________________________________________________________
' Änderung der Kästchengröße
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()
' Grafische Darstellung der Primzahlen durch Kästchen
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 display2()
' Überlagerung verschiedener Umbruchwerte
PictureBox1.Refresh()
For k = 30 To 150
Application.DoEvents()
For n = 0 To 120
For i = 0 To k
If Primarray(n * k + 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
Next k
End Sub
'___________________________________________________________________________________________ Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
display2()
End Sub
'________________________________________________________________________________________________________
End Class