Números alcançáveis


14

Definições

  • Função Phi de Euler ( função totiente AKA ): uma função que recebe um número positivo e retorna o número de números positivos menor que o número especificado, que são co-primos com um número determinado. É indicado como φ(n).

  • Número alcançável : se existe um número inteiro positivo xtal que φ(x) == n, então né alcançável .

Tarefa

Escreva uma função / programa para determinar se um número inteiro positivo é acessível.

Entrada

Um número positivo, em qualquer formato razoável. Pode-se supor que o número esteja dentro da capacidade do idioma. Entrada unária é aceita.

Resultado

Dois valores consistentes, um para números alcançáveis ​​e outro para números inacessíveis. Os dois valores podem ser qualquer coisa, desde que sejam consistentes.

Casos de teste

Os números alcançáveis ​​abaixo 100são:

1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46, 48, 52, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96

( A002202 no OEIS)

Regras

Aplicam-se brechas padrão .

Critério de vitória

Isso é . Envio com menor número de bytes ganhos.

Referências


Também relevante: oeis.org/A264739
Destructible Lemon

1
Ofereço uma recompensa para uma resposta Retina de uma linha, onde a linha única é um regex simples (sem reticulares).
Leaky Nun

@LeakyNun Estou um pouco confuso, até agora eu entendo isso phi(n) = count { m : 1 <= m <= n AND (m,n) are coprime }... isso é verdade?
Khaled.K

@ Khaled.K sim, isso é verdade.
Leaky Nun

Respostas:


6

Geléia , 7 6 bytes

²RÆṪe@

Não é exatamente rápido. Retorna 1 ou 0 .

Experimente online!

Como funciona

²RÆṪe@  Main link. Argument: n

²       Square; yield n².
 R      Range; yield [1, ..., n²].
  ÆṪ    Compute the totient of each integer in the range.
    e@  Exists swap; test if n occurs in the generated array.

Como funciona?
Freira vazada

1
Força bruta. Há um limite inferior para a função totient, portanto é suficiente obter um intervalo grande o suficiente, mapear totient e verificar as ocorrências da entrada.
Dennis

Você pode provar que a raiz quadrada é o mínimo?
Leaky Nun

A raiz quadrada não é realmente um limite inferior, mas a raiz quadrada dividida por sqrt (2) é. Tenho certeza de que a duplicação não é necessária, mas uma prova terá que esperar até que eu durma um pouco. Muito cansado agora.
Dennis

4
@LeakyNun Na verdade, o lema 3 deste artigo prova que a raiz quadrada é um limite inferior, a menos que n = 2k com k ímpar . Como k e 2k têm o mesmo totiente, a duplicação não é necessária.
Dennis

6

Mathematica, 28 bytes

EulerPhi@Range[#^2]~FreeQ~#&

Como a resposta de Dennis's Jelly, calculamos os valores of de todos os números até o quadrado da entrada e verificamos se a entrada aparece nela. Retorna Falsese a entrada está acessível e Truese não estiver. Sim, isso é confuso. Mas FreeQé um byte menor que MatchQ, e ei, a especificação disse que existem dois valores consistentes> :)


2

JavaScript (ES6), 90 82 bytes

Retorna 0ou true.

f=(n,x=n*2)=>x?(p=i=>(c=(a,b)=>a?c(b%a,a):b<2)(i,x)+(i&&p(--i)))(x)==n||f(n,x-1):0

Isso se baseia na suposição de que se x existe, então x ≤ 2n . Se for falso, deve ser atualizado para uso em x=n*nvez de x=n*2(mesmo tamanho, muito mais lento).

Um case de borda é n = 128, o qual requer computação ϕ (255) .

Demo


Convenientemente os números primos de Fermat são todos consecutiva dando origem a casos de ponta consecutivos n=2, n=8, n=128, n=32768e n=2147483648.
Neil

1

Axioma, 56 bytes

f(x:PI):Boolean==member?(x,[eulerPhi(i)for i in 1..2*x])

não sei se está certo ... código e resultados do teste

(35) -> [i  for i in 1..100|f(i)]
   (35)
   [1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46,
    48, 52, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96, 100]

O intervalo 1 .. (2 * x) ficaria ok até a entrada x = 500 ...



1

05AB1E , 5 bytes

nLÕså

Explicação:

n       Square [implicit] input
 L      Range [1 .. a]
  Õ     Euler totient
   s    Put first input at the top of the stack
    å   Is it in the list?

Experimente online!


0

05AB1E , 13 12 bytes

EDIT : Salva um byte porque a entrada é reutilizada se a pilha não tiver elementos suficientes.

Saídas 1 se acessível, 0 se não estiver.

Baseia-se na suposição de que x ≤ 2n, se existir.

xGNÕQi1,q}}0

Experimente online!

Como funciona

              # implicit input    
x            # push input, 2 * input
 G           # for N in 1..2*input
             # implicit push input
  N          # push N
   Õ         # push totient of N
    Q        # check if both are equal
     i.      # if equal
      1,     # print 1
        q    # quit program
         }   # end if
          }  # end for
           0 # push 0 if condition never reached
             # implicit print

0

C, 123 bytes

g(a,b){return!a?b:g(b%a,a);}
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

Experimente on-line

#include <stdio.h>

// gcd function
g(a,b){return!a?b:g(b%a,a);}

// Euler phi(x) function
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}

// check if m is reachable, phi(x) for x in (m , m^2]
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

main()
{
    // print all reachable number below 50
    for(int x=1; x<50; x++)
    {
        s(x);

        if(t)
        {
            printf(" %d ~ phi(%d) \n", x, k);
        }
    }
}

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.