Coprimes jusqu'à N


51

Étant donné un nombre n >= 2, indiquez tous les entiers positifs inférieurs à ngcd(n, k) == 1(avec kl'un des nombres en sortie). Les nombres de ce type sont coprimes les uns aux autres.

Exemple: 10donne 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.


Les chaînes séparées (par exemple 1\n3\n) comptent-elles comme une sortie valide?
devRicher

@devRicher cela fonctionne, bien sûr.
Rɪᴋᴇʀ

L'intuition qu'il y a un nombre infini de nombres supérieurs à n coprime à n me semble correcte. Il y a une infinité de nombres premiers, et un nombre premier serait égal à chaque nombre inférieur. Par conséquent, chaque nombre premier supérieur à n (il en existe un nombre infini) fait également partie de la liste des coprimes.
Brian J

@BrianJ Pas seulement ça. Si c et n sont des coprimes, c + kn et n sont également des coprimes, pour tous les entiers k .
Dennis

1
Fait amusant: on les appelle des totaux .
Wojowu

Réponses:


17

Gelée , 3 octets

gÐṂ

Essayez-le en ligne!

Comment cela marche-t-il?

gÐṂ - (Monadic) Programme complet.

g - Le plus grand commun diviseur.
 - Conserve les éléments avec une valeur de lien minimale (c'est-à-dire ceux avec GCD == 1)
       Notez que cela crée automatiquement la plage [1, entrée] (incluse).

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):

  1. [1,input]1 1gcd(1,x)=1xZ1

  2. 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,yZy=x+1kkxky

    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(yx)k(x+1x)k111


2
Vous avez dépassé Dennis dans sa propre langue après 9 mois!
Adám

@ Adám, je ne suis pas sûr s'il ÐṂexistait à l'époque, de toute façon je suis assez satisfait de celui-ci.
M. Xcoder le

2
Pour mémoire, DṂexistait, mais cela ne fonctionnait que pour les monades. Les comi mis en œuvre Þ, ÐṂ, ÐṀpour dyades est daté du 9 mai 2017.
Dennis

@ Dennis Je savais qu'il y aurait une bonne raison pour laquelle vous n'aviez pas la version 3 octets. Nous nous interrogions aussi sur ce sujet, alors merci pour ces informations utiles!
M. Xcoder

56

Python 2 , 61 47 octets

lambda n:[k/n for k in range(n*n)if k/n*k%n==1]

Essayez-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)nZn={0,,n1} et, oùdésignent les opérateurs habituels d'addition, de multiplication et de modulo sur les entiers.a+nb=(a+b)%n+ ,anb=ab%n+,, and %

Deux éléments et de sont appelés inverses multiplicatifs mutuels modulo si . Notez que lorsque .abZnnanb=1%n1%n=1n>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>1anZnanx=anyxyZn . Cela implique que un ( x - y )ax%n=ay%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(xy)%n=ax%nay%n=0na(xy)na(xy)nanxyn<xy<nx=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 .an0,,an(n1)ZnZnn1 bZnanb=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>1aZnnppapnanbanb=1 et donc ( a b - 1 )ab%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(ab1)%n=ab%n1=0nab1papabpnpab1p(ab)(ab1)=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.an

  • admet un inverse multiplicatif modulo n .an

  • admet ununiqueinverse multiplicatif modulo n .an

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 = kabZnk:=an+babknka=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/an1bn1kZn2k(n1)n+(n1)=n21

Comme indiqué ci-dessus, si et n sont des coprimes, il y aura un unique b tel que a banb , c'est-à-dire qu'il y aura un unique k tel que k / n = a et k / n kab%n=1kk/n=a , la liste produite contiendra une seule fois.k/nk%n=(k/n)(k%n)%n=1a

A l' inverse, si et n sont pas coprime, la condition k / n kan sera faux pour toutes les valeurs de k telles que a = k / n , de sorte que la liste généréenecontiendrapas a .k/nk%n=1ka=k/na

Cela prouve que la liste des lambda déclarations contiennent tous de » Les premiers entre eux dans Z n exactement une fois.nZn


26
"GCD? Où nous allons, nous n'avons pas besoin de GCD."
Rɪᴋᴇʀ

1
Woah. C'est tout ce que je voulais écrire, mais apparemment, j'avais besoin de 15 caractères. Encore, woah. Bon travail.
Eric Lagergren

24

Gelée , 4 octets

gRỊT

Essayez-le en ligne!

Comment ça fonctionne

gRỊT  Main link. Argument: n

 R    Range; yield [1, ..., n].
g     Compute the GCD of n and each k in [1, ..., n].
  Ị   Insignificant; return 1 for GCDs less or equal to 1.
   T  Truth; yield the indices of all truthy elements.

33
Le codage dans cette langue prend un peu de tempsgRỊT
ETHproductions

1
J'ai réussi à (ab) utiliser la "valeur minimale du lien" quick ( ÐṂ) afin d'obtenir 3 octets .
M. Xcoder le

14

Mathematica, 25 octets

Range@#~GCD~#~Position~1&

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:

Select[Range[x=#],#~GCD~x<2&]&
#&@@@Range@#~GCD~#~Position~1&

Mathematica l'a fait CoprimeQmais c'est beaucoup trop long.


1
Que veut Qdire dedans CoprimeQ?
Conor O'Brien

2
@ "ConorO'Brien" question "je suppose. Tous les problèmes de décision intégrés se terminent par Q comme EvenQ, PrimeQou SubsetQ.
Martin Ender

10

2sable , 4 octets

Code:

ƒN¿–

Explication:

ƒ       # For N in the range [0, input]..
 N¿     #   Compute the GCD of N and the input
   –    #   If 1, print N with a newline

Utilise le codage CP-1252 . Essayez-le en ligne!


Bon travail (presque) battre Dennis. (quelques minutes de retard cependant).
Zacharý

10

Python, 93 82 74 octets

f=lambda a,b:f(b,a%b)if b else a<2
lambda c:[i for i in range(c)if f(i,c)]

fvérifie récursivement les coprimes, et le second lambda les génère. Affiche une liste.


7

En fait , 8 octets

;╗R`╜┤`░

Essayez-le en ligne!

Explication:

;╗R`╜┤`░
  R`  `░  elements of range(1, n+1) where
;╗  ╜     n and the element
     ┤    are coprime

1
Je crois que vous pouvez le faire range(1, n)si cela économise des octets.
ETHproductions

1
@ETHproductions Ce n'est pas le cas. Les deux options sont R( range(1, n+1)) et r( range(n)). Comme ils sont équivalents, j'ai choisi R(car j'ai accidentellement appuyé sur la touche majuscule lors de l'écriture du code).
Mego

Oui, c'est ce que j'ai pensé. Je n'ai pas vu d'instruction qui semblait dédiée à l'incrémentation, mais je pensais qu'il y en avait peut-être une de toute façon
ETHproductions



6

JavaScript (ES6), 64 61 octets

3 octets sauvegardés grâce à @ user81655

n=>[...Array(n).keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))

Extrait de test

f=n=>[...Array(n).keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))

for(var i = 2; i < 50; i++) console.log(i + ":", `[${ f(i) }]`);


Tu ne peux pas échanger a==avec a<2?
Rɪᴋᴇʀ

@EasterlyIrk Pas sûr, apourrait être 0 à un moment donné. Je vais devoir vérifier
ETHproductions

Vous pouvez déplacer la fonction GCD dans le filterpour supprimer le besoin de recevoir un bparamètre:...keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))
user81655

@ user81655 C'est génial, merci! :-)
ETHproductions

6

Méduse , 19 à 18 octets

p
[#
`B
&~xr1
NnEi

Cela 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, iest évalué l'entrée; pour l'entrée 10, la valeur de la i-cell est 10.

r1
i

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ée 10, cela donne [9 8 7 6 5 4 3 2 1].

[#
`B
&~x
Nn

Cette partie est une grande fonction, qui est évaluée sur iet la plage ci-dessus.

~x
n

Intersection ( n) des facteurs premiers ( x).

&~x
Nn

Est-ce vide? ( N)

`
&~x
Nn

Fil au niveau 0, testant pour chaque élément de la gamme.

[#
`B
&~x
Nn

Filtrer ( #) la plage par rapport à cette liste de booléens. La fonction produite par [veut utiliser l'argument à #comme son propre argument, nous avons donc Bbloqué l' #obtention de tous les arguments. Sinon, la valeur de ~-cell serait utilisée comme argument de la grande fonction. Enfin, paffiche le résultat.


5

Empilé, non compétitif, 24 21 octets

Sauvé 3 octets, inspiré par le rubis de Borsunho . ( 1 eqà 2<)

{!n:>1+:n gcd 2<keep}

Essayez-le ici!

C'est un n-lambda qui prend un seul argument et donne le tableau.

{!n:>1+:n gcd 2<keep}
{!                  }  n-lambda
  n                    push n
   :>                  range [0, n)
     1+                range [1, n]
       :               duplicate
        n gcd          element-wise gcd with n
              2<       element-wise equality with 1
                       this yields the range [1, n] and a boolean mask of coprime numbers
                keep   then, we simply apply the mask to the range and keep coprimes.

Pourquoi est-ce non compétitif?
Zacharý

@ZacharyT principalement, keepne fonctionnait pas bien.
Conor O'Brien

5

CJam , 14 octets

{:X{Xmff%:*},}

Essayez-le en ligne!

Explication

Nous n'avons pas besoin de vérifier tous les diviseurs possibles de aet bde vérifier s'ils sont coprimes. Il suffit de regarder si l'un des facteurs premiers des bdivisions a.

:X     e# Store the input in X.
{      e# Filter the list [0 1 ... X-1] by the results of this block...
  Xmf  e#   Get the prime factors of X.
  f%   e#   Take the current value modulo each of those prime factors.
  :*   e#   Multiply the results. Iff any of them divide the current
       e#   value, there's a 0 in the list, and the result of the product
       e#   is also 0, dropping the value from the resulting list.
},

5

Mathematica, 26 octets

Pick[r=Range@#,r~GCD~#,1]&

1
Ohhhh, je cherchais quelque chose comme Pick. Je suppose que maintenant je suis content de ne pas l'avoir trouvé, cependant. ;) Mais cela devrait être très utile pour les défis futurs.
Martin Ender


4

Brachylog , 16 à 13 octets

>.$p'(e:A*?),

C'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.

>.$p'(e:A*?),
>              The input is greater than
 .             the output, whose
  $p           prime factorisation does
    '(     )   not obey the following constraint:
      e        it has an element which
       :A*     can be multiplied by something to
          ?    produce the input.
            ,  (This comma turns off an unwanted implicit constraint.)

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.


4

Dyalog APL, 10 octets .

0~⍨⍳×1=⊢∨⍳

Explication (entrée n):

0~⍨⍳×1=⊢∨⍳
         ⍳ - 1 ... n (Thus, ⎕IO is 1)
       ⊢∨  - Each GCD'd by n
     1=    - Test equality with 1 on each element
   ⍳×      - multiplied by its index
0~⍨        - without 0.

3
J'aime la façon dont le code APL ressemble au visage que vous créez lorsque vous le lisez.
DJMcMayhem

Oui, et il démolit presque tous les langages qui ne sont pas orientés code-golf. :)
Zacharý

Pourquoi seulement "pourrait" fonctionner?
Rɪᴋᴇʀ

Je vais juste supposer que ça marche.
Zacharý

@ZacharyT pourquoi ne pouvez-vous pas le tester? Lorsque je le colle dans try-apl.org, il génère une erreur avec un jeton invalide.
Rɪᴋᴇʀ

4

Japt -f , 9 8 5 2 octets

jN

L'essayer

  • 2 octets sauvegardés grâce à l' ETH indiquant un brainfart, ce qui a conduit à la création d'un autre octet.

Vous pourriez faireo f_jU
ETHproductions

Merci, @ETHproductions. Je ne sais pas ce que je pensais ici! Doit avoir été l'un de ces (nombreux) moments où j'oublie jpeut également être utilisé pour tester si 2 nombres sont co-premiers.
Shaggy

3

Mathematica, 33 octets

xSelect[Range@x,x~CoprimeQ~#&]

Contient U + F4A1


Qu'est-ce que l'imprimable fait?
Rɪᴋᴇʀ

3
@EasterlyIrk introduit une fonction non nommée avec un argument nommé. c'est rendu comme une flèche dans Mma.
Martin Ender

@ MartinEnder oh, cool.
Rɪᴋᴇʀ

U + F4A1 est un caractère à usage privé. Comme l'a dit Martin, il s'agit d'une flèche dans Mathematica.
Zacharý



3

mèmes , 11 octets non concurrents , obsolètes

L'itération de STDIN non concurrente est nouvelle. Utilise le codage UTF-8.

d`}}]i=1?ip

Explication:

d     Set program to not output result
`}    Loop next input-times
}]i   GCD of input and loop index
=1?   Is it equal to 1? If yes,
ip    Print out loop index

}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ée 6sera alors 6 6 6 6 6 ...identique à celle de STDIN, ce qui permettra de lire deux sorties à la fois.


Vous venez de créer ce langage aujourd'hui? Si c'est fait avant le défi, il doit être non compétitif.
Rɪᴋᴇʀ

@EasterlyIrk Il a été créé il y a 3 jours, je travaille constamment dessus. Aussi, je suppose que vous voulez dire après ?
devRicher

Oui, typo merci. Et ce n'est pas grave, à condition que les fonctionnalités utilisées dans la réponse et plus vieux que le défi.
Rɪᴋᴇʀ

@EasterlyIrk Je vois, dans ce cas, je vais devoir modifier ma réponse.
devRicher

Ouais désolé. : /
Rɪᴋᴇʀ


2

Ruby, 36 34

->n{n.times{|i|p i if i.gcd(n)<2}}

Certes, cette réponse n’est pas très inspirée .

2 octets économisés grâce à Conor O'Brien.


Vous pouvez supprimer deux octets en supprimant les parenthèses(n)
Conor O'Brien

2

Python 3 , 60 octets

Importe gcd au lieu d’écrire un nouveau lambda. Les suggestions de golf sont les bienvenues. Essayez-le en ligne!

import math
lambda c:[i for i in range(c)if math.gcd(c,i)<2]

Je ne pense pas que vous puissiez jouer au golf autant. L'importation directe de gcd ou math en tant que m ajoute des octets.
Rɪᴋᴇʀ

2

Julia, 30 octets

n->filter(x->(gcd(n,x)<2),1:n)

Fonction anonyme. filtersupprime 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 gamme 1:n.


2

PARI / GP , 27 octets

n->[k|k<-[1..n],gcd(k,n)<2]

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:

n->select(k->gcd(k,n)<2,[1..n])

serait nécessaire.


Comment cela marche-t-il?
Rɪᴋᴇʀ

1
@EasterlyIrk Identique à la plupart de ces soumissions - définissez une plage de 1 à n ( [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 <-).
Charles



1

Pyth , 5 octets

x1iLQ

Essayez-le en ligne!

Comment ça fonctionne

Notez que Pyth utilise l'indexation 0.

x1iLQ   Q = eval(input())

x1iLQQ  implicit Q at the end
  iLQQ  [gcd(Q,0), gcd(Q,1), ..., gcd(Q,Q-1)]
x1      all occurences of 1 in the above list (return their indices)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.