Un Pillai premier est un nombre premier pour lequel il existe un certain positif tel que et .
En d'autres termes, un entier est un nombre premier de Pillai s'il s'agit d'un nombre premier , s'il existe un autre entier positif tel que la factorielle de , plus est divisible par et si n'est pas divisible par .
Étant donné un entier positif en entrée, décidez s'il s'agit d'un nombre premier de Pillai. La séquence des nombres premiers de Pillai est OEIS A063980 .
Par exemple, est un nombre premier de Pillai car:
- C'est un nombre premier, n'ayant que 2 facteurs.
- et remplissent les conditions ci-dessus: et ne divise pas ; et ne divise pas non plus .23 ∣ ( 14 ! + 1 ) 14 22 23 ∣ ( 18 ! + 1 ) 18 22
Cas de test
Vérité:
23 59 83 109 139 593
Falsy:
5 sept 8 73 89 263 437
Pour les cas véridiques, les m respectifs sont [(23, [14, 18]), (59, [15, 40, 43]), (83, [13, 36, 69]), (109, [86]), (139, [16]), (593, [274])]
.
Vous pouvez soit suivre le format de sortie standard de problème de décision (c'est-à-dire, les valeurs véridiques / fausses), soit avoir une valeur cohérente pour les nombres premiers Pillai et une valeur non cohérente sinon ou vice versa .
Vous pouvez concurrencer dans n'importe quel langage de programmation et pouvez prendre des entrées et fournir des sorties par n'importe quelle méthode standard , tout en prenant note que ces failles sont interdites par défaut. Il s'agit de code-golf , donc la soumission la plus courte (en octets) pour chaque langue l' emporte.
la source
[(23, 14), (23, 18), (59, 15), (59, 40), (59, 43), (83, 13), (83, 36), (83, 69), (109, 86), (139, 16), (593, 274)]
. Je les ai également ajoutés au défi.Réponses:
Python 2 ,
115111110109 octets-6 octets grâce à M. Xcoder
Essayez-le en ligne!
Les fonctions se composent de deux parties
~-n%x<1or~f(x)%n>0
qui vérifient sin
elles ne satisfont pas aux "conditions Pillai", etn%x>0
pour la validation principale.Après cela ,
all
on applique aux deux articles, le premier élément contiendraFalse
/0
s'il est valide « nombre Pillai », et le second contiendraTrue
/1
sin
est premier.Ceux-ci sont transmis à
cmp
celui qui reviendra-1
dans ce cenario (est un premier Pillai valide). Les autres combinaisons[[0, 0], [1, 0], [1, 1]]
reviendront0
ou1
la source
Gelée ,
118 octetsRenvoie 0 pour Pillai prime, 1 sinon.
Essayez-le en ligne!
Comment ça fonctionne
la source
Pari / GP , 44 octets
Essayez-le en ligne!
la source
Brachylog , 19 octets
Essayez-le en ligne!
Traduction assez simple de la question:
la source
J ,
3026 octets-4 octets grâce à FrownyFrog
Essayez-le en ligne!
Explication:
la source
1~:|
pour enregistrer 2 octets.(]|1+!@[)
est juste(|1+!)~
~
et cela fait sens avec votre commentaire précédent.Python 2 ,
65645352 octetsLa sortie s'effectue via la présence ou l'absence d'une erreur.
Essayez-le en ligne!
la source
Python 2 ,
109107 octetsEssayez-le en ligne!
Explication
Le
l
trouve la factorielle du nombre transmis, de sorte5
que l'entrée revient120
.Les
all(p%i for i in range(2,p-1))
vérifications pour voir si un nombre est premier, nous ignorons 0 et 1 car nos autres conditions les excluent déjà.Enfin, nous utilisons
any(~-p%m>-~l(m)%p==0for m in range(2,p))
pour parcourir tous les m potentiels qui cherchent à voir s'ils satisfont à nos besoins.~-p
signifiep+1
. Ensuite, nous vérifions s'il est supérieur à-~l(m)%p
(ce qui se traduit par(m!-1)%p
, puis nous le comparons à0
. Fondamentalement, il~-p%m
doit être supérieur à 0 et-~l(m)%p
doit être égal à 0.Sources
Améliorations
la source
comme vous pouvez probablement le voir dans le lien tio, tous les cas ne passent pas, c'est parce que js ne peut pas gérer les grands nombres, si une telle exigence existe mal, essayez de la mettre en œuvre :)
il y a une double vérification
F%n>n-2&(F+1)%n<1
pour éviter les faux positifs (mais pas l'inverse avec les problèmes de grand nombre js, nous avons vraiment besoin(F+1)%n<1
de nombres plus petits, ce qui réduit le nombre d'octets de la solution à 60JavaScript (Node.js) ,
9088867268 octetsEssayez-le en ligne!
la source
Brachylog , 13 octets
Essayez-le en ligne!
Réussit pour les nombres premiers Pillai, fournissant le plus petit m via la variable de sortie, et échoue pour autre chose. Puisqu'une grande partie de la façon dont cela économise des octets par rapport à la solution de Sundar est qu'il calcule à plusieurs reprises les factorisations principales de certains très gros nombres, c'est assez incroyablement lent sur des entrées plus grandes. (Je vais probablement exécuter ces cas sur mon installation Brachylog locale une fois que mon ordinateur portable n'est pas alimenté par batterie.)
la source
[Perl], 45 octets
Le module de théorie des nombres a les prédicats en tant que fonctions intégrées (is_pillai renvoie en fait 0 ou le plus petit m, donc résout A063828 également). Le code C et Perl sous-jacent n'est pas joué (bien sûr). Le code C ressemble à:
(remplacez génériquement UV par uint64_t ou similaire, et HALF_WORD décide si nous pouvons optimiser le mulmod en opérations natives simples).
Le code Perl pur est similaire à:
la source
C (gcc) , 64 octets
Essayez-le en ligne!
la source
Whispers v2 , 230 octets
Essayez-le en ligne!
Cela renvoie une liste vide pour les nombres premiers non Pillai, et une liste non vide sinon.
Comment ça fonctionne
Whispers a été conçu pour être manipulé sur des nombres réels / complexes, avec un peu de commandes de tableau ajoutées pour faire bonne mesure, d'où l'utilisation répétée de
Each
pour parcourir les listes générées.Un peu d'histoire sur Whispers:
Whispers est légèrement différent dans son chemin d'exécution vers la plupart des autres langages. Plutôt que de parcourir chaque ligne de façon linéaire, en ne ramifiant que les conditions, Whispers commence sur la dernière ligne du fichier commençant par
>
(les règles sont légèrement plus compliquées que cela, mais c'est tout ce que nous devons savoir pour l'instant), et la signification des nombres diffèrent selon que la ligne commence par>
ou>>
.Si la ligne commence par
>
, comme> 1
ou> Input
, c'est une ligne constante - elle renvoie la même valeur à chaque fois. Ici, les nombres représentent leur forme numérique, donc la première ligne retournera toujours 1 lors de l'appel.Si la ligne commence par
>>
cependant, les nombres sont traités comme des références à d'autres lignes, sorte d'appels de fonction similaires, si vous voulez. Par exemple, dans la ligne>> 1…2
, cela n'exécute pas la…
commande sur les entiers 1 et 2 , mais plutôt sur les valeurs renvoyées par les lignes 1 et 2 . Dans ce cas, ces valeurs sont l'entier 1 et quel que soit l'entier que nous transmettons en entrée.Pour cet exemple, considérons l'entrée de 23 . Gardez à l'esprit qu'en raison du prétraitement de Whispers, la deuxième ligne (
> Input
) est convertie en> 23
.Notre première commande est en ligne 3:
>> 1…2
.…
est une gamme dyadique, dans ce cas de 1 à 23 , donnant {1, 2, ... 22, 23} . Ensuite, nous sautons aux lignes 9 à 12 :Ici, nous avons 4
Each
déclarations consécutives , chacune d'elles répétant le résultat précédent, mappant essentiellement les 4 commandes sur le tableau de la ligne 3 : la plage. Les trois premiers énoncés sont de simples cartes, avec les lignes 4 , 5 et 6 :Ces trois commandes, sur un entier n , donnent (n! +1) ∣x , où ! dénote factorielle , ∣ dénote la divisibilité et x est l'entrée. Enfin, la ligne 12 a une structure de carte dyadique .
Une structure de carte dyadique prend trois entiers: la cible, la gauche et la droite, chacun indexe sur d'autres lignes. Ici, nous zip la gauche et la droite pour produire une liste de paires, puis réduisons chaque paire par la commande dyadique (la cible). Ici, si l'entrée est 23 , les listes sont {1, 2, ... 22, 23} et {0, 0, ... 1, 0} et la commande est
qui multiplie l'argument de gauche par la droite. Cela produit un tableau d'entiers, avec 0 aux index des entiers dont les factorielles incrémentées ne sont pas divisibles par les entrées, et l'index d'origine où elles se trouvent. Nous appellerons ce tableau A . Ensuite, nous supprimons les 0 de A en prenant la différence définie entre {0} et A :
Avec notre exemple d'entrée, cela produit l'ensemble {14, 18, 22} . Ensuite, nous prenons le reste de l'entrée divisé par chaque valeur de l'ensemble et vérifions si ce reste n'est pas égal à 1 :
Encore une fois, nous avons une liste de 0 ou de 1 s et devons supprimer les 0 et remplacer les 1 par les valeurs d'origine. Ici, nous répétons le code que nous avons vu ci-dessus, mais avec
>> 18∖13
plutôt que12
. Enfin, nous avons converti cet ensemble résultant en une liste pour une vérification finale. Malheureusement, notre code doit également rejeter les nombres composites qui répondent à tous ces critères, tels que 437 . Nous ajoutons donc notre contrôle final, en multipliant notre liste finale par la primauté de l'entrée. En raison du fonctionnement de la multiplication Python sur les listes, 0 la remplace par une liste vide et 1 n'a aucun effet. Nous calculons donc la primauté de l'entrée, multiplions cela par la liste de ms pour l'entrée et la sortie du résultat final:la source
APL (NARS), 65 caractères, 130 octets
Ici 23x cela signifierait 23r1 et donc la fraction 23/1, donc tous les autres; tester:
la source
C # (Visual C # Interactive Compiler) , 138 + 22 = 160 octets
TIO n'a pas implémenté la bibliothèque System.Numerics dans sa version de Mono, vous pouvez donc voir les résultats
Essayez-le en ligne!Ici à la place.Explication:
la source
CJam , 37 octets
Sorties
11
si l'entrée est un pilier premier, sinon00
,01
ou10
Explication:
Essayez-le en ligne!
la source