Coprimes até N


51

Dado um número n >= 2, produza todos os números inteiros positivos menores que nonde gcd(n, k) == 1(com kqualquer um dos números de saída). Números desse tipo são coprime entre si.

Exemplo: 10fornece a saída [1, 3, 7, 9](de qualquer forma que você quiser, desde que os números sejam separados sem ambiguidade e em algum tipo de lista). A lista não pode ter entradas duplicadas e não precisa ser classificada.

Mais casos de teste:

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]

Também não estamos contando números acima dos nque são coprime n, apenas porque estou bastante certo de que existem infinitas soluções.

Observe também: os números que são coprime entre si também são considerados relativamente primos ou mutuamente primos entre si.


Seqüências separadas (por exemplo 1\n3\n) contam como saída válida?
devRicher

@devRicher que funciona, com certeza.
Rɪᴋᴇʀ

A intuição de que existe um número infinito de números acima de n que são coprime para n parece correta para mim. Existem infinitos primos, e um primo seria coprime com todos os números abaixo dele. Portanto, todos os primos maiores que n (dos quais existem infinitos) também fazem parte da lista de coprimes.
Brian J

@BrianJ Não é só isso. Se c e n são coprimes, c + kn e n também são coprimes, para todos os números inteiros k .
Dennis

11
Curiosidade: são chamados de totativos .
Wojowu

Respostas:


17

Gelatina , 3 bytes

gÐṂ

Experimente online!

Como é que isso funciona?

gÐṂ - (Monadic) Programa completo.

g - Maior divisor comum.
 Keep - Mantenha os elementos com valor mínimo de link (ou seja, aqueles com GCD == 1)
       Observe que isso cria automaticamente o intervalo [1, entrada] (inclusive).

Prova de validade

Desde que nós queremos extrair apenas os coprimes, o valor mínimo da lista Maior-Common-Divisores tem que ser 1 para o ÐṂtruque para o trabalho. Vamos provar que (em dois métodos diferentes):

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

  2. Dois números inteiros positivos consecutivos são sempre coprime. Considere , com . Então tomamos outro número inteiro positivo modo que e .x,yZy=x+1kkxky

    Isso implica que , então , portanto, . O único número inteiro positivo a dividir é o próprio , por isso é garantido que apareça na lista e sempre será o valor mínimo.k ( x + 1 - x ) k 1 1 1k(yx)k(x+1x)k111


2
Você derrotou Dennis em seu próprio idioma após 9 meses!
Adám 28/09

@ Adám Não tenho certeza se ÐṂexistia naquela época, de qualquer forma, estou bastante satisfeito com este.
Sr. Xcoder

2
Para o registro, DṂexistia, mas só funcionava para mônadas. O commit implementado Þ, ÐṂ, ÐṀpara díades é datado 09 de maio de 2017.
Dennis

@ Dennis Eu sabia que haveria uma boa razão para você não ter a versão de 3 bytes. Também estávamos nos perguntando sobre isso no bate-papo, então obrigado pelas informações úteis!
Xcoder

56

Python 2 , 61 47 bytes

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

Experimente online!

fundo

Considere o anel . Embora esse anel seja geralmente definido usando as classes de resíduos módulo n , também pode ser considerado o conjunto Z n = { 0 , , n - 1 } , onde os operadores de adição e multiplicação são definidos por a + n b = ( a + b )(Zn,+n,n)nZn={0,,n1} e a n b = a ba+nb=(a+b)%n , onde + ,anb=ab%n denotam os operadores usuais de adição, multiplicação e módulo sobre os números inteiros.+,, and %

Dois elementos e b de Z n são chamados inversos multiplicativos mútuos módulo n se a n b = 1abZnn . Note que 1anb=1%n sempre que n > 1 .1%n=1n>1

Corrija e deixe a ser um coprime de n em Z n . Se um n x = um n y por dois elementos de x e y de Z n , temos que um xn>1anZnanx=anyxyZn . Isso implica que a ( x - y )ax%n=ay%n , e seguimos que n a ( x - y ) , ou seja, n divide a ( x - y ) igualmente. Como n não compartilha divisores primos com a , isso significa que n x - y . Finalmente, porque - n < x - y < n , concluímos que x = y . Isso mostra que os produtos de uma a(xy)%n=ax%nay%n=0na(xy)na(xy)nanxyn<xy<nx=y são todos elementos diferentes de Z n . Como Z n tem exatamente n elementos, um (e exatamente um) desses produtos deve ser igual a 1 , ou seja, existe um b exclusivoem Z n de modo que a n b = 1 .an0,,an(n1)ZnZnn1 bZnanb=1

Por outro lado, corrija e deixe a ser um elemento de Z n que não é coprime para n . Nesse caso, existe um primo p tal que p a e p n . Se um admitido um módulo inverso multiplicativo n (vamos chamá-lo de b ), teríamos que a n b = 1 , significando que a bn>1aZnnppapnanbanb=1 e, portanto, ( a b - 1 )ab%n=1 , então n a b - 1 . Desde p a , seguimos que p a b . Por outro lado, desde p n , seguimos também p a b - 1 . Dessa forma, p ( a b ) - ( a b - 1 ) = 1(ab1)%n=ab%n1=0nab1papabpnpab1p(ab)(ab1)=1, o que contradiz a suposição de que é um número primo.p

Isso prova que as seguintes instruções são equivalentes quando .n>1 1

  • e n são coprime.uman

  • admite um módulo inverso multiplicativo n .uman

  • admite umúnicomódulo inverso multiplicativo n .uman

Como funciona

Para cada par de números inteiros e b em Z n , o número inteiro k : = um n + b é única; de facto, um e b são quociente e o resto de k dividido por n , isto é, dada k , que podem recuperar um = k / n e b = kumabZnk: =uman+bumabknkuma=k/n , onde / denotadivisãointeira. Finalmente, uma vez que um n - 1 e b n - 1 , k é um elemento de Z n 2 ; de fato, k ( n - 1 ) n + ( n - 1 ) = n 2 - 1 .b=k%n/uman-1 1bn-1 1kZn2k(n1)n+(n1)=n21

Como observado acima, se e n forem coprime, haverá um b único, de modo que a banb , ou seja, haverá um k únicoque k / n = a e k / n kab%n=1kk/n=a , então a lista gerada conterá uma exatamente uma vez.k/nk%n=(k/n)(k%n)%n=1a

Por outro lado, se e n não são coprime, a condição k / n kan será falso para todos os valores de k, de modo que a = k / n , portanto, a lista geradanãoconterá a .k/nk%n=1ka=k/na

Isto prova que a lista dos lambda retorna irá conter todos 's coprimes em Z n exactamente uma vez.nZn


26
"GCD? Para onde vamos, não precisamos do GCD."
Rɪᴋᴇʀ

11
Woah. Era tudo o que queria escrever, mas aparentemente precisava de 15 caracteres. Ainda assim, woah. Bom trabalho.
Eric Lagergren

24

Gelatina , 4 bytes

gRỊT

Experimente online!

Como funciona

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
A codificação neste idioma leva um poucogRỊT
ETHproductions

11
Consegui (ab) usar o "Valor mínimo do link" quick ( ÐṂ) para obter 3 bytes .
Mr. Xcoder

14

Mathematica, 25 bytes

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

Formato de saída ligeiramente estranho, onde cada resultado é agrupado em uma lista separada, por exemplo {{1}, {3}, {7}, {9}}. Se não estiver certo, tenho duas soluções em 30 bytes:

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

O Mathematica realmente tem, CoprimeQmas é muito longo.


11
O que Qsignifica CoprimeQ?
Conor O'Brien

2
@ ConorO'Brien "pergunta" eu acho. Todos os problemas internos de decisão terminam em Q como EvenQ, PrimeQou SubsetQ.
Martin Ender

10

2sable , 4 bytes

Código:

ƒN¿–

Explicação:

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

Usa a codificação CP-1252 . Experimente online!


Bom trabalho (quase) derrotando Dennis. (alguns minutos atrasado).
Zacharý

10

Python, 93 82 74 bytes

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

frecursivamente verifica coprimes, e o segundo lambda os gera. Mostra uma lista.


7

Na verdade , 8 bytes

;╗R`╜┤`░

Experimente online!

Explicação:

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

11
Eu acredito que você pode fazer range(1, n)se isso salva alguns bytes.
ETHproductions

11
@ETHproductions Não. As duas opções são R( range(1, n+1)) e r( range(n)). Como eles são equivalentes, eu escolhi R(desde que bati acidentalmente em caps lock enquanto escrevia o código).
Mego

Sim, foi o que eu imaginei. Eu não vi uma instrução que parecia dedicado a incrementar, mas eu pensei que poderia ter sido um de qualquer maneira
ETHproductions



6

JavaScript (ES6), 64 61 bytes

Guardado 3 bytes graças a @ user81655

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

Snippet de teste

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) }]`);


Você não pode trocar a==com a<2?
Rɪᴋᴇʀ

@EasterlyIrk Não tenho certeza, apode ser 0 em algum momento. Vou ter que verificar
ETHproductions

Você pode mover a função GCD para o filterpara remover a necessidade de receber um bparâmetro:...keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))
user81655

@ user81655 Isso é ótimo, obrigado! :-)
ETHproductions

6

Água-viva , 19 18 bytes

p
[#
`B
&~xr1
NnEi

Isso funciona calculando a fatoração primária de cada número no intervalo e verificando se ele cruza o da entrada (o Jellyfish ainda não possui um gcd). Por razões de golfe, a saída está em ordem decrescente. Experimente online!

Explicação

Primeiro, ié avaliada a entrada; para entrada 10, o valor da icélula é 10.

r1
i

Aqui r(intervalo) é aplicado à entrada e 1. Como a entrada é maior que 1, o intervalo está em ordem decrescente; para entrada 10, isso dá [9 8 7 6 5 4 3 2 1].

[#
`B
&~x
Nn

Esta parte é uma grande função, avaliada na ifaixa acima.

~x
n

Interseção ( n) de fatores primos ( x).

&~x
Nn

Está vazio? ( N)

`
&~x
Nn

Passe para o nível 0, testando para cada elemento do intervalo.

[#
`B
&~x
Nn

Filtre ( #) o intervalo em relação a esta lista de booleanos. Como a função produzida por [deseja usar o argumento #como seu próprio argumento, colocamos um Bbloco #para evitar qualquer argumento. Caso contrário, o valor da ~célula-seria usado como argumento da grande função. Por fim, pimprime o resultado.


5

Empilhados, não concorrentes, 24 21 bytes

Economizou 3 bytes, inspirado no rubi de Borsunho . ( 1 eqpara 2<)

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

Experimente aqui!

Este é um n-lambda que pega um único argumento e gera a matriz.

{!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.

Por que isso não é competitivo?
Zacharý

@ZacharyT principalmente, keepnão estava funcionando bem.
Conor O'Brien

5

CJam , 14 bytes

{:X{Xmff%:*},}

Experimente online!

Explicação

Não precisamos verificar todos os divisores possíveis ae btestar se são coprimes. É suficiente verificar se algum dos principais fatores das bdivisões 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 bytes

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

11
Ohhhh, eu tenho procurado algo como Pick. Acho que agora estou feliz por não ter encontrado. ;) Mas deve ser muito útil para desafios futuros.
Martin Ender


4

Braquilog , 16 13 bytes

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

Esta é uma função que recebe N como entrada e gera todos os números inteiros menores que e coprime para ela.

Experimente online! Como costuma ser o caso do Brachylog, esse código adicional foi adicionado para transformar a função em um programa completo; O intérprete de Brachylog, se receber uma função em vez de um programa completo, executará, mas não imprimirá a saída, o que significa que você não pode realmente observar o funcionamento.

Explicação:

Um programa Brachylog é uma cadeia de restrições; normalmente, o LHS de uma restrição é o RHS da próxima.

>.$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.)

Golpeou três caracteres ao perceber que não há razão para verificar se o fator comum (que já é conhecido como um fator primordial da saída) é um fator primordial da entrada. Já sabemos que é excelente, então podemos apenas verificar se é um fator. Estou agradavelmente surpreendido aqui que :A*?não envia o intérprete para um loop infinito e não permite um valor não inteiro para A , mas como o intérprete faz o que eu quero, eu aceito.


4

Dyalog APL, 10 bytes .

0~⍨⍳×1=⊢∨⍳

Explicação (entrada 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
Adoro a maneira como o código APL se parece com o rosto que você faz quando o lê.
DJMcMayhem

Sim, e destrói quase toda linguagem não orientada para o código de golfe. :).
Zachary

Por que apenas "pode" funcionar?
Rɪᴋᴇʀ

Eu apenas vou assumir que funciona.
Zachary

@ZacharyT por que você não pode testá-lo? Quando colo no try-apl.org, ele erros com token inválido.
Rɪᴋᴇʀ

4

Japonês -f , 9 8 5 2 bytes

jN

Tente

  • 2 bytes salvos graças ao ETH apontando um peido cerebral, o que levou a outro byte salvo.

Você poderia fazero f_jU
ETHproductions

Obrigado, @ETHproductions. Não sei o que eu estava pensando aqui! Deve ter sido um daqueles (muitos) momentos em que esqueço jque também pode ser usado para testar se dois números são co-primos.
Shaggy

3

Mathematica, 33 bytes

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

Contém U + F4A1


O que o imprimível faz?
Rɪᴋᴇʀ

3
O @EasterlyIrk apresenta uma função sem nome com um argumento nomeado. é renderizado como uma flecha no Mma.
Martin Ender

@MartinEnder oh, legal.
Rɪᴋᴇʀ

U + F4A1 é um caractere de uso privado. Como Martin disse, é renderizado como uma flecha no Mathematica.
Zacharý



3

memes , 11 bytes não concorrentes , desatualizado

Não competir, pois a iteração do STDIN é nova. Usa codificação UTF-8.

d`}}]i=1?ip

Explicação:

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

}acessa o próximo item de entrada, mas a última entrada é repetida quando fornecida, portanto a entrada 6resultará como 6 6 6 6 6 ...em STDIN, possibilitando a leitura de duas saídas de uma.


Você acabou de criar esse lang hoje? Se for feito antes do desafio, deve ser não competitivo.
Rɪᴋᴇʀ

@EasterlyIrk Foi feito há 3 dias, estou trabalhando constantemente nele. Além disso, eu suponho que você quis dizer depois ?
devRicher

Sim, erro de digitação, obrigado. E tudo bem, desde que os recursos usados ​​na resposta e mais antigos que o desafio.
Rɪᴋᴇʀ

@EasterlyIrk, nesse caso, terei que editar minha resposta.
devRicher

Sim, desculpe-me. : /
Re


2

Ruby, 36 34

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

É certo que esta não é uma resposta muito inspirada .

2 bytes salvos graças a Conor O'Brien.


Você pode cortar dois bytes removendo parênteses ao redor(n)
Conor O'Brien

2

Python 3 , 60 bytes

Importa o gcd em vez de escrever um novo lambda para ele. Sugestões de golfe são bem-vindas. Experimente online!

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

Eu não acho que você pode jogar mais isso. A importação de gcd diretamente ou matemática, como m, adiciona bytes.
Rɪᴋᴇʀ

2

Julia, 30 bytes

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

Função anônima. filterremove elementos de uma lista que não é verdadeira de acordo com uma função.

Nesse caso, a função é x->(gcd(n,x)<2)(true se o mcd da entrada e o elemento da lista for menor que 2). A lista é o intervalo 1:n.


2

PARI / GP , 27 bytes

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

Isso usa a notação de conjunto introduzida na versão 2.6.0 (2013). Nas versões anteriores, eram necessários mais quatro bytes:

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

seria necessário.


Como é que isso funciona?
Rɪᴋᴇʀ

11
@EasterlyIrk O mesmo que a maioria desses envios - faça um intervalo de 1 a n ( [1..n]), verifique se gcd é 1 ( gcd(n,k)<2), retorne os números com essa propriedade. A ->notação é função / fechamento, menor em 2 bytes que a sintaxe da função normal e [...|...<-...,...]é a notação definida explicada na resposta (consulte a seção 2.3.14 no Manual do Usuário ou procure <-).
Charles



1

Pitão , 5 bytes

x1iLQ

Experimente online!

Como funciona

Observe que o Pyth usa a indexação 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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.