Contexte
D'Euler indicatrice
de fonction φ(n)
est définie comme étant le nombre de nombres entiers inférieurs ou égaux à n
qui sont relativement premier n
, qui est, le nombre de valeurs possibles x
dans 0 < x <= n
pour lesquels
gcd(n, x) == 1
. Nous avons eu
un
peu totient - connexes défis
, mais jamais celui qui est juste le calculer.
Le mappage de la fonction de totient sur les nombres entiers est OEIS A000010 .
Défi
Étant donné un entier n > 0
, calculez φ(n)
. Vous pouvez prendre des entrées via des arguments de ligne de commande, des entrées standard, des arguments de fonction ou toute autre chose raisonnable. Vous pouvez donner une sortie via une sortie standard, des valeurs de retour ou toute autre chose raisonnable. Les fonctions anonymes sont acceptables. Vous pouvez supposer que l'entrée ne dépassera pas votre méthode naturelle de stockage des entiers, par exemple int
en C, mais vous devez prendre en charge les entrées jusqu'à 255.
Si votre langage a une fonction de totient intégrée, vous ne pouvez pas l'utiliser.
Exemples
φ(1) => 1
φ(2) => 1
φ(3) => 2
φ(8) => 4
φ(9) => 6
φ(26) => 12
φ(44) => 20
φ(105) => 48
La réponse la plus courte en octets gagne. Si votre langue utilise un encodage autre que UTF-8, mentionnez-le dans votre réponse.
EulerPhi
Réponses:
Mathematica,
2722 octetsUne fonction sans nom qui prend et retourne un entier.
Pas grand-chose à expliquer ici, sauf qu'il
@
s'agit de la notation de préfixe pour les appels de fonction et de~...~
la notation d'infixe (associative à gauche), donc ce qui précède est le même que:la source
MATL, 7 octets
Vous pouvez TryItOnline . Idée la plus simple, faire un vecteur 1 à N, et prendre en gcd de chaque élément avec N (
Zd
fait gcd). Ensuite, trouvez quels éléments sont égaux à 1 et additionnez le vecteur pour obtenir la réponse.la source
_Zp
pour ceux qui se demandent.J, 9 octets
Ceci est basé sur l' essai de Jsoftware sur les fonctions totientes.
Étant donné n = p 1 e 1 ∙ p 2 e 2 ∙∙∙ p k e k où p k est un facteur premier de n , la fonction de totient φ ( n ) = φ ( p 1 e 1 ) ∙ φ ( p 2 e 2 ) ∙∙∙ φ ( p k e k ) = ( p 1 - 1) p 1 e 1 - 1 ∙ ( p 2 - 1) p 2e 2 - 1 ∙∙∙ ( p k - 1) p k e k - 1 .
Usage
Explication
la source
[:*/@({.(^-(^<:)){:)2&p:
faut 24 octets, même en utilisant le builtin pour obtenir les nombres premiers et leurs exposants. Ou peut-être qu'il y a un chemin plus court et je ne le vois pas.Gelée, 4 octets
Essayez-le en ligne!
Explication
Avec intégré
Essayez-le en ligne!
Explication
la source
Haskell, 28 octets
Utilise la mise en correspondance de constantes de Haskell . Les astuces ici sont assez standard pour le golf, mais je vais expliquer à un public général.
L'expression
gcd n<$>[1..n]
correspondgcd n
à[1..n]
. En d'autres termes, il calcule legcd
avecn
de chaque nombre de1
àn
:À partir d'ici, la sortie souhaitée est le nombre d'
1
entrées, mais Haskell n'a pas decount
fonction. La façon idiomatique defilter
ne garder que1
des, et de prendre le résultatlength
, ce qui est beaucoup trop long pour le golf.Au lieu de cela, le
filter
est simulé par une compréhension[1|1<-l]
de la liste avec la liste résultantel
. Habituellement, les compréhensions de liste lient des valeurs à des variables comme dans[x*x|x<-l]
, mais Haskell permet de comparer un modèle, dans ce cas la constante1
.Donc, en
[1|1<-l]
générant un1
sur chaque correspondance de1
, en extrayant efficacement les seuls1
de la liste d'origine. Faire appelsum
à lui donne sa longueur.la source
Python 2, 44 octets
Moins golfé:
Utilise la formule dont les totaux d'Euler des diviseurs
n
ont une somme den
:La valeur de
ϕ(n)
peut alors être récursivement calculée commen
moins la somme sur les diviseurs non triviaux. Effectivement, cela fait une inversion de Möbius sur la fonction d'identité. J'ai utilisé la même méthode dans un golf pour calculer la fonction Möbius .Merci à Dennis d'avoir sauvé 1 octet avec un meilleur cas de base, en répartissant la valeur initiale de
+n
dans+1
pour chacune desn
boucles, faites comme-~
.la source
Pyke, 5 octets
Essayez-le ici!
la source
Regex (ECMAScript), 131 octets
Au moins -12 octets grâce à Deadcode (dans le chat)
Essayez-le en ligne!
La sortie est la longueur de la correspondance.
Les expressions régulières ECMAScript rendent extrêmement difficile de compter quoi que ce soit. Toute backref définie à l'extérieur d'une boucle sera constante pendant la boucle, toute backref définie à l'intérieur d'une boucle sera réinitialisée lors de la boucle. Ainsi, la seule façon de transporter l'état sur des itérations de boucle est d'utiliser la position de correspondance actuelle. C'est un entier unique, et il ne peut que diminuer (enfin, la position augmente, mais la longueur de la queue diminue, et c'est à cela que nous pouvons faire des calculs).
Compte tenu de ces restrictions, le simple comptage des nombres premiers semble impossible. Au lieu de cela, nous utilisons la formule d' Euler pour calculer le total.
Voici à quoi cela ressemble en pseudocode:
Il y a deux choses douteuses à ce sujet.
Tout d'abord, nous ne sauvegardons pas l'entrée, uniquement le produit actuel, alors comment pouvons-nous accéder aux facteurs premiers de l'entrée? L'astuce est que (N - (N / P)) a les mêmes facteurs premiers> P que N. Il peut gagner de nouveaux facteurs premiers <P, mais nous les ignorons quand même. Notez que cela ne fonctionne que parce que nous itérons sur les facteurs premiers du plus petit au plus grand, aller dans l'autre sens échouerait.
Deuxièmement, nous devons nous souvenir de deux nombres sur les itérations de boucle (P et N, Z ne compte pas car il est constant), et je viens de dire que c'était impossible! Heureusement, nous pouvons regrouper ces deux chiffres en un seul. Notez qu'au début de la boucle, N sera toujours un multiple de Z, tandis que P sera toujours inférieur à Z. Ainsi, nous pouvons simplement nous souvenir de N + P et extraire P avec un modulo.
Voici le pseudo-code légèrement plus détaillé:
Et voici l'expression régulière commentée:
Et en bonus…
Regex (ECMAScript 2018, nombre de correspondances), 23 octets
Essayez-le en ligne!
La sortie est le nombre de correspondances. ECMAScript 2018 introduit une analyse de longueur variable (évaluée de droite à gauche), qui permet de compter simplement tous les nombres en coprime avec l'entrée.
Il s'avère que c'est indépendamment la même méthode utilisée par la solution de rétine de Leaky Nun , et que l'expression régulière est même de la même longueur ( et interchangeable ). Je le laisse ici car il peut être intéressant que cette méthode fonctionne dans ECMAScript 2018 (et pas seulement .NET).
la source
J, 11 octets
Usage
où
>>
est STDIN et<<
STDOUT.Explication
la source
Python> = 3,5,
766458 octetsMerci à LeakyNun d'avoir joué au golf sur 12 (!) Octets.
Merci à Sp3000 pour avoir joué au golf sur 6 octets.
J'adore la lisibilité de Python. Cela a du sens, même à travers le golf.
la source
lambda n:sum(gcd(n,x)<2for x in range(n))
gcd
au module mathématique! Je ne le savais pas.Perl 6 ,
26 2422 octetsExplication:
Exemple:
la source
Julia, 25 octets
C'est simple - la
sum
fonction vous permet de lui donner une fonction à appliquer avant de sommer - essentiellement l'équivalent de l'exécutionmap
et ensuitesum
. Cela compte directement le nombre de nombres premiers relativement inférieurs àn
.la source
Python 2, 57 octets
Testez-le sur Ideone .
Contexte
Par la formule du produit d'Euler ,
où φ désigne la fonction de totient d'Euler et p ne varie que sur les nombres premiers.
Pour identifier les nombres premiers, nous utilisons un corollaire du théorème de Wilson :
Comment ça marche
À tout moment, la variable m sera égale au carré de la factorielle de k - 1 . En fait, nous avons nommé les arguments par défaut à k = 1 et m = 0! 2 = 1 .
Tant que k ≤ n , est
n*(k>n)
évalué à 0 et le code suivantor
est exécuté.Rappelez-vous que
m%k
cela donnera 1 si m est premier et 0 sinon. Cela signifie quex%k<m%k
cela donnera True si et seulement si k est un nombre premier et x est divisible par k .Dans ce cas, le
(n%k<m%k)*n/k
rendement n / k , et en le soustrayant de n remplace sa valeur précédente par n (1 - 1 / k) , comme dans la formule du produit d'Euler. Sinon, les(n%k<m%k)*n/k
rendements 0 et n restent inchangés.Après avoir calculé ce qui précède, nous incrémentons k et multiplions m par la «vieille» valeur de k 2 , maintenant ainsi la relation souhaitée entre k et m , puis appelons f récursivement avec les arguments mis à jour.
Une fois que k dépasse n , est
n*(k>n)
évalué à n , qui est renvoyé par la fonction.la source
Rubis, 32 octets
un lambda qui prend un entier n et retourne le nombre de nombres entiers dans la plage (1..n) en coprime avec n.
la source
Brachylog , 25 octets
Explication
Brachylog n'a pas encore de GCD intégré, nous vérifions donc que les deux nombres n'ont pas de facteurs premiers en commun.
Prédicat principal:
Prédicat 1:
la source
Pyth, 6 octets
Essayez-le en ligne!
Essayez-le en ligne!
Explication
la source
PowerShell v2 +, 72 octets
PowerShell ne dispose pas d'une fonction GCD, j'ai donc dû rouler la mienne.
Cela prend l'entrée
$n
, puis s'étend de1
à$n
et dirige ceux-ci dans une boucle|%{...}
. Chaque itération nous avons mis deux variables d'aide$a
et$b
puis exécuter une GCDwhile
boucle. Chaque itération que nous vérifions$b
est toujours non nulle, puis enregistrons$a%$b
vers$b
et la valeur précédente de$b
vers$a
pour la boucle suivante. Nous accumulons ensuite si$a
est égal à1
dans notre variable de sortie$o
. Une fois la boucle for terminée, nous la plaçons$o
sur le pipeline et la sortie est implicite.Comme exemple de la façon dont la
while
boucle fonctionne, réfléchissez$n=20
et c'est parti$_=8
. La première vérification a$b=20
, nous entrons donc dans la boucle. Nous calculons d'abord$a%$b
ou8%20 = 8
, qui est réglé sur$b
en même temps que20
sur$a
. Vérifiez8=0
, et nous entrons dans la deuxième itération. Nous calculons20%8 = 4
et réglons ensuite cela sur$b
, puis$a
sur8
. Vérifiez4=0
, et nous entrons dans la troisième itération. Nous calculons8%4 = 0
et réglons cela sur$b
, puis réglons$a
sur4
. Vérifiez0=0
et nous quittons la boucle, donc le GCD (8,20) est$a = 4
. Ainsi,!($a-1) = !(4-1) = !(3) = 0
donc$o += 0
et nous ne comptons pas celui-là.la source
Facteur, 50 octets
Fait un intervalle ( iota ) n , et curry n dans une fonction qui obtient gcd xn pour toutes les valeurs de 0 <= x <= n , teste si le résultat est 1 . Filtrez la plage d'origine pour savoir si le résultat de gcd xn était 1 et prenez sa longueur .
la source
[ dup iota swap '[ _ gcd nip 1 = ] map sum ]
économise 6 octets (je pense - pas très expérimenté avec Factor).t/f
(symboles) dans Factor, donc la seule façon de l'implémenter serait avec[ dup iota swap '[ _ gcd nip 1 = 1 0 ? ] map sum ]
, qui est la même longueur exacte que la solution actuelle.TYPED:
en vrai code facteur: PJapt
-mx
,75 octetsExécutez-le en ligne
-2 octets grâce à Shaggy
la source
-mx
.-m
solution mais j'ai oublié-x
. Merci!Rétine,
3629 octets7 octets grâce à Martin Ender.
Essayez-le en ligne!
Explication
Il y a deux étapes (commandes).
Première étape
Il s'agit d'une simple substitution d'expression régulière, convertissant l'entrée en autant.
Par exemple,
5
serait converti en11111
.Deuxième étape
Cette expression régulière tente de faire correspondre les positions qui satisfont à la condition (co-amorçage avec entrée), puis renvoie le nombre de correspondances.
la source
05AB1E, 7 octets
Expliqué
Essayez-le en ligne
la source
L€¿1¢
;Lʒ¿}g
;L€¿ΘO
.Lisp commun, 58 octets
Il s'agit d'une simple boucle qui compte jusqu'à 1 jusqu'au n donné et incrémente la somme si gcd = 1. J'utilise le nom de fonction o puisque t est la vraie valeur booléenne. Pas le plus court mais assez simple.
la source
MATLAB / Octave, 21 octets
Crée une fonction anonyme nommée
ans
qui peut être appelée avec l'entiern
comme seule entrée:ans(n)
Démo en ligne
la source
Python 2 , 44 octets
Cela utilise la même méthode pour identifier les coprimes comme ma réponse à "Coprimes jusqu'à N" .
Essayez-le en ligne!
la source
n-1
au lieu de1
, ce qui le fait fonctionnern==1
.JavaScript (ES6), 53 octets
Essayez-le en ligne!
la source
C (gcc) ,
6765 octetsEssayez-le en ligne!
Edit: Suppression de la variable temp.
Edit2: -1 grâce à @HowChen
Un peu moins golfé
la source
En fait, 11 octets
Essayez-le en ligne!
Explication
Avec intégré
Essayez-le en ligne!
la source
;╗R`╜g1=`MΣ
pour le même nombre d'octetsJavaScript (ES6), 67 octets
la source
APL, 7 octets
Il s'agit d'un train de fonctions monadique qui prend un entier à droite. L'approche ici est la plus évidente: somme (
+/
) le nombre de fois que le GCD de l'entrée et les nombres de 1 à l'entrée (⊢∨⍳
) est égal à 1 (1=
).Essayez-le ici
la source
Haskell,
3130 octets1 octet enregistré grâce à @Damien.
Sélectionne les valeurs avec gcd = 1, mappe chacune à 1, puis prend la somme.
la source
==1
par<2