Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1550 | Anzahl registrierter User: 1839 | Besucher online: 29
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Das Sieb von Atkin


Autor: Klemens Nanni
Sprache: VB.NET
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 3883
  
Kick it on dotnet-kicks.de  

Beschreibung:

Diese Funktion berechnet alle Primzahlen < n. Sie ist eine erweiterte Form des Siebes des Eratosthenes. Für Grenzwerte < 10^6 ist das S.v.A. minimalst langsamer, wohingegen der Vorsprung für größere Werte immer größer wird.

Alternativ können die gefundenen Zahlen auch in einer Liste gespeichert werden, welche dann zurückgegeben wird.

Mehr zum Sieb: http://de.wikipedia.org/wiki/Sieb_von_Atkin

Atkin: 664579 primes < 10^7 computed in 00:00.4543314

Atkin: 5761455 primes < 10^8 computed in 00:05.1131710

mm:ss.ms

Zum Vergleich: http://dotnet-snippets.de/dns/das-sieb-des-eratosthenes-SID1379.aspx


Abgelegt unter: Primzahl, prime, Sieb, sieve, Eratosthenes, Atkin, prüfen, proof, check, Zahl, number, Mathematik, Mathe, math.



Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Sub atkin(ByVal l As Integer)
    Dim primes(l) As Boolean, x2 As Integer = 0, y2 As Integer = 0, i As Integer = -1

     For x As Integer = 1 To Math.Sqrt((l - 1) / 2)
        i += 2
        x2 += i

        Dim j As Integer = -1
        For y As Integer = 1 To Math.Sqrt(l - 1)
            j += 2
            y2 += j
            Dim n As Integer = (x2 << 2) + y2

            'Wenn n = 4x²+y² > l, sind weitere Vergleiche unnötig
            If n Mod 2 = 1 AndAlso n <= l Then 'Gerade Zahlen werden übersprungen
                If n Mod 12 = 1 OrElse n Mod 12 = 5 Then primes(n) = Not primes(n) '4x²+y²

                n -= x2
                If n Mod 12 = 7 Then primes(n) = Not primes(n) '3x²+y²

                If x > y Then
                    n -= y2 << 1
                    If n Mod 12 = 11 Then primes(n) = Not primes(n) '3x²-y²
                End If

            Else
                n -= x2
                If n Mod 2 = 1 Then 'gerade Zahlen werden übersprungen
                    If n <= l Then
                        If n Mod 12 = 7 Then primes(n) = Not primes(n) '3x²+y²

                        If x > y Then
                            n -= y2 << 1
                            If n Mod 12 = 11 Then primes(n) = Not primes(n) '3x²-y²
                        End If

                    ElseIf x > y Then
                        n -= y2 << 1
                        If n <= l AndAlso n Mod 12 = 11 Then primes(n) = Not primes(n) '3x²-y²
                    End If
                End If
            End If
        Next
        y2 = 0
    Next

    Console.WriteLine(2 & vbNewLine & 3)
    Dim l_sqrt As Integer = Math.Sqrt(l)

    For x As Integer = 5 To l_sqrt Step 2
        If primes(x) Then
            Dim x22 As Integer = x * x
            For y As Integer = x22 To l Step x22
                primes(y) = False
            Next
            Console.WriteLine(x)
        End If
    Next

    If l_sqrt Mod 2 = 0 Then l_sqrt += 1
    For x As Integer = l_sqrt To l Step 2
        If primes(x) Then Console.WriteLine(x)
    Next
End Sub
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Klemens Nanni schrieb am:  06.08.2010 18:08:44

Durch das Auslagern der Berechnung x2 in die äußere Schleife, dessen Limit verkleinert wurde, konnte ich den Algorithmus nochmals optimieren. Die Zeiten wurden aktualisiert.
Klemens Nanni schrieb am:  12.08.2010 21:47:11

Durch das Verwenden eines Arrays anstelle einer Liste und das Umstrukturieren der Bedingungen, welches die Anzahl der Abfragen n <= l minimiert, wurde die Arbeiszeit signifikant gekürzt. Die Zeiten wurden aktualisiert.


Diese Snippets könnten für Sie interessant sein:
[C#] Prüfen ob eine Zahl eine Primzahl ist
[C#] PrimeNumberGenerator
[C#] PrimeNumberReader
[C#] Integers
[C#] Primzahl berechnen (optimiert)
[VB.NET] Das Sieb des Eratosthenes
[VB.NET] Effizientere Primzahlprüfung großer Zahlen
[VB.NET] Primfaktorzerlegung
[VB.NET] Das Sieb von Atkin (2)
[VB.NET] Das Sieb von Atkin (2) - aktuell
[C#] prüfen ob String eine gültige IP ist
[C#] String auf Emailadresse prüfen
[C#] Windows Passwort überprüfen [Übersetzung]
[C#] Prüfen, ob exklusiver Zugriff auf eine Access-DB möglich ist
[ASP.net] Datei nach Bildupload prüfen
[C#] Kollision von zwei rechteckigen Objekten prüfen
[C#] Prüfen, ob eine Datei ausfürbar ist (.exe, .bat, etc.)
[C#] String auf erlaubte Zeichen prüfen
[C#] Prüfen ob aktueller Benutzer Administrator ist
[C#] Herausfinden, ob ein Programm (ProgramName) installiert ist.
[C#] Property auf Attribute prüfen Property.HasAttribute
[VB.NET] Permutation nachweisen
[VB.NET] Pandigitale Zahlen
[C#] Prüfung, ob bestimmtes Bit in Byte gesetzt ist.
[C#] Setzt ein bestimmtes Bit in einem Byte
[C#] Prüfen, ob Teil des .NET Frameworks
[C#] Programm RUN Check
[C#] prüfen ob eine Zahl gerade ist
[C#] Prüfen ob ein Text eine Zahl ist
[C#] Erweiterung für Stringumwandlungen
[C#] Beliebiges Zahlensystem in Dezimal umrechnen
[C#] Dezimalzahl in beliebiges Zahlensystem umrechnen
[VB.NET] Zahl mit Dezimalzahlstellen formatieren
[C#] Prüfung auf narzisstische Zahlen
[C#] Herausfinden, ob ein Character eine Zahl ist.
[VB.NET] Fibonacci-Folge iterativ erzeugen
[C#] Nummernformate beim Parsen fix festlegen
[C#] Create Directory
[C#] Summe 1..n berechnen
[C#] Fibonacci-Folge berechnen
[C#] n-te Fibonaccizahl rekursiv berechnen
[C#] Summe 1²...n² berechnen.
[C#] Summe 1³..n³ berechnen.
[C#] größten gemeinsamen Teiler berechnen.
[VB.NET] Multiplikation von übergroßen Zahlen
[C#] Dreiecksberechnung
[VB.NET] PI nach der Bailey-Borwein-Plouffe-Formel berechnen
[VB.NET] Quadratische Gleichung mit der PQ Formel lösen
[VB.NET] Basisrechenfunktionen für einen Kreis
[C++] Exponents
[C#] Quersummenberechnung
[C#] Geodaten in sexagesimal Format umrechnen
[VB.NET] Größten gemeinsamen Teiler berechnen
[VB.NET] Quadratwurzel ohne Sqrt() Funktion ziehen
[C#] Addiere alle ganzen Zahlen von x bis y
[C++] Caesar
[C#] "echte" Teiler Summe berechnen
[C#] Formelevaluierung aus RPN Form
[C#] CellMatrix
[C#] Maschinengenauigkeit
[C#] Flächenberechnungen am Kreis,Quadrat,Parallelogramm,Trapez
[C#] Bruch-Klasse
[VB.NET] einfacher rekursiver Mathe Parser
[VB.NET] Größter gemeinsamer Teiler
[VB.NET] Modulare Exponentation
[VB.NET] Werte zweier Variablen tauschen
[VB.NET] Ganzzahlige Wurzel
[VB.NET] Binäre Exponentation
[VB.NET] Größter gemeinsamer Teiler (2)
[VB.NET] Binomialkoeffizient
[VB.NET] Kleinster natürlicher Teiler > 1
[VB.NET] Dezimalzahl in Zahl der Basis b < 37 konvertieren
[C#] Berechnung der Entfernung zwischen GPS-Koordinaten
[C#] Wurzel und Potenz berechnen ohne Math-Klasse

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.