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