Différentes façons de définir des nombres premiers


32

L'une de mes définitions préférées des nombres premiers est la suivante:

  • 2 est le plus petit nombre premier.

  • Les nombres supérieurs à 2 sont premiers s'ils ne sont pas divisibles par un plus petit nombre premier.

Cependant cette définition semble arbitraire, pourquoi 2? Pourquoi pas un autre numéro? Eh bien, essayons d'autres nombres qui définiront n-prime de telle sorte que

  • n est le plus petit n-premier.

  • Les nombres supérieurs à n sont n-premiers s'ils ne sont pas divisibles par un n-premier plus petit.

Tâche

La tâche ici est d'écrire un programme qui prend deux entrées, un entier positif n et un entier positif a . Il décidera alors si a est n -prime. Votre programme doit afficher deux valeurs distinctes, une pour «oui, c'est n-prime» et une pour «non, ce n'est pas n-prime».

C'est une question de code-golf donc les réponses seront notées en octets avec moins d'octets étant mieux.

Des tests

Voici les listes des 31 premiers nombres premiers pour n = 2 à n = 12 (1 est le seul nombre à 1 nombre premier)

n=2: [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=3: [3,4,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=4: [4,5,6,7,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=5: [5,6,7,8,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=6: [6,7,8,9,10,11,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=7: [7,8,9,10,11,12,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=8: [8,9,10,11,12,13,14,15,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=9: [9,10,11,12,13,14,15,16,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=10: [10,11,12,13,14,15,16,17,18,19,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=11: [11,12,13,14,15,16,17,18,19,20,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=12: [12,13,14,15,16,17,18,19,20,21,22,23,25,27,29,31,33,35,37,41,43,47,49,53,55,59,61,67,71,73,77]

4
n=6, a=15est le premier cas de test intéressant.
Neil

6
C'est le premier endroit où le non-modèle "a est n-premier si n≤a <2n ou (a≥2n et a est premier)" se décompose.
Misha Lavrov

2
"Les nombres supérieurs à 2 sont premiers s'ils ne sont pas divisibles par un plus petit nombre premier." - Cette définition permet à n'importe quel nombre d'être premier. Peut-être voulez-vous dire ssi plutôt que si ?

5
@ThePirateBay Je ne veux pas dire le sens mathématique précis du mot si. Je vais le quitter.
Wheat Wizard

1
@JeppeStigNielsen Ce n'est pas très difficile à prouver. Tous les nombres composites n-premiers ne doivent avoir que des facteurs premiers inférieurs à n. Nous savons également qu'aucun sous-ensemble de leurs facteurs ne peut avoir un produit supérieur à n car notre nombre serait divisible par cela. Ainsi, chaque n-premier est soit 2-premiers ou le produit de 2 nombres inférieurs à n. Il n'y a qu'un nombre fini de couples de nombres inférieurs à n, donc il n'y a qu'un nombre fini de nombres composites n-premiers. J'espère que cela a du sens, j'ai dû abréger pour l'adapter dans un commentaire.
Wheat Wizard

Réponses:




4

Python 3 , 45 octets

lambda i,k:(i>k)<all(k%r for r in range(i,k))

Essayez-le en ligne!

Comment ça marche

Cela prend deux entiers en entrée, i et k . Vérifiez d'abord si k ≥ i . Génère ensuite la plage [i, k) et pour chaque entier N dans cette plage, vérifie si N est coprime à k . Si les deux conditions sont remplies, alors k est un i -prime.


Vous ne pouvez pas utiliser à la &place de andet >=iau lieu de >i-1?
Wheat Wizard

@WheatWizard >=i est toujours de 4 octets (en raison de l'espace).
Neil

@Neil Si vous changez pour &vous n'avez pas besoin d'espace.
Wheat Wizard


4

R , 44 37 octets

function(a,n)a==n|a>n&all(a%%n:(a-1))

Essayez-le en ligne!

-7 octets grâce à Giuseppe

Renvoie TRUEsi

  • aest égal à nou ( a==n|)
  • aest supérieur à n et ( a>n&) pour chaque nombre k de nà a-1, an'est pas divisible par k ( all(a%%n:(a-1)))

Retourne FALSEautrement


Bienvenue chez PPCG! Grande première réponse!
FantaC

3

J, 30 octets

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:

Essayez-le en ligne!

Prend la valeur de départ comme argument de droite et la valeur à vérifier dans l'argument de gauche.

Je me suis trompé à l'origine et je n'ai pas tenu compte des arguments laissés moins que le nombre premier de départ. Je suis quelque peu mécontent de la longueur de ma solution maintenant.

Explication

Soit xl'argument de gauche (la valeur à vérifier) ​​et yl'argument de droite (le premier de départ).

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:
                          ^:>:  Execute left argument if x >= y
                     i.@[         Create range [0..x]
                   ]+             Add y to it (range now: [y..x+y])
                |/~               Form table of residues
            0=                    Equate each element to 0
          +/                      Sum columns
      1=                          Equate to 1
    -{                            Take the element at position x-y
>:*                             Multiply by result of x >= y

Remarques

L'élément en position x-yest le résultat d'un test de primalité pour x(puisque nous avons ajouté yà la plage d'origine).

La multiplication par x >: ygarantit que nous obtenons une valeur de falsey ( 0) pour xmoins de y.


3

JavaScript (ES6), 33 32 30 octets

Prend des entrées dans la syntaxe de currying (n)(a). Renvoie un booléen.

n=>p=(a,k=a)=>k%--a?p(a,k):a<n

Démo


3

Haskell , 30 octets

2 octets économisés grâce à l'idée de H.PWiz qui a été empruntée à la réponse de flawr

n!a=[1]==[1|0<-mod a<$>[n..a]]

Essayez-le en ligne!

Ok depuis que ça fait un moment, et la seule réponse Haskell jusqu'à présent est de 45 btyes, j'ai décidé de poster ma propre réponse.

Explication

Cette fonction vérifie que le seul nombre entre n et un qui a est divisible par est un lui - même.

Maintenant, la définition ne mentionne que n -primes inférieurs à a , alors pourquoi vérifions -nous tous ces nombres supplémentaires? N'aurons- nous pas de problèmes quand a est divisible par un composé n plus grand que n ?

Nous ne le ferons pas car s'il existe un n -composite supérieur à n, il doit être divisible par un n -prime plus petit par définition. Ainsi, s'il divise a , le plus petit n -prime doit l' être.

Si a est inférieur à n, il [n..a] ne peut []donc pas être égal, [1]ce qui entraîne l'échec de la vérification.





1

dc , 40 34 37 octets

[0p3Q]sf?se[dler%0=f1+dle>u]sudle>u1p

J'aurais inclus un lien TIO, mais TIO semble porter une distribution défectueuse de dcvoir comment cela fonctionne comme prévu sur mon système, mais la Qcommande fonctionne par erreur sur TIO. Au lieu de cela, voici un lien vers un bashterrain d'essai avec une version fonctionnant correctement de dc:

Démo!


1

APL (Dyalog) , 24 octets

{⍵∊o/⍨1=+/¨0=o|⍨⊂o←⍺↓⍳⍵}

Essayez-le en ligne!

Comment?

⍳⍵- 1àa

o←⍺↓- nà a, enregistrer danso

o|⍨⊂o- modulo chaque élément oavec chaque élémento

0=- vérifier où il est égal 0(divise)

+/¨ - additionner le nombre de divisions

1= - si nous n'en avons qu'un, le nombre n'est divisé que par lui-même

o/⍨ - donc on garde ces occurrences

⍵∊- est adans ce tableau résiduel?



0

JavaScript ES5, 34 octets

for(a=i=(p=prompt)();a%--i;);i<p()

0

Ajouter ++ , 20 octets

L,2Dx@rBcB%B]b*!!A>*

Essayez-le en ligne!

L,   - Create a lambda function
     - Example arguments:  [5 9]
  2D - Copy below; STACK = [5 9 5]
  x  - Repeat;     STACK = [5 9 [9 9 9 9 9]]
  @  - Reverse;    STACK = [[9 9 9 9 9] 5 19] 
  r  - Range;      STACK = [[9 9 9 9 9] [5 6 7 8 9]]
  Bc - Zip;        STACK = [[9 5] [9 6] [9 7] [9 8] [9 9]]
  B% - Modulo;     STACK = [4 3 2 1]
  B] - Wrap;       STACK = [[4 3 2 1]]
  b* - Product;    STACK = [24]
  !! - Boolean;    STACK = [1]
  A  - Arguments;  STACK = [1 5 9]
  >  - Greater;    STACK = [1 1]
  *  - Product;    STACK = [1]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.