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