Um primo Pillai é um número primo para o qual existe algum positivo tal que e .
Em outras palavras, um número inteiro é um primo Pillai se for um número primo , se existir outro número inteiro positivo tal modo que o fatorial de , mais seja divisível por se não for divisível por .
Dado um número inteiro positivo como entrada, decida se é um primo Pillai. A sequência de primos Pillai é OEIS A063980 .
Por exemplo, é um primo de Pillai porque:
- É um número primo, com apenas 2 fatores.
- e satisfazem as condições acima: e não divide ; e também não dividem .
Casos de teste
Verdade:
23 59. 83 109 139 593
Falsy:
5 7 8 73 89 263 437
Para os casos de verdade, os respectivos m são [(23, [14, 18]), (59, [15, 40, 43]), (83, [13, 36, 69]), (109, [86]), (139, [16]), (593, [274])]
.
Você pode seguir o formato de saída padrão do problema de decisão (ou seja, valores de verdade / falsidade) ou ter um valor consistente para primos Pillai e um valor não consistente, caso contrário ou vice-versa .
Você pode competir em qualquer linguagem de programação e pode receber e fornecer saída por qualquer método padrão , observando que essas brechas são proibidas por padrão. Isso é código-golfe , então a submissão mais curta (em bytes) para todos os idiomas vence.
fonte
[(23, 14), (23, 18), (59, 15), (59, 40), (59, 43), (83, 13), (83, 36), (83, 69), (109, 86), (139, 16), (593, 274)]
. Também os adicionei ao desafio.Respostas:
Python 2 ,
115111110109 bytes-6 bytes graças ao Sr. Xcoder
Experimente online!
As funções consistem em duas partes
~-n%x<1or~f(x)%n>0
que verificam sen
não satisfazem as "condições Pillai" en%x>0
para a validação principal.Depois que
all
é aplicado a ambos os itens, o primeiro item conteráFalse
/0
se não é um "número Pillai" válido, eo segundo conteráTrue
/1
sen
é primo.Estes são passados para o
cmp
que retornará-1
neste cenário (é um válido Pillai prime). As outras combinações[[0, 0], [1, 0], [1, 1]]
retornarão0
ou1
fonte
Geléia ,
118 bytesRetorna 0 para Pillai prime, 1 caso contrário.
Experimente online!
Como funciona
fonte
Pari / GP , 44 bytes
Experimente online!
fonte
Braquilog , 19 bytes
Experimente online!
Tradução bastante direta da pergunta:
fonte
J ,
3026 bytes-4 bytes graças ao FrownyFrog
Experimente online!
Explicação:
fonte
1~:|
para salvar 2 bytes.(]|1+!@[)
é apenas(|1+!)~
~
e isso faz sentido com o seu comentário anterior.Python 2 ,
65645352 bytesA saída é via presença ou ausência de um erro.
Experimente online!
fonte
Python 2 ,
109107 bytesExperimente online!
Explicação
O
l
localiza o fatorial do número passado, assim5
como a entrada retorna120
.As
all(p%i for i in range(2,p-1))
verificações para ver se um número é primo, ignoramos 0 e 1, pois nossas outras condições já as excluem.Finalmente, usamos
any(~-p%m>-~l(m)%p==0for m in range(2,p))
para percorrer todos os potenciais m procurando ver se algum satisfaz nossas necessidades.~-p
meiosp+1
. Em seguida, verificamos se é maior que-~l(m)%p
(o que se traduz em(m!-1)%p
e depois o comparamos0
. Basicamente,~-p%m
deve ser maior que 0 e-~l(m)%p
deve ser 0.Fontes
Melhorias
fonte
como você provavelmente pode ver no link tio, nem todos os casos passam, isso é porque js não pode lidar com grandes números, se esse requisito existir, tente implementá-lo :)
há uma verificação dupla
F%n>n-2&(F+1)%n<1
para evitar falsos positivos (mas não o contrário com problemas de grande número de js, precisamos realmente(F+1)%n<1
de números menores, pois reduz a contagem de bytes da solução para 60JavaScript (Node.js) ,
9088867268 bytesExperimente online!
fonte
Braquilog , 13 bytes
Experimente online!
É bem-sucedido nos primos Pillai, fornecendo o menor m através da variável de saída, e falha em qualquer outra coisa. Como grande parte de como isso economiza bytes em relação à solução da sundar é que ele calcula repetidamente as fatorações primárias de alguns números bastante grandes, é incrivelmente lento em entradas maiores. (Provavelmente executarei esses casos na instalação local do Brachylog quando o laptop não estiver usando a bateria.)
fonte
[Perl], 45 bytes
O módulo da teoria dos números tem os predicados como funções internas (is_pillai na verdade retorna 0 ou o menor m, e também resolve o A063828). O código C e Perl subjacente não é jogado (é claro). O código C se parece com:
(substitua UV genericamente por uint64_t ou similar, e HALF_WORD decide se podemos otimizar o mulmod em operações simples nativas).
O código Perl puro é semelhante a:
fonte
C (gcc) , 64 bytes
Experimente online!
fonte
Sussurros v2 , 230 bytes
Experimente online!
Isso retorna uma lista vazia para números primos não Pillai e uma lista não vazia caso contrário.
Como funciona
O Whispers foi projetado para manipulação em números reais / complexos, com um pouco de comandos de matriz adicionados para uma boa medida, daí o uso repetido de
Each
para iterar nas listas geradas.Um pouco de experiência no Whispers:
O Whispers é um pouco diferente no caminho de execução para a maioria dos outros idiomas. Em vez de trabalhar linearmente cada linha, apenas ramificando-se em condicionais, o Whispers começa na última linha do arquivo começando com
>
(as regras são um pouco mais complicadas que isso, mas é tudo o que precisamos saber por enquanto) e os significados dos números diferem, dependendo se a linha começa com>
ou>>
.Se a linha começar com
>
, como> 1
ou> Input
, essa é uma linha constante - ela retornará o mesmo valor todas as vezes. Aqui, os números representam sua forma numérica; portanto, a primeira linha sempre retornará 1 quando chamada.Se a linha começar, no
>>
entanto, os números serão tratados como referências a outras linhas, como chamadas de função, se você desejar. Por exemplo, na linha>> 1…2
, isso não executa o…
comando nos números inteiros 1 e 2 , mas nos valores retornados das linhas 1 e 2 . Nesse caso, esses valores são o número inteiro 1 e qualquer número inteiro que passamos como entrada.Neste exemplo, vamos considerar a entrada 23 . Lembre-se de que, devido ao pré-processamento do Whispers, a segunda linha (
> Input
) é convertida em> 23
.Nosso primeiro comando é na linha 3:
>> 1…2
.…
é o intervalo diádico, neste caso de 1 a 23 , resultando em {1, 2, ... 22, 23} . Em seguida, pulamos para as linhas 9 a 12 :Aqui temos quatro
Each
instruções consectutivas , cada uma das quais itera sobre o resultado anterior, mapeando essencialmente os 4 comandos sobre a matriz na linha 3 : o intervalo. As três primeiras instruções são mapas simples, com as linhas 4 , 5 e 6 :Esses três comandos, sobre um número inteiro n , produz (n! +1) ∣x , onde ! denota factorial , | denota divisbility e x é a entrada. Finalmente, a linha 12 possui uma estrutura de mapa diádico .
Uma estrutura de mapa diádico leva três números inteiros: o alvo, a esquerda e a direita, cada um indexa para outras linhas. Aqui, fechamos a esquerda e a direita para produzir uma lista de pares e depois reduzimos cada par pelo comando diádico (o destino). Aqui, se a entrada for 23 , as listas são {1, 2, ... 22, 23} e {0, 0, ... 1, 0} e o comando é
que multiplica o argumento da esquerda pela direita. Isso produz uma matriz de números inteiros, com 0 nos índices de números inteiros cujos fatoriais incrementados não são divisíveis pelas entradas e o índice original onde eles estão. Vamos chamar essa matriz A . Em seguida, vamos remover os 0 s de A , tendo a diferença de conjunto entre {0} e A :
Com nosso exemplo de entrada, isso produz o conjunto {14, 18, 22} . A seguir, pegamos o restante da entrada sendo dividido por cada valor no conjunto e verificamos se esse restante não é igual a 1 :
Novamente, temos uma lista de 0 ou 1 se precisamos remover os 0 se substituir os 1 pelos valores originais. Aqui repetimos o código que vimos acima, mas com um
>> 18∖13
pouco do que12
. Por fim, lançamos esse conjunto resultante em uma lista para uma verificação final. Infelizmente, nosso código também deve rejeitar números compostos que atendem a todos esses critérios, como 437 . Portanto, adicionamos nossa verificação final, multiplicando nossa lista final pela primalidade da entrada. Devido à forma como a multiplicação do Python funciona nas listas, 0 o substitui por uma lista vazia e 1 não tem efeito. Então calculamos a primalidade da entrada, multiplique isso pela lista de ms para a entrada e saída do resultado final:fonte
APL (NARS), 65 caracteres, 130 bytes
Aqui 23x, significaria 23r1 e, portanto, a fração 23/1, e todos os outros; teste:
fonte
C # (compilador interativo do Visual C #) , 138 + 22 = 160 bytes
O TIO não implementou a biblioteca System.Numerics no lançamento do Mono, para que você possa ver os resultados
Experimente online!Aqui em vez disso.Explicação:
fonte
CJam , 37 bytes
Saídas
11
se a entrada for um pillai prime, caso contrário00
,01
ou10
Explicação:
Experimente online!
fonte