Frage von Trummler, 185

Wie kann man bei Exel durch eine bestimmte Zahl teilbare Zahlen markieren/rausfiltern?

Ich hab eine XXL-Liste erstellt mit 100x100 Zahlen, wo ich (möglichst :D) alle Primzahlen rausbekommen möchte.
Dazu möchte ich "lediglich" wissen, wie man richtig >>Bedingt Formatieren<< kann, damit ALLE Zahlen, die (beispielsweise) durch 2 teilbar sind, mit rot markiert werden. (Wie ich es rot machen kann, weiss ich, der Term fehlt mir...)

Bitte um rasche Antworten! ;)

LG Tobi :D

Expertenantwort
von Oubyi, Community-Experte für Excel, 171

Markiere den gesamten Bereich von A1 an und gibt dann in der Bedingten Formatierung diese Formel ein:

=REST(A1;2)=0

Wird das ein Sieb des Eratosthenes?

Expertenantwort
von Suboptimierer, Community-Experte für Excel, 121

Ich habe dir mal zwei Funktionen geschrieben, mit denen du mit sehr großer Sicherheit (bei großen Zahlen keine 100%ige!) feststellen kannst, ob eine Zahl prim ist:

Function ISTPRIMFERMAT(ByVal iZuTestendeZahl As Long) As Boolean
  'Führt auf eine Zahl den Fermatschen Primzahltest durch und gibt
  ' zurück, ob der Test bestanden wurde.
  ' Es werden die Basen 2, 3, 5 und 7 getestet
  ' 03.11.2015 TH
  Dim a As Long
  
  ISTPRIMFERMAT = True
  Select Case iZuTestendeZahl
    Case 2, 3, 5, 7: Exit Function
  End Select
  If iZuTestendeZahl <= 7 Then
    ISTPRIMFERMAT = False
    Exit Function
  End If
  
  a = 2
  While a <= 7
    If iZuTestendeZahl Mod a = 0 Then
      ISTPRIMFERMAT = False
      Exit Function
    Else
      If aHochmModn(a, iZuTestendeZahl - 1, iZuTestendeZahl) <> 1 Then
        ISTPRIMFERMAT = False
        Exit Function
      End If
    End If
    
    If a <> 2 Then a = a + 1
    a = a + 1
  Wend
End Function

Private Function aHochmModn(ByVal a, m, n As Long) As Long
  aHochmModn = 1
  While m <> 0
    If m Mod 2 = 0 Then
      a = (a * a) Mod n
      m = m / 2 ' Typ Long!
    Else
      m = m - 1
      aHochmModn = (aHochmModn * a) Mod n
    End If
  Wend
End Function
Antwort
von Nebuk, 150

Mit der Funktion REST. 

Wenn die zu prüfende Zahl durch eine andere Zahl geteilt einen REST von 0 ergibt, dann kann man sie mit der bedingten Formatierung rot färben. 

Kommentar von Trummler ,

Aber was muss ich da eingeben, damit der Term überhaupt erkannt wird? O.o      

Also, damit das Programm dann auch WEISS, dass es alles streichen soll, was durch 2 teilbar ist.

Kommentar von PattuXD ,

Deine Regel heißt REST(Zelle;2)=0 für die Teiler von 2, REST(Zelle;3)=0 etc. 

Für Primzahlen ist das Problem, dass du mit dieser Methode nicht voran kommst. Du kannst dir alle Zahlen, die durch 2 teilbar sind, anzeigen lassen. Von den nicht angezeigten nimmst du die kleinste (3). Das ist deine nächste Primzahl. Dann guckst du, welche weder von 2, noch von 3 markiert wurde. Das ist 5. Daher machst du die nächste Regel für die 5 etc.
Das Problem nun: Das basiert auf Primfaktorenzerlegung. Sprich: Jede Zahl lässt sich eindeutig in ein Produkt von Primzahlen zerlegen. Eine Zahl x ist natürlich nicht durch Zahlen, die größer als x teilbar sind dividieren. Wenn du also alle bisher gefundenen Primzahlen unter x markiert hast (das hast du garantiert, wenn x deine kleinste unmarkierte Zahl ist), und x noch nicht markiert ist, ist x eine Primzahl (sonst könnte sie ja weiter zerlegt werden). So findest du theoretisch jede Primzahl raus, ABER bei diesem Prinzip findest du jede Primzahl einzeln, nie mehrere gleichzeitig, d.h. du musst für JEDE Primzahl eine neue Regel festlegen.
Zum Glück hab ich ne (nicht 100% optimale) Lösung dafür q:
Nun könntest du schlau sein und dir wenigstens etwas Arbeit ersparen und nur für die Primzahlen bis 100x50 (also die Hälfte, 1 bis 5000) eine Regel erstellen, denn eine Zahl über 500 wird keine weiteren Zahlen mehr markieren, denn wenn du REST(Zelle;2)=0 als Regel hast, wird jede zweite Zahl markiert, bei REST(Zelle;3)=0 jede dritte und bei REST(Zelle;5003)=0 [keine Ahnung, ob die wirklich prim ist] jede 5003. Zahl. Nun heißt jede 5003. Zahl in 1 bis 10000 aber eigentlich nur die 5003 selbst, da 10006 schon nicht mehr im Bereich liegt.
5000 ist immer noch sehr viel, also vereinfachen wir weiter:
Gucken wir uns mal alle Zahlen über 200 an. Bspw. 203 [wieder keine Ahnung, ob wirklich prim]. Jetzt müssten wir 203, 2x203, 3x203 und 4x203 markieren. Die sind aber schon markiert! Waurm? Weil die ja auch durch 2/3/4 teilbar sind und dort markiert wurden.
Daher können wir generell sagen: Bei einer Zahl x sind alle Vielfachen bis 10000 bereits markiert, wenn der größtmögliche Faktor, bei dem das Ergebnis noch im Bereich 1 bis 10000 bleibt (also das maximale k für k*x<=10000), immer noch kleiner als das x ist.
D.h. wir haben k*x<=10000 und k<x
mit k maximal und x soll minimal sein (du willst ja so wenig wie möglich rechnen).
k<x |*k
k*k<k*x
und da k*x<=10000
gilt auch: k*k<10000 |Wurzel
k<100
Und da k maximal sein soll: k=99.
Da x minimal sein soll, nehmen wir aus k<x einfach x=100.
Zur Probe: k*x=99*100=9900<=10000.
Du musst also alle Primzahlen in den ersten 100 Zahlen herausfinden und markieren, dann hast du auch alle Primzahlen in den ersten 10000 Zahlen.
Verallgemeinert: Hast du alle Primzahlen bis x markiert, kennst du alle Primzahlen bis x². Andersherum: wenn du alle Primzahlen bis x wissen willst, musst du alle Primzahlen bis wurzel(x) herausfinden und markieren.
Warum ist das nicht optimal?
Naja, von der momentan größte Primzahl kann man sich nichtmal die Anzahl der Stellen irgendwie vorstellen (die Anzahl der Stellen hat Milliarden von Stellen). Mit diesem einfachen Algorithmus ist man schon begrenzt. Für eine Million Primzahlen bräuchte man per Excel und per Hand alle Primzahlen bis 1000 und für jede diese Markierungsregel. Viel Spaß dabei... ;)

Kommentar von PattuXD ,

edit: ich meine 2003, nicht 203 ^^

Keine passende Antwort gefunden?

Fragen Sie die Community