Seite 1 von 1

Primfaktorenzerlegung und Berechnung des GGT zweier Zahlen

Verfasst: Freitag 12. Februar 2010, 22:37
von RonnyO.
Hallo zusammen!

Anbei eines meiner "Erstlingswerke"! Ich würde mich über eure Komentare, welcher Art auch immer, freuen.

Code: Alles auswählen

# -*- coding: utf-8 -*-

def calc_primenumbers(x):
    primes = []
    for i in range(2, x + 1):
        isPrime = True
        for ii in range(2, i):
            if i % ii == 0:
                isPrime = False
        if isPrime:
            primes.append(i)
    return primes

def calc_primefactors(x):
    primeNumbers = calc_primeNumbers(x)
    primeFactors = []
    for i in primeNumbers:
        while x % i == 0:
            x = x / i
            primeFactors.append(i)
    return primeFactors

def calc_greatescommondivider(x,y):
    greatestCommonDivider = 1
    commonPrimeFactors = []
    xPrimeFactors = calc_primefactors(x)
    yPrimeFactors = calc_primefactors(y)
    for xPrimeFactor in xPrimeFactors:
        if xPrimeFactor in yPrimeFactors:
            commonPrimeFactors.append(xPrimeFactor)
            yPrimeFactors.pop(0)
    for commonPrimeFactor in commonPrimeFactors:
        greatestCommonDivider *= commonPrimeFactor
    return greatestCommonDivider


if __name__ == '__main__':
    while 1:
        x = input("Eingabe 1. Zahl: ")
        y = input("Eingabe 2. Zahl: ")
        xPrimeFactors = calc_primefactors(x)
        yPrimeFactors = calc_primefactors(y)
        print "Die Primfaktoren der Zahl", y, "sind",yPrimeFactors
        print "Die Primfaktoren der Zahl", x, "sind", xPrimeFactors
        print "Der GGT der Zahlen %s und %s ist %s" %(x, y, calc_greatesCommonDivider(x, y))
        print ""

LG RonnyO.

Verfasst: Freitag 12. Februar 2010, 23:19
von numerix
- Variablennamen besser wählen: Natürliche Zahlen nennt man üblicherweise nicht x und y; ii ist ebenfalls nicht schön. Andere Namen wiederum sind zu lang, die Verwendung von CamelCase entspricht nicht den Python-Konventionen.
- Dein Primzahlsieb ist ineffizient.
- Deine Primfaktorzerlegung ist ineffizient.
- Die Berechnung des ggT ist umständlich (dazu gab es dieser Tage einen Thread). Der Euklidische Algorithmus ist eleganter, kürzer und wohl auch effizienter. Wenn du ihn nicht selbst implementieren willst (das geht in einer Zeile Python-Code), dann kannst du auch die Funktion gcd() aus dem Modul fractions verwenden.

Re: Primfaktorenzerlegung und Berechnung des GGT zweier Zahl

Verfasst: Freitag 12. Februar 2010, 23:31
von hendrikS
RonnyO. hat geschrieben:Anbei eines meiner "Erstlingswerke"! Ich würde mich über eure Komentare, welcher Art auch immer, freuen.
Du solltest auch vermeiden ungetesteten Code einzustellen.

Verfasst: Samstag 13. Februar 2010, 00:51
von RonnyO.
...danke für die Anregungen! Vielleicht habe ich den Code auch einfach im falschen Bereich des Forums gepostet.

Soll nicht der beste und schnellste Code sein, sondern nur ein Übung für mich, durch die ich ein wenig lernen wollte.

Vielleicht sollte man den Post eher in den Bereich allgemeine Fragen oder sonst wohin schieben?

@Numerix
Natürlich Zahlen sollte man wie benennen? Wäre 'a' oder 'b' besser?
CamelCase ist verboten, aber ich dachte ich hätte mixedCase verwendet und dieser wäre erlaubt?

@hendirkS
Ungetesteten Code?? Wem hätte ich den zum testen geben sollen, außer selbst zu testen, ob er funktioniert?

Verfasst: Samstag 13. Februar 2010, 07:57
von numerix
RonnyO. hat geschrieben:Natürlich Zahlen sollte man wie benennen? Wäre 'a' oder 'b' besser?
Ja. Oder m und n oder p und q.
RonnyO. hat geschrieben:CamelCase ist verboten, aber ich dachte ich hätte mixedCase verwendet und dieser wäre erlaubt?
"Verboten" ist diesbezüglich nichts. Aber gemäß Konvention werden für Bezeichner - außer bei Klassenamen - nur Kleinbuchstaben verwendet; zur Trennung einzelner Bestandteile kannst du einen Unterstrich einsetzen.
RonnyO. hat geschrieben:Soll nicht der beste und schnellste Code sein, sondern nur ein Übung für mich, durch die ich ein wenig lernen wollte.
Die Verbesserung von Code bzw. Algorithmen wäre nicht das schlechteste Lernziel.
RonnyO. hat geschrieben:Ungetesteten Code?? Wem hätte ich den zum testen geben sollen, außer selbst zu testen, ob er funktioniert?
Der gezeigte Code ist definitiv nicht lauffähig.

Verfasst: Samstag 13. Februar 2010, 10:43
von Ronnie
Gute und schöne Lösungen zu dieser (und anderer) Problemstellungen finden sich auch bei Project Euler:

http://projecteuler.net/index.php?section=problems&id=3

AFAIR muss man sich anmelden um in die Lösungen und die Diskussionen dazu zu schauen.

Verschiedene Implementierungen für den euklidischen Algorithmus kann man sich z.B. auch hier: http://en.literateprograms.org/Category ... _algorithm betrachten.

Verfasst: Samstag 13. Februar 2010, 10:47
von numerix
Ronnie hat geschrieben:Gute und schöne Lösungen zu dieser (und anderer) Problemstellungen finden sich auch bei Project Euler:

http://projecteuler.net/index.php?section=problems&id=3

AFAIR muss man sich anmelden um in die Lösungen und die Diskussionen dazu zu schauen.
Nicht nur das. Man muss das jeweilige Problem gelöst haben, bevor man Zugriff auf die Lösungen etc. erhält.
Ronnie hat geschrieben:Verschiedene Implementierungen für den euklidischen Algorithmus kann man sich z.B. auch hier: http://en.literateprograms.org/Category ... _algorithm betrachten.
Die dort gezeigte rekursive Python-Lösung ist kein gelungener Python-Code.

Verfasst: Samstag 13. Februar 2010, 11:08
von Ronnie
numerix hat geschrieben:Die dort gezeigte rekursive Python-Lösung ist kein gelungener Python-Code.
Nein, aber insgesamt finden sich auf der Seite eine Menge recht guter Umsetzungen für viele Problemstellungen und das meist in mehreren Sprachen, sodass man vergleichen kann.

Verfasst: Samstag 13. Februar 2010, 15:42
von RonnyO.
Ja, 'm' oder 'n'... das klingt vernünftig für Ganzzahlen!!

Und ja, der Code ist definitiv nicht lauffähig... ich hatte wohl nach dem letzten Test ein paar unnötige Änderungen vorgenommen, die nicht ganz konsistent waren. :) Getestet hatte ich den Code zuvor, aber offensichtlich nicht nach den letzten Änderungen :(

calc_greatestCommonDivider(x,y) und
calc_primeNumbers(x) werden in camelCase aufgerufen, sind aber in Kleinbuchstaben definiert!

Für Bezeichner werden ab heute nur noch Kleinbuchstaben und Unterstriche verwendet!

Danke für die Hinweise!!

LG