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