Hintergrund
Eulersche totient
Funktion φ(n)
wie die Anzahl der ganzen Zahlen definiert ist , weniger als oder gleich n
, die teilerfremd zu n
, das heißt, die Anzahl der möglichen Werte von x
in , 0 < x <= n
für die
gcd(n, x) == 1
. Wir hatten
ein
paar totient - damit verbundene Herausforderungen
vor, aber nie eine , die es einfach ist , zu berechnen.
Die Abbildung der Totientenfunktion auf die ganzen Zahlen ist OEIS A000010 .
Herausforderung
n > 0
Berechnen Sie mit einer Ganzzahl φ(n)
. Sie können Eingaben über Befehlszeilenargumente, Standardeingaben, Funktionsargumente oder alles andere Vernünftige vornehmen. Sie können die Ausgabe über die Standardausgabe, Rückgabewerte oder einen anderen vernünftigen Wert vornehmen. Anonyme Funktionen sind zulässig. Sie können davon ausgehen, dass die Eingabe Ihre natürliche Methode zum Speichern von Ganzzahlen, z. B. int
in C, nicht überläuft , Sie müssen jedoch Eingaben bis zu 255 unterstützen.
Wenn Ihre Sprache eine integrierte Totientenfunktion hat, können Sie sie möglicherweise nicht verwenden.
Beispiele
φ(1) => 1
φ(2) => 1
φ(3) => 2
φ(8) => 4
φ(9) => 6
φ(26) => 12
φ(44) => 20
φ(105) => 48
Kürzeste Antwort in Bytes gewinnt. Wenn Ihre Sprache eine andere Codierung als UTF-8 verwendet, geben Sie dies in Ihrer Antwort an.
quelle
EulerPhi
Antworten:
Mathematica,
2722 BytesEine unbenannte Funktion, die eine Ganzzahl annimmt und zurückgibt.
Es gibt hier nicht viel zu erklären, außer dass dies
@
eine Präfixnotation für Funktionsaufrufe und~...~
eine (linksassoziative) Infixnotation ist.quelle
MATL, 7 Bytes
Sie können TryItOnline . Am einfachsten ist es, einen Vektor 1 zu N zu machen und von jedem Element mit N
Zd
gcd zu nehmen ( tut gcd). Finden Sie dann, welche Elemente gleich 1 sind, und addieren Sie den Vektor, um die Antwort zu erhalten.quelle
_Zp
für diejenigen, die sich fragen.J 9 Bytes
Dies basiert auf dem Aufsatz der Jsoftware über Totient-Funktionen.
Gegeben n = p 1 e 1 ∙ p 2 e 2 ∙∙∙ p k e k wobei p k ein Primfaktor ist n , die Totientenfunktion φ ( n ) = φ ( p 1 e 1 ) ∙ φ ( p 2 e 2 ) & PHgr; ( p k e k ) = ( p 1 - 1) p 1 e 1 - 1 & PHgr; ( p 2 - 1) p 2e 2 - 1 ( p k - 1) p k e k - 1 .
Verwendung
Erläuterung
quelle
[:*/@({.(^-(^<:)){:)2&p:
24 Byte erforderlich sind. Oder vielleicht gibt es einen kürzeren Weg und ich sehe es nicht.Gelee, 4 Bytes
Probieren Sie es online!
Erläuterung
Mit eingebautem
Probieren Sie es online!
Erläuterung
quelle
Haskell, 28 Bytes
Verwendet Haskells Mustervergleich von Konstanten . Die Tricks hier sind zum Golfen ziemlich üblich, aber ich erkläre es einem allgemeinen Publikum.
Der Ausdruck
gcd n<$>[1..n]
wirdgcd n
auf abgebildet[1..n]
. Mit anderen Worten, es berechnet dasgcd
mitn
jeder Zahl von1
bisn
:Ab hier ist die gewünschte Ausgabe die Anzahl der
1
Einträge, aber Haskell fehlt einecount
Funktion. Die idiomatische Artfilter
, nur1
die zu behalten und die daraus resultierenden zu nehmenlength
, ist viel zu lang zum Golfen.Stattdessen
filter
wird das durch ein Listenverständnis[1|1<-l]
mit der daraus resultierenden Liste simuliertl
. Normalerweise binden Listenverständnisse Werte an Variablen wie in[x*x|x<-l]
, aber mit Haskell kann ein Muster verglichen werden, in diesem Fall die Konstante1
.Also,
[1|1<-l]
ein Erzeugen1
auf jedem Spiel von1
effektiv nur die Extraktion von1
‚s der ursprünglichen Liste. Das Aufrufensum
gibt seine Länge.quelle
Pyke, 5 Bytes
Probieren Sie es hier aus!
quelle
Python> = 3,5,
766458 BytesDanke an LeakyNun für das Golfen mit 12 (!) Bytes.
Dank an Sp3000 für das Golfen mit 6 Bytes.
Ich finde es toll, wie gut lesbar Python ist. Dies macht auch durch die Golffreundlichkeit Sinn.
quelle
lambda n:sum(gcd(n,x)<2for x in range(n))
gcd
das Mathe-Modul erweitert! Ich wusste es nicht.Python 2, 44 Bytes
Weniger golfen:
Verwendet die Formel, dass die Euler-Summen der Teiler von
n
eine Summe von habenn
:Der Wert von
ϕ(n)
kann dann rekursiv alsn
minus der Summe über nichttriviale Teiler berechnet werden . Tatsächlich führt dies eine Möbius-Inversion der Identitätsfunktion durch. Ich habe die gleiche Methode in einem Golf benutzt, um die Möbius-Funktion zu berechnen .Vielen Dank an Dennis für das Speichern von 1 Byte mit einem besseren Basisfall, das Verteilen des Anfangswerts von
+n
in+1
für jede dern
Schleifen als-~
.quelle
Regex (ECMAScript), 131 Bytes
Mindestens -12 Bytes dank Deadcode (im Chat)
Probieren Sie es online!
Die Ausgabe ist die Länge der Übereinstimmung.
ECMAScript-reguläre Ausdrücke machen es extrem schwierig, etwas zu zählen. Jede Backref, die außerhalb einer Schleife definiert ist, bleibt während der Schleife konstant. Jede Backref, die innerhalb einer Schleife definiert ist, wird beim Schleifen zurückgesetzt. Die einzige Möglichkeit, den Status über Schleifeniterationen zu übertragen, ist die Verwendung der aktuellen Übereinstimmungsposition. Das ist eine einzelne Ganzzahl, und sie kann nur abnehmen (nun, die Position nimmt zu, aber die Länge des Schwanzes nimmt ab, und dafür können wir rechnen).
Angesichts dieser Einschränkungen scheint es unmöglich zu sein, Coprime-Zahlen zu zählen. Stattdessen verwenden wir die Euler-Formel , um den Totienten zu berechnen.
So sieht es im Pseudocode aus:
Es gibt zwei zweifelhafte Dinge.
Erstens speichern wir nicht die Eingabe, sondern nur das aktuelle Produkt. Wie können wir also zu den Hauptfaktoren der Eingabe gelangen? Der Trick ist, dass (N - (N / P)) die gleichen Primfaktoren> P wie N hat. Es kann neue Primfaktoren <P erhalten, aber wir ignorieren diese trotzdem. Beachten Sie, dass dies nur funktioniert, weil wir die Primfaktoren vom kleinsten zum größten iterieren. Andernfalls würde dies fehlschlagen.
Zweitens müssen wir uns zwei Zahlen über Schleifeniterationen merken (P und N, Z zählen nicht, da sie konstant sind), und ich sagte nur, dass das unmöglich war! Zum Glück können wir diese beiden Zahlen in einer einzigen verwandeln. Beachten Sie, dass zu Beginn der Schleife N immer ein Vielfaches von Z ist, während P immer kleiner als Z ist. Daher können wir uns nur an N + P erinnern und P mit einem Modulo extrahieren.
Hier ist der etwas detailliertere Pseudocode:
Und hier ist der kommentierte reguläre Ausdruck:
Und als Bonus ...
Regex (ECMAScript 2018, Anzahl der Übereinstimmungen), 23 Byte
Probieren Sie es online!
Ausgabe ist die Anzahl der Übereinstimmungen. Mit ECMAScript 2018 wird ein Look-Behind mit variabler Länge (von rechts nach links ausgewertet) eingeführt, mit dem einfach alle Zahlen gleichzeitig mit der Eingabe gezählt werden können.
Es stellt sich heraus, dass dies unabhängig von der Retina-Lösung von Leaky Nun die gleiche Methode ist , und der Regex hat sogar die gleiche Länge ( und ist austauschbar ). Ich lasse es hier, weil es von Interesse sein kann, dass diese Methode in ECMAScript 2018 (und nicht nur in .NET) funktioniert.
quelle
Perl 6 ,
26 2422 BytesErläuterung:
Beispiel:
quelle
J, 11 Bytes
Verwendung
wo
>>
ist STDIN und<<
ist STDOUT.Erläuterung
quelle
Julia, 25 Bytes
Es ist ganz einfach: Mit dieser
sum
Funktion können Sie der Funktion eine Funktion zuweisen, die vor der Summierung angewendet werden soll. Dies entspricht im Grunde dem Ausführen vonmap
und dannsum
. Dies zählt direkt die Anzahl der relativ Primzahlen kleiner alsn
.quelle
Python 2, 57 Bytes
Testen Sie es auf Ideone .
Hintergrund
Durch die Eulersche Produktformel ,
wobei φ die Euler'sche Totientenfunktion bezeichnet und p nur über Primzahlen variiert.
Um Primzahlen zu identifizieren, verwenden wir eine Folgerung aus Wilsons Theorem :
Wie es funktioniert
Die Variable m ist immer gleich dem Quadrat der Fakultät von k - 1 . Tatsächlich haben wir Argumente standardmäßig mit k = 1 und m = 0 benannt! 2 = 1 .
Solange k ≤ n ist
n*(k>n)
, wird 0 ausgewertet und der folgende Codeor
ausgeführt.Denken Sie daran, dass dies 1
m%k
ergibt, wenn m eine Primzahl ist, und 0, wenn nicht. Dies bedeutet, dass nur dann True ergibt, wenn sowohl k eine Primzahl ist als auch x durch k teilbar ist .x%k<m%k
In diesem Fall
(n%k<m%k)*n/k
ergibt sich n / k , und durch Subtrahieren von n wird sein vorheriger Wert durch n (1 - 1 / k) ersetzt , wie in der Euler-Produktformel. Ansonsten(n%k<m%k)*n/k
ergibt sich 0 und n bleiben die unverändert.Nach der Berechnung des Vorstehenden inkrementieren wir k und multiplizieren m mit dem "alten" Wert von k 2 , wodurch die gewünschte Beziehung zwischen k und m aufrechterhalten wird , und rufen dann f rekursiv mit den aktualisierten Argumenten auf.
Sobald k überschreitet n ,
n*(k>n)
auswertet bis n , die durch die Funktion zurückgebracht wird.quelle
Brachylog , 25 Bytes
Erläuterung
In Brachylog ist noch kein GCD integriert, daher prüfen wir, ob die beiden Zahlen keine Primfaktoren gemeinsam haben.
Hauptprädikat:
Prädikat 1:
quelle
Pyth, 6 Bytes
Probieren Sie es online!
Probieren Sie es online!
Erläuterung
quelle
PowerShell v2 +, 72 Byte
PowerShell verfügt nicht über eine GCD-Funktion, daher musste ich meine eigene rollen.
Dies geschieht Eingang
$n
, dann reicht von1
zu$n
und Rohren dieser in eine Schleife|%{...}
. Jede Iteration setzen wir zwei Hilfsvariablen$a
und$b
dann eine GCD ausführenwhile
Schleife. Jede Iteration, die wir überprüfen,$b
ist immer noch ungleich Null und speichert$a%$b
dann$b
den vorherigen Wert von$b
bis$a
für die nächste Schleife. Wir sammeln sich dann , ob$a
heißt auf gleich1
in unserer Ausgangsgröße$o
. Sobald die for-Schleife abgeschlossen ist, platzieren wir sie$o
in der Pipeline und die Ausgabe ist implizit.while
Betrachten Sie als Beispiel, wie die Schleife funktioniert,$n=20
und wir sind dabei$_=8
. Der erste Check hat$b=20
, also betreten wir die Schleife. Wir berechnen zuerst$a%$b
oder8%20 = 8
, was zur$b
gleichen Zeit gesetzt wird, die20
gesetzt wird$a
. Überprüfen Sie8=0
, und wir geben die zweite Iteration ein. Wir berechnen20%8 = 4
und setzen das auf$b
, setzen dann$a
auf8
. Überprüfen Sie4=0
, und wir geben die dritte Iteration ein. Wir berechnen8%4 = 0
und setzen das auf$b
, dann setzen wir$a
auf4
. Überprüfen Sie0=0
und wir verlassen die Schleife, so dass die GCD (8,20) ist$a = 4
. So,!($a-1) = !(4-1) = !(3) = 0
so$o += 0
und wir zählen das nicht.quelle
Ruby, 32 Bytes
Ein Lambda, das eine Ganzzahl n annimmt und die Anzahl der Ganzzahlen im Bereich (1..n) zurückgibt, die mit n zusammenfallen.
quelle
Japt
-mx
,75 BytesFühren Sie es online aus
-2 Bytes dank Shaggy
quelle
-mx
.-m
Lösung zu finden, aber vergessen-x
. Vielen Dank!Retina,
3629 Bytes7 Bytes dank Martin Ender.
Probieren Sie es online!
Erläuterung
Es gibt zwei Stufen (Befehle).
Erste Stufe
Es ist eine einfache Regex-Ersetzung, die die Eingabe in so viele konvertiert.
Beispielsweise
5
würde konvertiert werden zu11111
.Zweite Etage
Dieser reguläre Ausdruck versucht, die Positionen zu finden, die die Bedingung erfüllen (mit der Eingabe übereinstimmen), und gibt dann die Anzahl der Übereinstimmungen zurück.
quelle
Common Lisp, 58 Bytes
Dies ist eine einfache Schleife, die 1 bis zum angegebenen n zählt und die Summe erhöht, wenn gcd = 1. Ich verwende den Funktionsnamen o, da t der wahre boolesche Wert ist. Nicht annähernd die kürzeste, aber ziemlich einfach.
quelle
MATLAB / Octave, 21 Bytes
Erstellt eine anonyme Funktion mit dem Namen,
ans
die mit der Ganzzahl aufgerufen werden kannn
Namen, die nur als Eingabe :ans(n)
Online Demo
quelle
Faktor 50 Bytes
Macht aus einem Bereich ( iota ) n und curries n eine Funktion, die gcd xn für alle Werte von 0 <= x <= n erhält und prüft, ob das Ergebnis 1 ist . Filtern sie den ursprünglichen Bereich , ob das Ergebnis der GCD xn war 1 , und das nimmt Länge .
quelle
[ dup iota swap '[ _ gcd nip 1 = ] map sum ]
spart 6 Bytes (glaube ich - nicht sehr erfahren mit Faktor).t/f
(Symbolen) in Factor. Die einzige Möglichkeit, dies zu implementieren, besteht darin, genau[ dup iota swap '[ _ gcd nip 1 = 1 0 ? ] map sum ]
dieselbe Länge wie die aktuelle Lösung zu verwenden.TYPED:
in echtem Faktorcode : PPython 2 , 44 Bytes
Dies verwendet die gleiche Methode, um Koprime wie zu identifizieren meine Antwort auf "Koprime bis zu N" .
Probieren Sie es online!
quelle
n-1
statt1
, die es funktioniertn==1
.JavaScript (ES6), 53 Byte
Probieren Sie es online!
quelle
Eigentlich 11 Bytes
Probieren Sie es online!
Erläuterung
Mit eingebautem
Probieren Sie es online!
quelle
;╗R`╜g1=`MΣ
für die gleiche Byteanzahl verwendenJavaScript (ES6), 67 Byte
quelle
05AB1E, 7 Bytes
Erklärt
Probieren Sie es online aus
quelle
APL, 7 Bytes
Dies ist ein monadischer Funktionszug, der rechts eine ganze Zahl annimmt. Der Ansatz hier ist der offensichtliche: summieren Sie (
+/
), wie oft die GCD der Eingabe und die Zahlen von 1 bis zur Eingabe (⊢∨⍳
) gleich 1 (1=
) sind.Probieren Sie es hier aus
quelle
Haskell,
31-30BytesDank @Damien 1 Byte gespeichert.
Wählt Werte mit gcd = 1 aus, ordnet sie jeweils 1 zu und nimmt dann die Summe.
quelle
==1
durch<2
Batch,
151145144 BytesBearbeiten: 4 Bytes durch Entfernen unnötiger Leerzeichen gespeichert. 1 Byte mit gespeichert
+=
. 1 Byte gespart durch Löschen vont
as+=
wird das als0
ohnehin interpretiert . 1 Byte dank @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ gespeichert.quelle