fundo
A
função totiente de Eulerφ(n)
é definida como o número de números inteiros menor ou igual a n
que são relativamente primos para n
, ou seja, o número de valores possíveis de x
em 0 < x <= n
para o qual
gcd(n, x) == 1
. Nós tivemos
um
pouco totient - relacionados desafios
antes, mas nunca um que é apenas cálculo.
O mapeamento da função totiente para os números inteiros é OEIS A000010 .
Desafio
Dado um número inteiro n > 0
, calcule φ(n)
. Você pode receber informações por meio de argumentos de linha de comando, entrada padrão, argumentos de função ou qualquer outra coisa razoável. Você pode fornecer a saída por meio da saída padrão, valores de retorno ou qualquer outra coisa razoável. Funções anônimas são aceitáveis. Você pode presumir que a entrada não excederá o seu método natural de armazenar números inteiros, por exemplo, int
em C, mas você deve suportar entradas de até 255.
Se o seu idioma tiver uma função de orientação interna, você não poderá usá-lo.
Exemplos
φ(1) => 1
φ(2) => 1
φ(3) => 2
φ(8) => 4
φ(9) => 6
φ(26) => 12
φ(44) => 20
φ(105) => 48
A resposta mais curta em bytes vence. Se o seu idioma usa uma codificação diferente de UTF-8, mencione-a na sua resposta.
fonte
EulerPhi
Respostas:
Mathematica,
2722 bytesUma função sem nome que pega e retorna um número inteiro.
Não há muito a explicar aqui, exceto que
@
é a notação de prefixo para chamadas de função e~...~
é a notação de infixo (associativa à esquerda); portanto, o acima é o mesmo que:fonte
MATL, 7 bytes
Você pode TryItOnline . Idéia mais simples, faça um vetor de 1 a N e tire o MDC de cada elemento com N (
Zd
gcd). Em seguida, encontre quais elementos são iguais a 1 e some o vetor para obter a resposta.fonte
_Zp
para aqueles que se perguntam.J, 9 bytes
Isso é baseado no ensaio do Jsoftware sobre funções totientes.
Dado n = p 1 e 1 ∙ p 2 e dois ∙∙∙ p k e k onde p k é um factor primo de N , o φ função totiente ( n ) = φ ( p 1 e 1 ) ∙ φ ( p 2 e 2 ) φ p ( 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 .
Uso
Explicação
fonte
[:*/@({.(^-(^<:)){:)2&p:
precisa de 24 bytes, mesmo usando o built-in para obter os primos e seus expoentes. Ou talvez exista um caminho mais curto e eu não o veja.Gelatina, 4 bytes
Experimente online!
Explicação
Com built-in
Experimente online!
Explicação
fonte
Haskell, 28 bytes
Usa a correspondência de constantes de Haskell . Os truques aqui são bastante padrão para o golfe, mas vou explicar para o público em geral.
A expressão é
gcd n<$>[1..n]
mapeadagcd n
para[1..n]
. Em outras palavras, ele calcula ogcd
comn
de cada número a partir1
den
:A partir daqui, a saída desejada é o número de
1
entradas, mas Haskell não possui umacount
função. A maneira idiomáticafilter
de manter apenas1
's' e pegar o resultadolength
, que é muito longo para o golfe.Em vez disso, o
filter
é simulado por uma compreensão da lista[1|1<-l]
com a lista resultantel
. Geralmente, as compreensões de lista vinculam valores a variáveis como em[x*x|x<-l]
, mas Haskell permite comparar um padrão, neste caso a constante1
.Assim,
[1|1<-l]
gerando um1
em cada correspondência de1
, efetivamente extraindo apenas os1
da lista original. Invocásum
-lo dá o seu comprimento.fonte
Python 2, 44 bytes
Menos golfe:
Usa a fórmula que o Euler totients dos divisores de
n
tem uma soma den
:O valor de
ϕ(n)
pode então ser recursivamente calculado comon
menos a soma dos divisores não triviais. Efetivamente, isso está fazendo a inversão de Möbius na função de identidade. Eu usei o mesmo método em um golfe para calcular a função Möbius .Graças a Dennis para guardar um byte com um caso base melhor, espalhando-se o valor inicial de
+n
em+1
para cada uma dasn
ansas, feito como-~
.fonte
Pyke, 5 bytes
Experimente aqui!
fonte
J, 11 bytes
Uso
onde
>>
é STDIN e<<
STDOUT.Explicação
fonte
Python> = 3.5,
766458 bytesAgradecimentos a LeakyNun por jogar fora 12 (!) Bytes.
Agradecimentos ao Sp3000 por jogar fora 6 bytes.
Eu amo o quão legível é o Python. Isso faz sentido, mesmo através do golfe.
fonte
lambda n:sum(gcd(n,x)<2for x in range(n))
gcd
ao módulo de matemática! Eu não sabia disso.Regex (ECMAScript), 131 bytes
Pelo menos -12 bytes graças ao código morto (no chat)
Experimente online!
Saída é o comprimento da partida.
As expressões regulares ECMAScript tornam extremamente difícil contar qualquer coisa. Qualquer backref definido fora de um loop será constante durante o loop, qualquer backref definido dentro de um loop será redefinido durante o loop. Portanto, a única maneira de transportar o estado pelas iterações do loop é usando a posição de correspondência atual. Esse é um número inteiro único e só pode diminuir (bem, a posição aumenta, mas o comprimento da cauda diminui, e é para isso que podemos fazer contas).
Dadas essas restrições, simplesmente contar números de coprime parece impossível. Em vez disso, usamos a fórmula de Euler para calcular o totiente.
Veja como fica no pseudocódigo:
Há duas coisas duvidosas sobre isso.
Primeiro, não salvamos a entrada, apenas o produto atual; então, como podemos obter os principais fatores da entrada? O truque é que (N - (N / P)) tem os mesmos fatores primos> P que N. Ele pode ganhar novos fatores primos <P, mas nós os ignoramos de qualquer maneira. Observe que isso só funciona porque iteramos os fatores primos do menor para o maior, seguindo o caminho inverso.
Segundo, precisamos lembrar dois números nas iterações de loop (P e N, Z não conta, pois é constante), e eu apenas disse que era impossível! Felizmente, podemos misturar esses dois números em um único. Observe que, no início do loop, N sempre será um múltiplo de Z, enquanto P sempre será menor que Z. Assim, podemos apenas lembrar de N + P e extrair P com um módulo.
Aqui está o pseudo-código um pouco mais detalhado:
E aqui está o regex comentado:
E como um bônus ...
Regex (ECMAScript 2018, número de correspondências), 23 bytes
Experimente online!
Saída é o número de correspondências. O ECMAScript 2018 apresenta look-behind de comprimento variável (avaliado da direita para a esquerda), o que torna possível contar simplesmente todos os números de coprime com a entrada.
Acontece que esse é independentemente o mesmo método usado pela solução Retina da Leaky Nun , e o regex tem até o mesmo comprimento ( e é intercambiável ). Estou deixando aqui porque pode ser interessante que esse método funcione no ECMAScript 2018 (e não apenas no .NET).
fonte
Perl 6 ,
26 2422 bytesExplicação:
Exemplo:
fonte
Julia, 25 bytes
É simples - a
sum
função permite atribuir uma função a ser aplicada antes da soma - basicamente o equivalente a executarmap
e depoissum
. Isso conta diretamente o número de números relativamente primos menor quen
.fonte
Python 2, 57 bytes
Teste em Ideone .
fundo
Pela fórmula do produto de Euler ,
onde φ denota a função totiente de Euler ep varia apenas sobre os números primos.
Para identificar números primos, usamos um corolário do teorema de Wilson :
Como funciona
Em todos os momentos, a variável m será igual ao quadrado do fatorial de k - 1 . Na verdade, nós chamado argumentos padrão para k = 1 e m = 0! 2 = 1 .
Desde que k ≤ n ,
n*(k>n)
avalie como 0 e o código a seguiror
é executado.Lembre-se de que
m%k
produzirá 1 se m for primo e 0 se não. Isso significa quex%k<m%k
produzirá True se e somente se k for um número primo e x for divisível por k .Nesse caso,
(n%k<m%k)*n/k
gera n / k e subtrai-lo de n substitui seu valor anterior por n (1 - 1 / k) , como na fórmula do produto de Euler. Caso contrário,(n%k<m%k)*n/k
produz 0 e n permanece inalterado.Após calcular o acima, incrementamos k e multiplicamos m pelo valor "antigo" de k 2 , mantendo assim a relação desejada entre k e m , em seguida, chamamos f recursivamente com os argumentos atualizados.
Quando k excede n ,
n*(k>n)
avalia como n , que é retornado pela função.fonte
Ruby, 32 bytes
um lambda que pega um número inteiro n e retorna a contagem de quantos números inteiros no intervalo (1..n) são coprime com n.
fonte
Braquilog , 25 bytes
Explicação
O Brachylog ainda não possui um GCD, portanto, verificamos que os dois números não têm fatores primos em comum.
Predicado principal:
Predicado 1:
fonte
Pitão, 6 bytes
Experimente online!
Experimente online!
Explicação
fonte
PowerShell v2 +, 72 bytes
O PowerShell não tem uma função GCD disponível, então tive que usar minha própria.
Isso leva a entrada e
$n
, em seguida, varia de1
a$n
e canaliza essas para um loop|%{...}
. Cada iteração definimos duas variáveis auxiliares$a
e$b
em seguida, executar um GCDwhile
loop. Cada iteração estamos verificando que$b
ainda não é zero, e depois salvar$a%$b
a$b
e o valor anterior$b
para$a
para o próximo ciclo. Em seguida, acumulamos se$a
é igual a1
nossa variável de saída$o
. Depois que o loop for concluído, colocamos$o
no pipeline e a saída é implícita.Como um exemplo de como o
while
loop funciona, considere$n=20
e continuamos$_=8
. A primeira verificação tem$b=20
, então entramos no loop. Primeiro calculamos$a%$b
ou8%20 = 8
, que é definido ao$b
mesmo tempo em que20
é definido$a
. Verifique8=0
e entramos na segunda iteração. Em seguida, calculamos20%8 = 4
e configuramos isso como$b
, em seguida, definimos$a
como8
. Verifique4=0
e entramos na terceira iteração. Calculamos8%4 = 0
e configuramos isso para$b
, depois definimos$a
como4
. Verifique0=0
e saímos do loop, então o GCD (8,20) é$a = 4
. Assim,!($a-1) = !(4-1) = !(3) = 0
assim$o += 0
e não contamos essa.fonte
Fator, 50 bytes
Faz um intervalo ( iota ) n , e altera n para uma função que obtém gcd xn para todos os valores de 0 <= x <= n , testa se o resultado é 1 . Filtre o intervalo original se o resultado de gcd xn foi 1 e calcule o comprimento .
fonte
[ dup iota swap '[ _ gcd nip 1 = ] map sum ]
economiza 6 bytes (eu acho - não muito experiente com o fator).t/f
(símbolos) no Factor, portanto, a única maneira de implementar isso seria com[ dup iota swap '[ _ gcd nip 1 = 1 0 ? ] map sum ]
o mesmo comprimento exato da solução atual.TYPED:
no verdadeiro código Factor: PJaponês
-mx
,75 bytesExecute-o online
-2 bytes graças a Shaggy
fonte
-mx
.-m
solução, mas esqueci-x
. Obrigado!Retina,
3629 bytes7 bytes graças a Martin Ender.
Experimente online!
Explicação
Existem dois estágios (comandos).
Primeira etapa
É uma substituição simples de regex, convertendo a entrada para muitas.
Por exemplo,
5
seria convertido para11111
.Segundo estágio
Essa regex tenta corresponder as posições que satisfazem a condição (co-prime com entrada) e, em seguida, retorna o número de correspondências.
fonte
Lisp comum, 58 bytes
Este é um loop simples que conta 1 até o dado n e incrementa a soma se gcd = 1. Uso o nome da função o, pois t é o verdadeiro valor booleano. Não é o mais curto, mas é bastante simples.
fonte
MATLAB / oitava, 21 bytes
Cria uma função anônima chamada
ans
que pode ser chamada com o número inteiron
como a única entrada:ans(n)
Demo Online
fonte
Python 2 , 44 bytes
Ele usa o mesmo método para identificar coprimes que a minha resposta para "Coprimes até N" .
Experimente online!
fonte
n-1
vez de1
, o que o faz funcionarn==1
.JavaScript (ES6), 53 bytes
Experimente online!
fonte
Na verdade, 11 bytes
Experimente online!
Explicação
Com built-in
Experimente online!
fonte
;╗R`╜g1=`MΣ
a mesma contagem de bytesJavaScript (ES6), 67 bytes
fonte
05AB1E, 7 bytes
Explicado
Experimente online
fonte
L€¿1¢
;Lʒ¿}g
;L€¿ΘO
.APL, 7 bytes
Este é um trem de função monádica que leva um número inteiro à direita. A abordagem aqui é óbvia: soma (
+/
) o número de vezes que o GCD da entrada e os números de 1 à entrada (⊢∨⍳
) são iguais a 1 (1=
).Experimente aqui
fonte
Haskell,
3130 bytes1 byte salvo, graças a @Damien.
Seleciona valores com gcd = 1, mapeia cada um para 1 e assume a soma.
fonte
==1
por<2
Lote,
151145144 bytesEditar: salvou 4 bytes removendo espaços desnecessários. 1 byte salvo usando
+=
. Economizou 1 byte limpando,t
pois+=
o interpretará como de0
qualquer maneira. Guardou 1 byte graças a @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.fonte