Séquence arithmétique des nombres premiers du bibliothécaire fou

18

Eh bien, le bibliothécaire vous a surpris en train de tromper votre travail en utilisant votre algorithme de tri , alors maintenant vous êtes puni. On vous a ordonné de créer du code afin que le bibliothécaire puisse impressionner l'objet de leur affection non partagée, le professeur de mathématiques. Voilà donc ce que signifie "Autres tâches assignées" ...

Tout le monde connaît la séquence de nombres naturels en base 10, appelée N :

0, 1, 2, 3, 4, 5, 6, ...

À partir de cela, nous pouvons générer la séquence de nombres premiers, appelons-la P , de sorte que chaque élément de P a exactement deux diviseurs dans N , à savoir 1et lui-même. Cette séquence est:

2, 3, 5, 7, 11, 13, ...

OK, jolie routine jusqu'à présent.

Le bibliothécaire a pensé à une fonction astucieuse F (x, y) qui prend un nombre xde N , avec la condition 0 <= x <= 9, et un nombre yde N , et insère xdans yl'expansion décimale de 'dans chaque position (c'est-à-dire, en ajoutant, en insérant ou en ajoutant xdans y), puis renvoie l'ensemble trié de nouveaux numéros.
Par exemple, F (6, 127) entraînerait

1267, 1276, 1627, 6127

C'est quand même un peu ennuyeux. Le bibliothécaire veut pimenter un peu plus les choses en spécifiant une nouvelle fonction z -> {p : p in P and F(z,p) subset of P}, triée par ordre croissant.
Par exemple, z (7) serait

3, 19, 97, 433, 487, 541, ...

parce que 37et 73sont tous les deux premiers, 719 179et 197sont tous premiers, etc.

Notez que z (2) est vide, car aucun nombre premier auquel est 2ajouté ne sera toujours premier. De même pour {0,4,5,6,8}.

Votre tâche consiste à écrire du code qui générera et produira les 100 premiers nombres dans la séquence z (x) pour un x donné .

Contribution

Un seul entier x tel que 0 <= x <= 9. L'entrée peut se faire via un argument de fonction, STDIN ou équivalent.

Production

Une séquence des 100 premiers nombres, délimités par votre choix, à STDOUT ou équivalent, de telle sorte que la séquence satisfait z (x) comme décrit ci-dessus. Si z (x) est vide, comme c'est le cas pour {0,2,4,5,6,8}, les motsEmpty Set doivent être sortis à la place.

Restrictions

  • Il s'agit de code-golf, car vous devrez le transcrire sur une fiche afin que le bibliothécaire puisse montrer le professeur de mathématiques et vos crampes à la main facilement.
  • Des restrictions standard contre les échappatoires s'appliquent. Le bibliothécaire ne tolère pas les tricheurs.

Séquences de référence

x = 1: A069246
x = 3: A215419
x = 7: A215420
x = 9: A215421

En relation: Trouver le plus grand nombre premier fragile / Trouver le plus petit nombre premier d'une sous - chaîne / Trouver le plus grand nombre premier qui est toujours un nombre premier après la suppression des chiffres

AdmBorkBork
la source

Réponses:

5

Pyth, 49 octets

Comme Python3 et d'autres réponses Pyth, le temps d'exécution pour trouver 100 nombres est prohibitif. (la suite de tests donne 10)

?}z"1379".f&!tPZ!|FmtPvjzc`Z]dhl`Z*TT3"Empty Set"

Essayez-le en ligne

Brian Tuck
la source
1
Le suivi "est inutile, très beau travail cependant.
FryAmTheEggman
Merci pour le rappel. Parce qu'EOL ne termine plus une chaîne, j'ai évité les chaînes non terminées, mais bien sûr, EOF fonctionne toujours
Brian Tuck
4

Python 3, 188 octets

x=input()
k=1
i=100
if x in"024568":i=print("Empty Set")
while i:k+=1;s=str(k);i-=all(sum(p%d<1for d in range(2,p))<4for p in[k*int(s[:j]+x+s[j:])for j in range(len(s)+1)])and not print(k)

Mal joué au golf, mais voici quelque chose pour l'instant. Au lieu de vérifier p in P and F(z,p) subset of P, nous vérifions qu'il p*fs'agit d'un semi-prime pour chacun f in F(z,p). Combinez cela avec la division d'essai pour les tests de primalité, et vous obtenez un O(scary)algorithme.

Sp3000
la source
+1 pourO(scary)
AdmBorkBork
1
Belle astuce pour régler i sur Aucun.
lirtosiast
3

Perl, 124 octets

$p=prime_iterator;y/1379//or$i=+~print'Empty Set'}while($i<100){$_=&$p;is_prime"$`@F$'"or redo while//g;$i++

Nécessite l'option de ligne de commande suivante:, -palMntheory=:allcompté comme 16. Entrée provenant de stdin.

Utilise le module de @DanaJMath::Prime::Util pour perl (chargé avec le pragma ntheory). Obtenez-le avec:

cpan install Math::Prime::Util
cpan install Math::Prime::Util::GMP

is_primeest déterministe pour toutes les valeurs inférieures à 2 64 , ce qui est suffisant pour nos besoins.


Exemple d'utilisation

$ echo 2|perl -palMntheory=:all oscary.pl
Empty Set

$ echo 7|perl -palMntheory=:all oscary.pl
3
19
97
433
487
541
691
757
853
1471
.
.
.
718705783
720574573
737773357
745157779
747215167
767717017
768743377
770294977
771778477
774577777

Temps d'exécution attendus

x = 1 : 1 m 09,2 s
x = 3 : 0 m 04,2 s
x = 7 : 2 m 52,5 s
x = 9 : 0 m 11,5 s

primo
la source
1

Pyth, 58

L}bPb|*"Empty Set"}Qj204568T.f&yZ.Amyi++<JjZTdQ>JdThl`Z100

Cette suite de tests ne calcule que les 10 premiers nombres car il faut beaucoup trop de temps pour générer le reste. La brutalité force à la fois la primauté et l'insertion des chiffres. Démontre de si mauvaises performances que je n'ai pas pu l'exécuter jusqu'à 100, alors dites-moi s'il y a des problèmes.

FryAmTheEggman
la source