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 (aktuelle Seite)
Programm 5: Berechnung und grafische Darstellung von Primfaktoren
4. Verteilung der Exponenten
Die im hier gezeigten Programm verwendete Funktion zur Berechnung der Primzahlen bildet die Zweierpotenzen von 1 bis 4 und addiert und subtrahiert diese von Zahlen der Form n*30 + 15, also zum Beispiel 45 + 2, 45 + 4, 45 + 8 usw. Die Zahl 45 + 4, also 49, ist keine Primzahl. Könnte es sein, dass diese Ausnahmen nur bei ganz bestimmten Exponenten auftreten? Wenn ja, dann wäre dies vielleicht der Weg zu einem Primzahl-Bildungsgesetz. Aber wie Sie schon richtig vermuten: Auch bei diesem Weg handelt es sich höchstwahrscheinlich wieder um eine Sackgasse, wie die hier gezeigte Programmversion zeigt.
Mit dem unten abgebildeten Listing ist es möglich, zu allen Primfaktoren auch den Exponenten 1, 2, 3 oder 4 anzuzeigen und außerdem zu ermitteln, ob er von n*30+15 subtrahiert oder ob er zu diesem Wert addiert wurde. Die jeweiligen Ergebnisse werden im Bild oben durch acht verschiedene Graustufen angezeigt. Dort sind die zu allen Primfaktoren gehörenden Exponenten von links nach rechts und von oben nach unten aufgelistet, wobei auch hier wieder der Umbruch frei gewählt werden kann. Doch ganz gleich, welche Umbruchzahl man wählt: Eine Regelmäßigkeit habe ich bisher nicht entdeckt.
Funktion des Programms
Das Programm funktioniert wie folgt: Bei der Bildung der Exponenten in der von 1 bis 4 laufenden Schleife werden diese zusätzlich in einem gesonderten Array gespeichert: 30, 60, 90, 120 bei Addition, und 150...240 bei Subtraktion. Auf diese Weise erhalten wir acht deutlich voneinander unterscheidbare Werte, die sich gleichmäßig über die ganze Skala der RGB-Grauwerte verteilen. Von all diesen Werten werden in einer späteren Schleife nur diejenigen übrig gelassen, die zu den Primfaktoren gehören. Die unter dem Button Exponent zu startende Funktion liest das entsprechende Array nach gewohnter Manier aus und zeigt die grauen Kästchen auf dem BIldschirm.
Quellcode
Public Class Form1
Dim Primarray(10000000) As Byte
Dim Primarray2(10000000) As Byte
Dim Primarray3(10000000) 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 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
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 array2 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
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 umbruch As Integer
Dim expobreite As Integer
PictureBox1.Refresh()
umbruch = TextBox2.Text
expobreite = TextBox3.Text
Dim kk As Integer
Dim yy As Integer
kk = 0
yy = 0
For n = 0 To 800000
If Primarray3(n) > 0 Then
farbe = Primarray3(n)
If kk > umbruch Then
kk = 0
yy = yy + 1
If yy > Int(500 / expobreite) Then Exit For
End If
PictureBox1.CreateGraphics.FillRectangle(New SolidBrush(System.Drawing.Color.FromArgb(farbe, farbe, farbe)), _
expobreite * kk, expobreite * yy, expobreite, expobreite)
Application.DoEvents()
kk = kk + 1
End If
Next
End Sub
End Class