Quantcast
Channel: Programmierung – icancode.de
Viewing all articles
Browse latest Browse all 24

Ein Sieb für Primzahlen

$
0
0

Primzahlen finden eine breite Anwendung in der Informatik. Dabei handelt es sich um Zahlen, die nur durch 1 und sich selbst teilbar sind. So z.B. 3, 5, 7, 13…

In diesem kleinen Bereich ist es noch relativ einfach, Zahlen als Primzahlen zu identifizieren. Wird der Wertebereich größer, ist es ein ziemlich aufwendiges Unterfangen. Was können wir also tun, um die Suche zu beschleunigen?

Das Sieb des Eratosthenes von Kyrene

Die Idee ist genau so einfach, wie sie genial ist. Aus einer Reihe von Zahlen werden nach und nach alle vielfachen des Laufindexes rausgestrichen – was dabei nicht aus der Liste fliegt, muss also eine Primzahl sein.

Programmiertechnisch könnte man das z.B. so umsetzen:

@NotNull
fun lambdaPrimesTill(a: Int): ArrayList {
    var inputRange = (2..a).toArrayList()
    (2..a + 1).forEach { n -> inputRange.removeAll((2*n..a).filter { it % n == 0 }) }
    return inputRange
}

Das ist jetzt zwar schön kurz, aber alles andere als lesbar. Lösen wir die Lambdas also mal auf und schauen uns das genauer an. Diesmal ohne verschachtelte Lamdbas und mit expliziter Typdeklaration.

@NotNull
fun primesTill(a: Int): ArrayList {
    var inputRange: ArrayList = (2..a).toArrayList()
    for (n: Int in 2..a + 1) {
        inputRange.removeAll(
                (2 * n..a)
                        .filter { it: Int ->
                            it % n == 0
                        })
    }
    return inputRange
}

Was passiert hier?
Zuerst wird eine ArrayList erstellt, die mit den Werten 2 bis input+1 gefüllt wird. 0 und 1 sind per Definition keine Primzahlen, demnach reicht es, wenn die Liste bei 2 startet.
Anschließend wird durch die Liste iteriert. Für jede Zahl die wir im Iterator haben, entfernen wir alle Vielfachen aus der Liste. In meinem Fall nutze ich dafür einen filter. Dieser bekommt als Condition ein Lambda. Ist der Iterator beispielsweise bei 2 würde der Rückgabewert des Filters eine Liste von allen Vielfachen von 2 sein.
Dabei sei kurz angemerkt, dass dies sicherlich nicht die performanteste Lösung ist, aber die anschaulichste, wie ich finde.

Wollt ihr jetzt wissen, ob eine gegebene Zahl eine Primzahl ist, könnt ihr einfach nachgucken, ob sie in dieser Liste enthalten ist.
Bei dieser Methode ist übrigens auch zu beachten, dass der Input vorher validiert werden sollte. So wie oben beschrieben, funktioniert das nur mit positiven, geraden Zahlen >= 2 – ansonsten bekommt ihr eine leere Liste zurück.

Der Artikel Ein Sieb für Primzahlen erschien zuerst auf icancode.de.


Viewing all articles
Browse latest Browse all 24

Trending Articles


Girasoles para colorear


mayabang Quotes, Torpe Quotes, tanga Quotes


Tagalog Quotes About Crush – Tagalog Love Quotes


OFW quotes : Pinoy Tagalog Quotes


Long Distance Relationship Tagalog Love Quotes


Tagalog Quotes To Move on and More Love Love Love Quotes


5 Tagalog Relationship Rules


Best Crush Tagalog Quotes And Sayings 2017


Re:Mutton Pies (lleechef)


FORECLOSURE OF REAL ESTATE MORTGAGE


Sapos para colorear


tagalog love Quotes – Tiwala Quotes


Break up Quotes Tagalog Love Quote – Broken Hearted Quotes Tagalog


Patama Quotes : Tagalog Inspirational Quotes


Pamatay na Banat and Mga Patama Love Quotes


Tagalog Long Distance Relationship Love Quotes


BARKADA TAGALOG QUOTES


“BAHAY KUBO HUGOT”


Vimeo 10.7.0 by Vimeo.com, Inc.


Vimeo 10.7.1 by Vimeo.com, Inc.