Étant donné un nombre n >= 2
, indiquez tous les entiers positifs inférieurs à n
où gcd(n, k) == 1
(avec k
l'un des nombres en sortie). Les nombres de ce type sont coprimes les uns aux autres.
Exemple: 10
donne le résultat [1, 3, 7, 9]
(sous la forme de votre choix, à condition que les nombres soient séparés de manière non ambiguë et dans une sorte de liste). La liste ne peut pas avoir des entrées en double et ne doit pas être triée.
Plus de cas de test:
2 -> [1]
3 -> [1, 2]
6 -> [1, 5]
10 -> [1, 3, 7, 9]
20 -> [1, 3, 7, 9, 11, 13, 17, 19]
25 -> [1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24]
30 -> [1, 7, 11, 13, 17, 19, 23, 29]
Nous ne comptons pas non plus les chiffres ci n
- dessus qui sont coprime n
, uniquement parce que je suis à peu près certain que les solutions sont infinies.
A noter également: les nombres coprimes l'un par rapport à l'autre sont également dits relativement premiers ou mutuellement premiers l'un par rapport à l'autre.
1\n3\n
) comptent-elles comme une sortie valide?Réponses:
Gelée , 3 octets
Essayez-le en ligne!
Comment cela marche-t-il?
Preuve de validité
Puisque nous voulons extraire uniquement les coprimes, la valeur minimale de la liste des plus grands diviseurs communs doit être 1 pour que l’
ÐṂ
astuce fonctionne. Prouvons cela (de deux manières différentes):Deux entiers positifs consécutifs sont toujours coprimes. Considérons , avec . On prend ensuite un autre entier positif tel que et . y = x + 1 k k | x k | yx,y∈Z∗ y=x+1 k k∣x k∣y
Cela implique que , donc , donc . Le seul entier positif à diviser est lui-même, il est donc garanti qu'il apparaisse dans la liste et sera toujours la valeur minimale.k | ( x + 1 - x ) k | 1 1 1k∣(y−x) k∣(x+1−x) k∣1 1 1
la source
ÐṂ
existait à l'époque, de toute façon je suis assez satisfait de celui-ci.DṂ
existait, mais cela ne fonctionnait que pour les monades. Les comi mis en œuvreÞ
,ÐṂ
,ÐṀ
pour dyades est daté du 9 mai 2017.Python 2 ,
6147 octetsEssayez-le en ligne!
Contexte
Considérons l' anneau . Bien que cet anneau soit généralement défini à l'aide de classes de résidus modulo n , il peut également être considéré comme l'ensemble Z n = { 0 , … , n - 1 } , où les opérateurs d'addition et de multiplication sont définis par a + n b = ( a + b )(Zn,+n,⋅n) n Zn={0,…,n−1} et, oùdésignent les opérateurs habituels d'addition, de multiplication et de modulo sur les entiers.a+nb=(a+b)%n + ,a⋅nb=a⋅b%n +,⋅, and %
Deux éléments et de sont appelés inverses multiplicatifs mutuels modulo si . Notez que lorsque .a b Zn n a⋅nb=1%n 1%n=1 n>1
Fixez et laissez être un coprime de n dans Z n . Si un ⋅ n x = a ⋅ n y pour deux éléments x et y de Z n , nous avons que un ⋅ xan>1 a n Zn a⋅nx=a⋅ny x y Zn . Cela implique que un ⋅ ( x - y )a⋅x%n=a⋅y%n , et on suit que n | a ⋅ ( x - y ) ,savoir, n divise une ⋅ ( x - y ) uniformément. Puisque n ne partage pas les diviseurs premiers avec a , cela signifie que n ∣ x - y . Enfin, comme - n < x - y < n , nous concluons que x = y . Cela montre que les produits d' une ⋅a ⋅ ( x - y)%n = a ⋅ x%n - a ⋅ y%n = 0 n ∣ a ⋅ ( x - y) n a ⋅ ( x - y) n une n ∣ x - y - n < x - y< n x = y sont tous des éléments différents de Z n . Puisque Z n a exactement n éléments, un (et exactement un) de ces produits doit être égal à 1 , c’est-à-dire qu’il existe ununique b dans Z n tel que a ⋅ n b = 1 .un ⋅n0 , ... , a ⋅n( n - 1 ) Zn Zn n 1 b Zn un ⋅nb = 1
A l' inverse, fix et laisser un être un élément de Z n qui est pas coprime à n . Dans ce cas, il existe un nombre premier p tel que p ∣ a et p ∣ n . Si a admettait un modulo inverse multiplicatif n (appelons-le b ), nous aurions que a ⋅ n b = 1 , ce qui signifie que a ⋅ bn > 1 une Zn n p p∣a p∣n a n b a⋅nb=1 et donc ( a ⋅ b - 1 )a⋅b%n=1 , donc n ∣ a ⋅ b - 1 . Depuis p ∣ a , on suit que p ∣ a ⋅ b . D'autre part, depuis p ∣ n , nous suivons également celui de p ∣ a ⋅ b - 1 . De cette façon, p ∣ ( a ⋅ b ) - ( a ⋅ b - 1 ) = 1(a⋅b−1)%n=a⋅b%n−1=0 n∣a⋅b−1 p∣a p∣a⋅b p∣n p∣a⋅b−1 p∣(a⋅b)−(a⋅b−1)=1 , ce qui contredit l'hypothèse selon laquelle est un nombre premier.p
Cela prouve que les déclarations suivantes sont équivalentes lorsque .n>1
et n sont coprimes.a n
admet un inverse multiplicatif modulo n .a n
admet ununiqueinverse multiplicatif modulo n .a n
Comment ça fonctionne
Pour chaque couple d'entiers et b dans Z n , l'entier k : = a ⋅ n + b est unique; en fait, a et b sont des quotients et le reste de k divisé par n , c'est-à-dire, étant donné k , on peut récupérer a = k / n et b = ka b Zn k:=a⋅n+b a b k n k a=k/n , où / désigne ladivisionentière. Enfin, puisque a ≤ n - 1 et b ≤ n - 1 , k est un élément de Z n 2 ; en fait, k ≤ ( n - 1 ) ⋅ n + ( n - 1 ) = n deux - 1 .b=k%n / a≤n−1 b≤n−1 k Zn2 k≤(n−1)⋅n+(n−1)=n2−1
Comme indiqué ci-dessus, si et n sont des coprimes, il y aura un unique b tel que a ⋅ ba n b , c'est-à-dire qu'il y aura un unique k tel que k / n = a et k / n ⋅ ka⋅b%n=1 k k/n=a , la liste produite contiendra une seule fois.k/n⋅k%n=(k/n)⋅(k%n)%n=1 a
A l' inverse, si et n sont pas coprime, la condition k / n ⋅ ka n sera faux pour toutes les valeurs de k telles que a = k / n , de sorte que la liste généréenecontiendrapas a .k/n⋅k%n=1 k a=k/n a
Cela prouve que la liste des lambda déclarations contiennent tous de » Les premiers entre eux dans Z n exactement une fois.n Zn
la source
Gelée , 4 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
gRỊT
ÐṂ
) afin d'obtenir 3 octets .Mathematica, 25 octets
Format de sortie légèrement étrange, où chaque résultat est encapsulé dans une liste séparée, par exemple
{{1}, {3}, {7}, {9}}
. Si cela ne vous convient pas, j'ai deux solutions à 30 octets:Mathematica l'a fait
CoprimeQ
mais c'est beaucoup trop long.la source
Q
dire dedansCoprimeQ
?EvenQ
,PrimeQ
ouSubsetQ
.2sable , 4 octets
Code:
Explication:
Utilise le codage CP-1252 . Essayez-le en ligne!
la source
Python,
938274 octetsf
vérifie récursivement les coprimes, et le second lambda les génère. Affiche une liste.la source
En fait , 8 octets
Essayez-le en ligne!
Explication:
la source
range(1, n)
si cela économise des octets.R
(range(1, n+1)
) etr
(range(n)
). Comme ils sont équivalents, j'ai choisiR
(car j'ai accidentellement appuyé sur la touche majuscule lors de l'écriture du code).MATL , 7 octets
Essayez-le en ligne!
la source
MATLAB / Octave, 22 octets
Essayez-le en ligne!
la source
JavaScript (ES6),
6461 octets3 octets sauvegardés grâce à @ user81655
Extrait de test
la source
a==
aveca<2
?a
pourrait être 0 à un moment donné. Je vais devoir vérifierfilter
pour supprimer le besoin de recevoir unb
paramètre:...keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))
Méduse ,
19 à18 octetsCela fonctionne en calculant la factorisation première de chaque nombre dans la plage et en vérifiant si elle recoupe celle de l'entrée (Jellyfish n'a pas encore de gcd intégré). Pour des raisons de golf, la sortie est dans l'ordre décroissant. Essayez-le en ligne!
Explication
Tout d'abord,
i
est évalué l'entrée; pour l'entrée10
, la valeur de lai
-cell est10
.Ici
r
(plage) est appliqué à l'entrée et 1. Comme l'entrée est supérieure à 1, la plage est dans l'ordre décroissant; pour l'entrée10
, cela donne[9 8 7 6 5 4 3 2 1]
.Cette partie est une grande fonction, qui est évaluée sur
i
et la plage ci-dessus.Intersection (
n
) des facteurs premiers (x
).Est-ce vide? (
N
)Fil au niveau 0, testant pour chaque élément de la gamme.
Filtrer (
#
) la plage par rapport à cette liste de booléens. La fonction produite par[
veut utiliser l'argument à#
comme son propre argument, nous avons doncB
bloqué l'#
obtention de tous les arguments. Sinon, la valeur de~
-cell serait utilisée comme argument de la grande fonction. Enfin,p
affiche le résultat.la source
Empilé, non compétitif,
2421 octetsSauvé 3 octets, inspiré par le rubis de Borsunho . (
1 eq
à2<
)Essayez-le ici!
C'est un n-lambda qui prend un seul argument et donne le tableau.
la source
keep
ne fonctionnait pas bien.CJam , 14 octets
Essayez-le en ligne!
Explication
Nous n'avons pas besoin de vérifier tous les diviseurs possibles de
a
etb
de vérifier s'ils sont coprimes. Il suffit de regarder si l'un des facteurs premiers desb
divisionsa
.la source
Mathematica, 26 octets
la source
Perl 6 , 20 octets
la source
Brachylog ,
16 à13 octetsC'est une fonction qui prend N en entrée et génère tous les entiers inférieurs et égaux à celle-ci.
Essayez-le en ligne! Comme souvent dans Brachylog, un code supplémentaire a été ajouté pour que la fonction devienne un programme complet. L'interprète de Brachylog, s'il reçoit une fonction plutôt qu'un programme complet, l'exécutera mais n'imprimera pas la sortie, ce qui signifie que vous ne pouvez pas vraiment en observer le fonctionnement.
Explication:
Un programme Brachylog est une chaîne de contraintes; généralement, le LHS d'une contrainte est le RHS de la suivante.
Détruit trois personnages en réalisant qu'il n'y a aucune raison de vérifier si le facteur commun (qui est déjà connu pour être un facteur premier de la sortie) est un facteur premier de l'entrée. Nous savons déjà que c'est primordial, alors nous pouvons simplement vérifier si c'est un facteur. Je suis agréablement surpris par le
:A*?
fait que l'interprète n'est pas envoyé dans une boucle infinie et ne permet pas une valeur non entière pour A , mais si l'interprète fait ce que je veux, je le prendrai.la source
Dyalog APL, 10 octets .
Explication (entrée
n
):la source
⍨
Japt
-f
,9852 octetsL'essayer
la source
o f_jU
j
peut également être utilisé pour tester si 2 nombres sont co-premiers.Mathematica, 33 octets
Contient U + F4A1
la source
Haskell, 27 octets
Essayez-le en ligne!
la source
Julia 0.5 , 23 octets
Essayez-le en ligne!
la source
mèmes , 11 octets non concurrents , obsolètes
L'itération de STDIN non concurrente est nouvelle. Utilise le codage UTF-8.
Explication:
}
accède au prochain élément d’entrée, mais la dernière entrée est bouclée lorsqu’elle est donnée, l’entrée6
sera alors6 6 6 6 6 ...
identique à celle de STDIN, ce qui permettra de lire deux sorties à la fois.la source
05AB1E , 3 octets
Essayez-le en ligne!
A de nouvelles fonctionnalités.
la source
Ruby,
3634Certes, cette réponse n’est pas très inspirée .
2 octets économisés grâce à Conor O'Brien.
la source
(n)
Python 3 , 60 octets
Importe gcd au lieu d’écrire un nouveau lambda. Les suggestions de golf sont les bienvenues. Essayez-le en ligne!
la source
Julia, 30 octets
Fonction anonyme.
filter
supprime les éléments d'une liste qui ne sont pas conformes à une fonction.Dans ce cas, la fonction est
x->(gcd(n,x)<2)
(true si le gcd de l'entrée et l'élément de liste sont inférieurs à 2). La liste est la gamme1:n
.la source
PARI / GP , 27 octets
Ceci utilise la notation de jeu introduite dans la version 2.6.0 (2013). Dans les versions précédentes, quatre octets supplémentaires étaient nécessaires:
serait nécessaire.
la source
[1..n]
), vérifiez si gcd est égal à 1 (gcd(n,k)<2
), renvoyez les nombres avec cette propriété. La->
notation est fonction / fermeture, plus courte de 2 octets que la syntaxe normale de la fonction et[...|...<-...,...]
correspond à la notation de l'ensemble expliquée dans la réponse (voir la section 2.3.14 dans le manuel d'utilisation, ou recherchez<-
).05AB1E , 4 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
C (gcc) , 54 octets
Ceci est un portage de ma réponse en Python .
Essayez-le en ligne!
la source
Pyth , 5 octets
Essayez-le en ligne!
Comment ça fonctionne
Notez que Pyth utilise l'indexation 0.
la source