Berechnung der Eulers-Totisten-Funktion

7

Ich versuche einen effizienten Weg zu finden, Eulers Totient-Funktion zu berechnen.

Was ist falsch an diesem Code? Es scheint nicht zu funktionieren.

%Vor%     
Brock West 07.08.2013, 21:27
quelle

6 Antworten

21

Hier ist ein viel schnellerer, funktionierender Weg, basierend auf dieser Beschreibung auf Wikipedia:

  

Wenn also n eine positive ganze Zahl ist, dann ist φ (n) die Zahl der ganzen Zahlen k im Bereich 1 ≤ k ≤ n, für die gcd (n, k) = 1 gilt.

Ich sage nicht, dass dies der schnellste oder sauberste ist, aber es funktioniert.

%Vor%     
orlp 07.08.2013 21:37
quelle
4

Sie haben drei verschiedene Probleme ...

  1. y muss gleich n als Anfangswert sein, nicht 1
  2. Wie einige in den Kommentaren erwähnt haben, verwenden Sie keine Ganzzahldivision
  3. n % i == 0 is True tut nicht, was du denkst, weil Python die Vergleiche verkettet hat! Auch wenn n % i gleich 0 ist dann 0 == 0 ist True ABER 0 is True ist False ! Verwende parens oder entferne einfach den Vergleich mit True , da das sowieso nicht nötig ist.

Behebung dieser Probleme,

%Vor%     
Jared 07.08.2013 21:41
quelle
3

Ich arbeite an einer kryptographischen Bibliothek in Python und das ist, was ich benutze. gcd() ist die Methode von Euclid zur Berechnung des größten gemeinsamen Teilers und phi() ist die totient-Funktion.

%Vor%     
Serinice 05.10.2015 23:27
quelle
2

Es sieht so aus, als ob Sie Eulers Produktformel verwenden möchten, aber Sie berechnen nicht die Anzahl der Primzahlen, die a teilen. Sie berechnen die Anzahl der Elemente, die relativ zu a prim sind.

Da 1 und i beide Ganzzahlen sind, gilt dies auch für die Division. In diesem Fall erhalten Sie immer 0.

    
Joel 07.08.2013 21:38
quelle
2

In Bezug auf die Effizienz habe ich nicht bemerkt, dass jemand erwähnt, dass gcd (k, n) = gcd (n-k, n). Durch die Verwendung dieser Tatsache kann etwa die Hälfte der Arbeit eingespart werden, die für die Methoden zur Verwendung des gcd erforderlich ist. Starten Sie einfach die Zählung mit 2 (weil 1 / n und (n-1) / k immer irreduzibel ist) und addieren Sie jedes Mal, wenn das gcd eins ist, 2.

    
Bill Bell 15.05.2014 20:21
quelle
1

Eigentlich, um phi zu berechnen (irgendeine Zahl sagen n)
Wir verwenden die Formel wo p die Primfaktoren von n sind.

Sie haben also wenige Fehler in Ihrem Code:
1. y sollte gleich n sein 2. Für 1/i tatsächlich 1 und i sind beide Ganzzahlen, also wird ihre Auswertung auch eine ganze Zahl sein, daher wird es zu falschen Ergebnissen führen.

Hier ist der Code mit den erforderlichen Korrekturen.

%Vor%     
alphaguy 25.06.2016 11:33
quelle

Tags und Links