Seite 1 von 1

Py 3.5 - Primzahldetektor für zweit Integer, so kurz wie möglich?

Verfasst: Sonntag 20. November 2016, 21:20
von cronotyper
Hi Leute, ich bin ein gefürchteter Newbe seit 1 Woche und Arbeite noch mit tutorials und Verständnis.
Mein Wissen ist nicht besonders umfangreich oder gefestigt.

Mein Taschenrechner soll zwei Integer detektieren, ob diese prim sind.

Also:

Code: Alles auswählen

num1 = int(input("Gib die erste Zahl ein: "))
num2 = int(input("Gib die zweite Zahl (ist auch Potenz etc.) ein: "))
...dazu soll der Code so platzsparend wie möglich beide Zahlen ausgeben, ohne den Schnipsel zweimal schreiben zu müssen.

Code: Alles auswählen

if num1 >1:
     for x in range(2, num1):
          if (num1 % x) == 0:
               print(num1, "ist keine Primzahl")
               break
     else:
          print (num1, "ist eine Primzahl")
else:
   print(num1,"ist keine Primzahl")
Wie gehts am besten? :K

Re: Py 3.5 - Primzahldetektor für zweit Integer, so kurz wie möglich?

Verfasst: Sonntag 20. November 2016, 21:36
von BlackJack
@cronotyper: Code-Wiederholungen vermeidet man durch Funktionen und/oder Schleifen.

Re: Py 3.5 - Primzahldetektor für zweit Integer, so kurz wie möglich?

Verfasst: Sonntag 20. November 2016, 21:46
von jerch
@cronotyper:
Den Teilertest kannst Du noch optimieren. Überleg einfach mal, ob Du wirklich bis zur Zahl selbst testen musst oder früher schon aufhören kannst.

Re: Py 3.5 - Primzahldetektor für zweit Integer, so kurz wie möglich?

Verfasst: Sonntag 20. November 2016, 21:49
von pixewakb
https://www.scipy.org/

http://www.sympy.org/en/index.html

Code: Alles auswählen

from sympy.ntheory import isprime

while True:

    try:
        zahl = int(input("Geben Sie eine Ganzzahl ein: "))
        if zahl <= 0 :
            raise ValueError
    except ValueError:
        print("Das war keine Ganzzahl > 0!\n")
        
    if isprime(zahl):
        print("{} ist eine Primzahl".format(zahl))
    else:
        print("{} ist keine Primzahl".format(zahl))
Konkret nutze ich: http://docs.sympy.org/latest/modules/nt ... st.isprime

Wenn es um so etwas geht, ist diese Bibliothek m. E. absolut großartig. Ich habe auch mal so angefangen, ich merke allerdings an, dass Du mal nach Sieben und Primzahlen suchen solltest.

Re: Py 3.5 - Primzahldetektor für zweit Integer, so kurz wie möglich?

Verfasst: Sonntag 20. November 2016, 21:59
von jerch
@pixewakb:
Deine Empfehlung halte ich für unglücklich, da Dein `isprime` Verfahren benutzt, die pseudoprim enden können, während der Teilertest des OPs EXAKT ist. Die peudoprim-Verfahren sind super, wenn man sich in die Domäne eingearbeitet hat und deren Vorzüge/Fallstricke einzuschätzen weiß.

Re: Py 3.5 - Primzahldetektor für zweit Integer, so kurz wie möglich?

Verfasst: Sonntag 20. November 2016, 22:26
von pixewakb
Sorry, als Nicht-Mathematiker war mir das nicht bekannt. :oops: Ich versuchte darauf aufmerksam zu machen, dass man sich Programmieraufwand reduzieren kann, wenn man auf fertige Lösungen zurückgreifen kann und nicht jedes Rad selbst neu erfindet. Dass die Implementierung in der Bibliothek problematisch sein könnte, hatte ich nicht erwartet.

Re: Py 3.5 - Primzahldetektor für zweit Integer, so kurz wie möglich?

Verfasst: Sonntag 20. November 2016, 23:14
von BlackJack
Ungetestet:

Code: Alles auswählen

from itertools import chain
from math import sqrt


def is_prime(number):
    candidates = chain([2], range(3, int(sqrt(number)), 2))
    return all(number % i != 0 for i in candidates)

Re: Py 3.5 - Primzahldetektor für zweit Integer, so kurz wie möglich?

Verfasst: Montag 21. November 2016, 04:25
von cronotyper
Uhi*, okay Schleife ist ja drin, FOR.
Habe bisher nur einfach Operationen benutzt wie math.gcd und die Grundrechenarten.
Dann ganz einfach Ausgaben gegeneriert nach dem Beispiel:

Code: Alles auswählen

num1 = int(input("Gib die erste Zahl ein: "))
num2 = int(input("Gib die zweite Zahl (ist auch Potenz etc.) ein: "))

summe1=num1+num2   # Addition
summe2=num1-num2   # Subtraktion

print(num1, " + ", num2, "=", summe1, "\n", "___", "\n" )
print(num1, " - ", num2, "=", summe2, "\n", "___", "\n" )
Dazu div, mult, modulo, gemeinsamer teiler, gemeinsames vielfaches, wurzel und jetz bei PRIM hänge ich fest.
Muss wohl noch bisschen mehr lernen bzw. verstehen wie prim exakt berechnet wird und wo die schleife reinkommt (for, while)

Danke mal für die Ideen wenn ich ich geschafft habe meld ich mich nochmal.
:D