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.

 

Zurück

 

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