Primfaktorenzerlegung und Berechnung des GGT zweier Zahlen

Code-Stücke können hier veröffentlicht werden.
Antworten
RonnyO.
User
Beiträge: 6
Registriert: Freitag 6. Februar 2009, 08:40

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

- 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.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
RonnyO.
User
Beiträge: 6
Registriert: Freitag 6. Februar 2009, 08:40

...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?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Ronnie
User
Beiträge: 73
Registriert: Sonntag 21. März 2004, 17:44

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.
Achtung: User ist ein Python-Lehrling!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Ronnie
User
Beiträge: 73
Registriert: Sonntag 21. März 2004, 17:44

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.
Achtung: User ist ein Python-Lehrling!
RonnyO.
User
Beiträge: 6
Registriert: Freitag 6. Februar 2009, 08:40

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
Antworten