Introdução:
Você acidentalmente corrompeu o fluxo do tempo com um dispositivo criado por diversão, que acabou sendo uma máquina do tempo. Como resultado, você foi empurrado para o futuro distante. Você percebeu que a computação, o poder de processamento e os computadores em geral evoluíram em uma quantidade enorme, uma quantidade infinita para ser preciso . Então você pega um computador com memória infinita e poder de processamento. Você não tem idéia de como ele pode ter memória infinita e poder de processamento infinito, mas apenas aceita e volta ao presente.
Desafio:
Você ouviu dizer que a pessoa que descobriu o maior prime atualmente 2^74,207,281 − 1
recebeu US $ 100.000. Você decide criar um programa que encontre o próximo número primo, pois deseja recuperar o dinheiro gasto no computador. Você faz um que recebe a entrada de um número e encontra o próximo número primo, por força bruta ou por qualquer outro método.
Esclarecimentos:
Você tem uma máquina hipotética com memória infinita e poder de processamento. Seu programa NÃO DEVE ser limitado (por exemplo: int's de C # podem armazenar de -2,147,483,648
até 2,147,483,647
), bem, seu programa deve ser capaz de armazenar e trabalhar com qualquer número de qualquer tamanho. Você tem recursos infinitos; portanto, você não deveria se importar se ficaria sem memória se permitisse isso.
Exemplo de E / S:
Entrada: o maior primo descoberto atualmente com 22.338.618 dígitos.
Saída: exatamente o próximo prime
Obviamente, você não precisa provar que funciona, pois levaria muito tempo para computar em uma máquina física. Mas se você moveu seu programa para uma máquina hipotética com poder / memória de processamento infinito, ele deve calcular instantaneamente.
Encontrar o próximo primo e verificar se um número é primo, são duas coisas completamente diferentes
Respostas:
Mathematica, 9 bytes
fonte
Python 3 , 45 bytes
Experimente online!
fonte
k
é igual ao resultado final,m
contém(k-1)!^2
. Desde (k-1)! = -1 mod k só é válido quando k é primo, temos (k-1)! (K-1)! = 1 mod k, que quando multiplicado por k será o próprio k. Você calcula o quadrado para se livrar da única exceção de (k-1)! = 0 mod k para o composto k, o que ocorre para k = 4. Correto?RecursionError: maximum recursion depth exceeded in comparison
paraf(1000)
RecursionError
.Python 2,
78777674 bytes-1 byte graças a @KritixiLithos
-1 byte graças a @FlipTack
-2 bytes graças a @ElPedro
fonte
n%i<1
é mais curto quen%i==0
if
.<1
n+=1
eif
nas guias e salvar 2 bytesGelatina , 2 bytes
Experimente online!
This implicitly takes input z and, according to the manual, generate the closest prime strictly greater than z.
fonte
Oasis, 2 bytes
Run with the
-n
flag.Code:
Try it online!
fonte
Bash + coreutils, 52 bytes
Try it online!
The documentation for bash and factor do not specify a maximum integer value they can handle (although, in practice, each implementation does have a maximum integer value). Presumably, in the GNU of the future on your infinitely large machines, bash and factor will have unlimited size integers.
fonte
Maxima, 10 bytes
A function returns the smallest prime bigger than its argument.
fonte
Brachylog, 2 bytes
Try it online!
Explanation
fonte
Python with sympy, 28 bytes
sympy.nextprime
is a function which does what it says on the tin. Works for all floats.repl.it
Python,
6659 bytes-4 bytes thanks to Lynn (use
-~
)-3 bytes thanks to FlipTack (use
and
andor
, allowing...==1
to be switched to a...-1
condition.)repl.it
A recursive function that counts up from
n
until a prime is found by testing that only one number exists up ton-1
that divides it (i.e. 1). Works for all integers, raises an error for floats.Works on 2.7.8 and 3.5.2, does not work on 3.3.3 (syntax error due to lack of space between
==1
andelse
)fonte
(n+1)%(i+1)
is-~n%-~i
, I think.and
/or
work, such asf=lambda n:sum(-~n%-~i<1for i in range(n))==1and-~n or f(n+1)
?f=lambda n:sum(-~n%-~i<1for i in range(n))-1and f(n+1)or-~n
Python,
11483 bytesWithout builtins, if there are any.
-30 by removing whitespace and -1 by changing
b%i==0
tob%i<1
fonte
1
Perl 6, 25 bytes
How it works
Perl 6, 32 bytes
With inefficient custom primality testing.
How it works
Outer structure is the same as above, but the predicate passed to
first
(to decide if a given number is prime), is now:fonte
.is-prime
;)Pyke,
87 bytesTry it here!
4 bytes, noncompeting
(Interpreter updated since challenge posted)
Try it here!
fonte
J, 4 bytes
Simples embutido para o próximo prime.
fonte
05AB1E ,
1613 bytes (Emigna @ -3 bytes)Experimente online!
fonte
[>Dp#
funcionaria?Perl, 30 bytes (29 +1 para
-p
):Uso
Digite o número depois de pressionar return (entrada 12345 no exemplo abaixo, saídas 12347):
Como funciona
1
's que tem comprimento++$_
, onde$_
é inicialmente o valor de entrada1
s é de comprimento não primário (explicado aqui ).++$_
)while
loop implícito sai e-p
imprime o valor de$_
"1"
de comprimento 1, pois nunca será usada para valores menores que1
, de acordo com a especificação.fonte
Java 7,
373343334303268 bytes-75 bytes obrigado @Poke
Ungolfed:
Experimente aqui.
Alguns exemplos de entradas / saídas:
fonte
static
o campo e o métodop
, mas removendo o métodoc
ep
o parâmetro.QBIC , 34 bytes
Baseado neste testador de primalidade QBIC . Explicação:
fonte
JavaScript (ES7), 61 bytes
Uso
Resultado
fonte
MATL, 3 bytes
A função
Yq
retorna o próximo primo do valor absoluto da entrada, se a entrada for negativa, de modo que agarramos implicitamente a entrada, a negamos (_
) e localizamos o próximo primo usandoYq
.Experimente Online!
fonte
Haskell,
424643 byteso código usual para força bruta.
Claro que isso encontra o próximo menor número primo depois
n
. Não há maior prime.Funciona para n > 0 .
editar: Assume que
n
é primo. Obrigado ao conselho de @Laikoni nos comentários .fonte
head[...]
por[...]!!0
. No entanto, acho que se pode supor quen
é primo, então você pode usar em[n..]
vez de[n+1..]
e depois usar o segundo elemento[...]!!1
.SimpleTemplate, 132 bytes
O algoritmo é terrível, pois tenho que fazer meu próprio código para verificar se um número é primo ou não.
Provou ser horrível, mas funciona.
Recebe o número como o primeiro argumento, produzindo o resultado.
Ungolfed:
Alguma dica de como remover isso por último
@if
?fonte
Lua, 876 bytes
Lua, diferentemente de outros idiomas, possui um Tamanho Máximo Inteiro. Quando um número fica maior que 2 32 , as coisas param de funcionar corretamente e Lua começa a tentar fazer estimativas em vez de valores exatos.
Como tal, eu tive que implementar um novo método de armazenamento de números, em particular, eu os armazenei como seqüências de caracteres Base10, porque Lua não tem um limite de tamanho em Strings, além do tamanho da memória.
Eu sinto que essa resposta é muito mais importante para o espírito da pergunta, pois ela mesma deve implementar números inteiros de precisão arbitrários, além de um teste primo.
Explicado
Embora o acima mencionado use Metatables, em vez de apenas funções regulares, como a resposta real, que resultou menor.
fonte
Ruby, 28 + 6 = 34 bytes
Usa a
-rprime
bandeira.Versão não recursiva para 31 + 6 = 37 bytes:
fonte
Python + primefac ,
3432 bytesNão é tão curto quanto usar
sympy
(outra resposta já o usa), mas ainda é muito curto e é muito mais rápido.Experimente online
Entrada de
2**2000
conclui em alguns segundos.fonte
Japonês, 6 bytes
Execute-o online.
fonte