Um número é um Mersenne Prime se for primo e puder ser escrito no formato 2 n -1 , onde n é um número inteiro positivo.
Sua tarefa é determinar, dado qualquer número inteiro positivo, se é ou não um primo de Mersenne. Você pode enviar uma função que retorne um valor de verdade / falsidade ou um programa completo que execute E / S.
Regras:
- Como esse é o código-golfe , você deve fazer isso na menor contagem de bytes possível. Builtins são permitidos.
- Aplicam-se brechas de golfe padrão - você não pode ler os números primos de Mersenne de arquivos externos ou codificá-los em seu programa.
- Seu programa deve funcionar para valores dentro do tamanho inteiro padrão do seu idioma.
Casos de teste
Para referência, uma lista dos (conhecidos) Mersenne Primes pode ser encontrada aqui . Alguns casos de teste úteis são:
2 -> False
1 -> False
20 -> False
51 -> False
63 -> False
3 -> True
31 -> True
8191 -> True
Feliz Natal pra todo mundo! Tenha um ótimo feriado, o que você comemora :)
code-golf
number-theory
primes
decision-problem
integer
FlipTack
fonte
fonte
2^n-1
n
é sempre excelente, mas sabendo que nada muda, a definição ainda está correta.Respostas:
Gelatina , 5 bytes
Experimente online!
Como funciona
fonte
05AB1E , 5 bytes
Um número positivo na forma 2 n - 1 em binário consiste apenas de 1's .
Código:
Explicação:
Usa a codificação CP-1252 . Experimente online! ou Verifique todos os casos de teste .
fonte
Python , 45 bytes
Experimente online!
Como funciona
Os três termos da comparação encadeada
faça o seguinte:
-~n&n
calcula o bit a bit E de n + 1 e n . Como n consiste apenas de 1 bits, se for um número de Mersenne, o AND bit a bit retornará 0 se (e somente se) for esse o caso.all(n%i for i in range(2,n))
retorna True se e somente se n mod i for diferente de zero para todos os valores de i em [2,…, n - 1] , ou seja, se e somente se n não tiver divisores positivos além de 1 e n .Em outras palavras, all retorna True se e somente se n for um número composto, ou seja, n for 1 ou um primo.
n
é auto-explicativo.A comparação encadeada retorna True se e somente se as comparações individuais fizerem o mesmo.
Desde todos os retornos tanto verdadeiro / 1 ou Falso / 0 ,
-~n&n<all(n%i for i in range(2,n))
só pode retornar verdadeiro se-~n&n
os rendimentos 0 (isto é, se n é um número Mersenne) e todos os retornos verdadeira (ou seja, se n seja 1 ou prime).A comparação
all(n%i for i in range(2,n))<n
é válida sempre que n> 1 , mas como tudo retorna True se n = 1 , não é válido nesse caso.fonte
Braquilog , 7 bytes
Experimente online!
Um programa Brachylog é basicamente uma sequência de restrições que formam uma cadeia: a primeira restrição é entre a entrada e um desconhecido anônimo (vamos chamá-lo de A para os fins desta discussão), a segunda restrição é entre esse desconhecido anônimo e uma segunda anônima. desconhecido (que chamaremos de B ) e assim por diante. Como tal, o programa se divide assim:
A única maneira de satisfazer todas essas restrições simultaneamente é se B for uma potência de 2, ou seja, a entrada for uma potência de 2 menos 1, e a entrada também for primária. (Brachylog usa um solucionador de restrições internamente, para que o programa não seja tão ineficiente quanto a ordem da avaliação parece; ele estará ciente de que esse
C
é o formato[2, Y]
antes de tentar expressarB
como a exponenciação de dois números.)Curiosamente,
#p+~^
quase funciona, porque os primos do tipo Mersenne só podem usar 2 como base em casos não degenerados ( prova ), mas a) ele falha nos primos não-Mersenne B -1, pois podem ser expressos como B and eb ), o intérprete Brachylog existente parece estar confuso (entrando em um loop infinito ou pelo menos de longa duração) por um programa que é tão pouco restrito. Portanto, é improvável que 7 bytes sejam vencidos no Brachylog.fonte
Mathematica 26 Bytes
Veja esta prova
Funciona desde que não haja números perfeitos ímpares e nenhum seja conhecido por existir.
fonte
n(n+1)/2
produz números pares (perfeitos) sempre quen
for um primo de Mersenne (Euclides). Parece desconhecido se um número ímpar perfeito pode ter a forman(n+1)/2
, ou seja, um número triangular. Todos os mesmo números perfeitos são triangulares, onde esten
é primo de Mersenne (Euler).Mathematica,
2926 bytesEditar: salvou 3 bytes graças a Martin Ender
PrimeQ@#&&IntegerQ@Log2[#+1]&
Eu suspeito que isso seria mais rápido, pois os primeiros 42 expoentes são codificados:
fonte
PrimeQ@#&&1>BitAnd[#,#+1]&
Perl 6 , 29 bytes
Tente
Expandido:
desde que o Perl 6 tenha Ints arbitrariamente grandes, ele não preenche a frente
.base(2)
com0
s.fonte
Python,
8382797673 bytesPython 2, 71 bytes
Essa função implementa o teste de primalidade Lucas – Lehmer , portanto, embora não seja tão curto quanto algumas das outras ofertas em Python, é muito mais rápido no manuseio de entradas imensas.
Aqui está um código de teste que é executado no Python 2 ou Python 3.
saída
FWIW, aqui está uma versão um pouco mais eficiente
f
que não é testadam
a cada loop:fonte
R,
4140 bytesCuriosamente, o R embutido
mersenne
toman
como argumento, não2^n-1
.Isso é feito
x
pelo STDIN, verifica se é primo usando omatlab
pacote e verifica se o log de 2x+1
é um número inteiro, usando o mod 1 e verificando 'not zero-ness'.Além disso, se você usar o
mersenne
built-in, ele será um pouco mais curto, mas parecerá trapaça:Guardado 1 byte graças a @Billywob
fonte
matlab::isprime
para salvar um byte. Também é necessário usar<-
para atribuição de função.log2(x+1)
em vezlog(x+1,2)
.Pyke, 10 bytes
Experimente aqui!
fonte
Na verdade , 9 bytes
Experimente online!
Explicação:
Como todo número da forma 2 n -1 possui todos os 1s em sua representação binária, um primo de Mersenne pode ser identificado como um número primo com essa qualidade.
fonte
Geléia, 5 bytes
Abordagem alternativa à resposta Jelly existente de 5 bytes do @Dennis:
Experimente online!
Como funciona:
Como um Mersenne Prime é um a menos que uma potência de 2, sua representação binária é excusivamente 1's. A saída é 1 para primos de Mersenne e 0 em todos os outros casos.
fonte
Ceilão, 66 bytes
Formatado (e comentado):
Com a trapaça (codificação dos resultados no intervalo do número inteiro do Ceilão), podemos obter um byte mais curto (65):
(Parece que o marcador de sintaxe entende os números hexadecimais do Ceilão como início de comentário.)
Se uma função anônima estiver correta, essa é 49 bytes:
fonte
Wolfram Language (Mathematica) , 23 bytes
Experimente online!
1 é tratado corretamente porque
PrimeQ[BitAnd[1,1+2]*1] == PrimeQ@1 == False
. Caso contrário, paraBitAnd[#,#+2]#
ser primo, precisamos que#
seja primo eBitAnd[#,#+2] == 1
, o que acontece quando#
é um número de Mersenne.fonte
Regex ECMAScript,
4231 bytes^(?!(xx+)\1+$)(x(x*)(?=\3$))+x$
Experimente online!
Edit: Até 31 bytes, graças a Neil.
O teste básico "é uma potência de 2 menos 1" é
^(x(x*)(?=\2$))*$
. Isso funciona fazendo um loop na operação "subtraia 1, depois divida uniformemente por 2" até que isso não possa mais ser feito, afirmando que o resultado é zero. Isso pode ser modificado para corresponder apenas aos números ≥1, alterando o último*
para a+
, forçando o loop a repetir pelo menos uma vez. Inserir umx
antes do último$
modifica- o ainda mais para corresponder apenas aos números ≥3, afirmando que o resultado final após o loop pelo menos uma vez é 1.O teste "é uma potência de 2" relacionada é
^((x+)(?=\2$))*x$
. Há também uma abreviação de poderes correspondentes de 2 menos 2, descobertos por Grimy :^((x+)(?=\2$)x)*$
. Todas essas três expressões regulares têm o mesmo comprimento.Versão alternativa de 31 bytes, do Grimy :
^(?!(xx+)\1+$|((xx)+)(\2x)*$)xx
Experimente online!
fonte
x(x+)(?=\3$)
um pouco mais eficiente?Regex (ECMAScript), 29 bytes
Experimente online!
Inspirado por Grimy no chat
A regex afirma que a entrada é maior que 3 e que não é da forma:
(xx+)\1+
ou((xx)+)(\1x)+
.O primeiro corresponde a números compostos.
O segundo corresponde a um número 1 menor que um múltiplo de algum número ímpar maior que 2.
0
1
Como 2 é o único primo que é 1 menor que um ímpar ímpar, a cabeça negativa, juntamente com a afirmação de que a entrada é maior que 3, corresponderá apenas aos primos mersenne.
fonte
Ruby, 47 bytes
fonte
Julia, 26 bytes
fonte
Python, 65 bytes
Saídas via código de saída. Erro de recursão para falso. Nenhum erro para True.
Como funciona
Como
2^n-1
no binário é feito inteiramente de 1, o próximo2^n-1
número pode ser gerado pornumber|number+1
.Essa função usa isso percorrendo recursivamente cada
2^n-1
número, verificando se é um número primo e eqaul para a entrada. Se o número não for um primo de Mersenne, o python acabará gerando um erro, pois a profundidade máxima da recursão teria sido excedida.fonte
<0
~>0>
.Pushy , 7 bytes
Experimente online!
Isso tira vantagem do fato de que os números de Mersenne têm apenas um em sua representação binária:
O produto da pilha será apenas
1
se o número não tiver zeros em sua representação binária e sua primalidade forTrue
.fonte
Pitão , 8 bytes
Verifique todos os casos de teste.
Pitão , 8 bytes
Verifique todos os casos de teste.
Quão?
Divisão de código # 1
Como isso funciona?
Um número do formato 2 n - 1 sempre contém 1 somente quando escrito em binário. Portanto, testamos se todos os seus dígitos binários são 1 e se são primos.
Divisão de código # 2
Como isso funciona?
Isso testa se a entrada + 1 é uma potência de dois (ou seja, se é um número de Mersenne) e, em seguida, executa o teste de primalidade. Em Python,
bool
é uma subclasse deint
, então a verdade é tratada como 1 e a falsidade é tratada como 0 . Para evitar verificar explicitamente se um é 0 e o outro é 1 , comparamos seus valores usando<
(já que temos apenas 1 caso).fonte
Java 8,
535249 bytesCorreção de bugs e golfed por 4 bytes graças ao @Nevay .
Explicação:
Experimente aqui.
fonte
true
para todos os primos> 2, não apenas para os primos de Mersenne, 56 bytes:n->{for(int i=2;i<n;n&=-n%i++>>-1);return(n&n+1)<1&n>2;}
n->{int i=1;for(;++i<n&n%i>0;);return(n&n+1|i^n)<1;}
n->{int i=1;for(;n%++i>0;);return(n&n+1|i^n)==0;}
Python 3, 68 bytes
Experimente aqui
Python 2, 63 bytes
Experimente aqui
Obrigado pela sugestão Jonathan
Abra todas as sugestões para reduzir o número de bytes.
fonte
1 and
~>1and
.Japonês, 6 bytes
Executar ou executar todos os casos de teste
fonte
©
por bit&
a bit para obter uma saída consistente, se desejar.Python, 93 bytes
Esse código funcionaria no Python 2 e no Python 3, portanto não especifiquei uma versão.
fonte
Raquete 76 bytes
Ungolfed:
Teste:
Saída:
fonte
PHP, 53 bytes
aceita argumento de linha de comando; imprime
1
para Mersenne prime, string vazio. Corra com-r
.demolir
fonte
C, 94 bytes
Retorna 1 se o número for um Mersenne Prime, 0 caso contrário.
fonte
~x+g(2,n)
vez dex^g(2,n)-1
Scala, 59 Bytes
Esta função requer que a entrada seja a
BigInt
. Você pode converter facilmente uma sequência "162259276829213363391578010288127" (2 ** 107-1 é um primer de Mersenne)BigInt
fazendo issoBigInt("162259276829213363391578010288127")
. Pode dar errado, como o nome doisProbablePrime()
método sugere. Mas a probabilidade não é maior que0.5^(t.bigLength)*9
.A versão do script independente tem 72 bytes.
Suponha que o salvemos como "t.scala" e, em seguida, o programa pode ser executado como
fonte
Probable
deisProbablePrime
se Scala tiver umaisPrime
função.Perl 5 , 53 bytes
52 bytes de código + 1 para
-p
Experimente online!
fonte
-p
é classificado como outra linguagem de programação e, portanto, não conta no seu bytecount.