Primes cubains


20

Étant donné un nombre naturel , renvoyez le -ième nombre cubain premier .nn

Primes cubains

Un nombre premier cubain est un nombre premier de la forme

p=X3-y3X-y

où et ouy>0X=1+yX=2+y

Détails

  • Vous pouvez utiliser une indexation basée sur 0 ou 1, selon ce qui vous convient le mieux.
  • Vous pouvez renvoyer le -ième nombre premier en fonction de l'indice ou des premiers nombres premiers dans l'ordre croissant, ou bien vous pouvez renvoyer une liste / un générateur infini qui produit les nombres premiers dans l'ordre croissant.nnn

Cas de test

Les premiers termes sont les suivants:

(#1-13)   7, 13, 19, 37, 61, 109, 127, 193, 271, 331, 397, 433, 547,
(#14-24) 631, 769, 919, 1201, 1453, 1657, 1801, 1951, 2029, 2269, 2437,
(#25-34) 2791, 3169, 3469, 3571, 3889, 4219, 4447, 4801, 5167, 5419,
(#35-43) 6211, 7057, 7351, 8269, 9241, 10093, 10267, 11719, 12097,
(#44-52) 12289, 13267, 13669, 13873, 16651, 18253, 19441, 19927, 20173

Plus de termes peuvent être trouvés sur OEIS: Ils sont divisés en deux séquences, selon que ou : A002407 et A002648X=1+yX=2+y


2
Peut-on renvoyer les n premiers nombres premiers non triés?
J42161217

@ J42161217 Non, les nombres premiers doivent être en ordre croissant.
flawr

Réponses:


23

JavaScript (V8) , 54 octets

Un programme complet qui imprime pour toujours les nombres premiers cubains.

for(x=0;;){for(k=N=~(3/4*++x*x);N%++k;);~k||print(-N)}

Essayez-le en ligne!

NB: Sauf si vous avez du papier infini dans votre imprimante, n'essayez pas de l'exécuter dans la console de votre navigateur , où cela print()peut avoir une signification différente.


JavaScript (ES6),  63 61 60  59 octets

Renvoie la du premier cuban, 1-indexés.n

f=(n,x)=>(p=k=>N%++k?p(k):n-=!~k)(N=~(3/4*x*x))?f(n,-~x):-N

Essayez-le en ligne!

Comment?

Ceci est basé sur le fait que les nombres premiers cubains sont des nombres premiers de la forme:

pn=3n24+1,n3

La formule ci-dessus peut s'écrire:

pn={3n2+14 if n is odd3n2+44 if n is even

ou pour tout :y>0

p2y+1=3(2y+1)2+14=3y2+3y+1
p2y+2=3(2y+2)2+44=3y2+6y+4

qui est pour et respectivement.x3y3xyx=y+1x=y+2


7

05AB1E , 16 12 9 octets

Génère une liste infinie.
4 octets enregistrés avec la formule du port d'Arnaulds de Kevin Cruijssen .
Enregistré encore 3 octets grâce à Grimy

∞n3*4÷>ʒp

Essayez-le en ligne!

Explication

∞          # on the list of infinite positive integers
 n3*4÷>    # calculate (3*N^2)//4+1 for each
       ʒp  # and filter to only keep primes

Vous avez fait une faute de frappe dans votre explication: " mettre une copie de N^2+3sur la pile " devrait l'être 3*N^2. Aussi, pourquoi au )lieu de ¯? Parce que c'est plus facile à taper? Et pour une raison quelconque, j'ai l'impression que le NnN‚3*¬sO‚peut être 1 octet plus court, mais je ne le vois pas. Une légère alternative à octets égaux est Nn3*DN3*+‚. Mais je ne vois probablement que des choses qui ne sont pas là ..;) Belle réponse, donc +1 de ma part.
Kevin Cruijssen

1
J'ai en fait essayé de porter ma réponse sur 05AB1E, mais j'ai échoué lamentablement. : D
Arnauld

1
En fait, générer une liste infinie est plus pratique: 9 octets avec ∞n3 * 4 ÷> ʒp
Grimmy

1
OK, je n'ai pas l'habitude des spécifications qui se contredisent. :-)
WGroleau

6
@WGroleau Je suppose que vous n'avez alors jamais développé de logiciel professionnel. Je suis plus inquiet lorsque j'obtiens des spécifications qui ne se contredisent pas.
MikeTheLiar

7

R , 75 73 octets

n=scan()
while(F<n)F=F+any(!(((T<-T+1)*1:4-1)/3)^.5%%1)*all(T%%(3:T-1))
T

Essayez-le en ligne!

-2 octets en remarquant que je peux supprimer les crochets si j'utilise à la *place de &(priorité différente).

Produit le npremier cubain (indexé 1).

Il utilise le fait (donné dans OEIS) que les nombres premiers cubains sont de la forme p=1+3n2 ou 4p=1+3n2 pour certains n , c'est-à-dire n=unep-13 est un entier pourune=1ouune=4.

L'astuce est qu'aucun nombre premier ne peut être de la forme 2p=1+3n2 ou 3p=1+3n2 (*), nous pouvons donc économiser 2 octets en vérifiant la formule pour une{1,2,3,4} ( 1:4) au lieu d' une{1,4} ( c(1,4)).

Version légèrement non golfée du code:

# F and T are implicitly initialized at 0 and 1
# F is number of Cuban primes found so far
# T is number currently being tested for being a Cuban prime
n = scan()                       # input
while(F<n){
  T = T+1                        # increment T 
  F = F +                        # increment F if
    (!all(((T*1:4-1)/3)^.5 %% 1) # there is an integer of the form sqrt(((T*a)-1)/3)
     & all(T%%(3:T-1)))          # and T is prime (not divisible by any number between 2 and T-1)
  }
T                                # output T

(*) Aucun nombre premier ne peut être de la forme 3p=1+3n2 , sinon 1=3(p-n2) serait divisible par 3 .

Aucun nombre premier autre que p=2 (qui n'est pas un nombre premier cubain) ne peut avoir la forme 2p=1+3n2 : n devrait être impair, c'est-à-dire n=2k+1 . L'expansion donne 2p=4+12k(k+1) , donc p=2+6k(k+1) et p serait pair.


qu'en est-il d'éviter une boucle en utilisant une borne supérieure sur le nième nombre cubain?
Xi'an

@ Xi'an J'y ai pensé, mais je n'ai pas pu trouver une telle limite. Avez-vous une?
Robin Ryder

5

Wolfram Language (Mathematica) , 66 65 56 octets

(f=1+⌊3#/4#⌋&;For[n=i=0,i<#,PrimeQ@f@++n&&i++];f@n)&

Essayez-le en ligne!

  • J42161217 -1 en utilisant ⌊ ⌋au lieu deFloor[ ]

  • attinat

    • -1 en utilisant ⌊3#/4#⌋au lieu de⌊3#^2/4⌋
    • -8 pour For[n=i=0,i<#,PrimeQ@f@++n&&i++]au lieu den=2;i=#;While[i>0,i-=Boole@PrimeQ@f@++n]

1
65 octets . Bienvenue à ppcg. Belle première réponse! +1
J42161217

Merci! (Rôdeur de longue date.) Je ne pouvais pas vraiment analyser votre réponse existante alors j'ai écrit la mienne et elle est sortie un peu plus courte. Je pourrais aussi en faire un en Python.
speedstyle


@attinat Je pensais que la formule d'Arnauld ne fonctionnait que pour n> 2, donc je n'ai pas commencé par 0 - bien que, comme dans votre exemple, cela fonctionne pour tout n (car il commence 1 1 4 7 13 ... donc les nombres premiers sont 7 13. ..)
speedstyle

3

Java 8, 94 88 86 84 octets

v->{for(int i=3,n,x;;System.out.print(x<1?++n+" ":""))for(x=n=i*i++*3/4;~n%x--<0;);}

-6 octets en utilisant le prime-checker Java de @SaraJ , alors assurez-vous de lui donner un vote positif!
-2 octets grâce à @ OlivierGrégoire . Étant donné que le premier nombre que nous vérifions est 7, nous pouvons supprimer la fin %ndu premier vérificateur de Sara, qui doit mettre fin à la boucle n=1.
-2 octets grâce à @ OlivierGrégoire en portant la réponse de @Arnauld .

Sorties indéfiniment délimitées par l'espace.

Essayez-le en ligne.

Explication (de l'ancienne version de 86 octets): TODO: Mettre à jour l'explication

pn=3n24+1,n3

v->{                     // Method with empty unused parameter and no return-type
  for(int i=3,           //  Loop-integer, starting at 3
          n,x            //  Temp integers
      ;                  //  Loop indefinitely:
      ;                  //    After every iteration:
       System.out.print( //     Print:
        n==x?            //      If `n` equals `x`, which means `n` is a prime:
         n+" "           //       Print `n` with a space delimiter
        :                //      Else:
         ""))            //       Print nothing
    for(n=i*i++*3/4+1,   //   Set `n` to `(3*i^2)//4+1
                         //   (and increase `i` by 1 afterwards with `i++`)
        x=1;             //   Set `x` to 1
        n%++x            //   Loop as long as `n` modulo `x+1`
                         //   (after we've first increased `x` by 1 with `++x`)
             >0;);}      //   is not 0 yet
                         //   (if `n` is equal to `x`, it means it's a prime)

Je ne pense pas vraiment que ce soit faisable, mais une autre façon de trouver les nombres premiers cubains utilise cette formule: v->{for(int n=7,i=3,p,x,d,r=0;;i+=++r%2*3,n+=i,System.out.print(x>1?x+" ":""))for(x=n,d=1;++d<n;x=x%d<1?0:n);}peut-être que quelqu'un peut l'utiliser pour jouer au golf? Je ne pouvais pas.
Olivier Grégoire

1
@ OlivierGrégoire Vous pouvez jouer le vôtre un peu plus en supprimant le non utilisé ,pet en le changeant i+=++r%2*3,n+=ien n+=i+=++r%2*3, mais je finirai quand même à 106 octets. Utilisation de Java 11 de String#repeatPremier-regex est de 105 octets: v->{for(int n=7,i=3,r=0;;n+=i+=++r%2*3)if(!"x".repeat(n).matches(".?|(..+?)\\1+"))System.out.println(n);}.
Kevin Cruijssen

Ouais, j'ai deviné que ce n'était pas beaucoup jouable au golf malgré mes erreurs (maintenant évidentes). Merci de l'avoir fait rouler;)
Olivier Grégoire

@ OlivierGrégoire Peut-être aussi bon à savoir pour vous, mais il y a apparemment une boucle de vérification de prime plus courte en Java. Voir ma modification et la réponse principale de SaraJ.
Kevin Cruijssen

Je me trompe peut-être, mais la dernière %nn'est pas requise, n'est-ce pas?
Olivier Grégoire




1

Espace , 180 octets

[S S S T    S N
_Push_2][S N
S _Duplicate][N
S S N
_Create_Label_OUTER_LOOP][S N
N
_Discard_top_stack][S S S T N
_Push_1][T  S S S _Add][S N
S _Duplicate][S N
S _Duplicate][T S S N
_Multiply][S S S T  T   N
_Push_3][T  S S N
_Multiply][S S S T  S S N
_Push_4][T  S T S _Integer_divide][S S S T  N
_Push_1][T  S S S _Add][S S S T N
_Push_1][S N
S _Duplicate_1][N
S S S N
_Create_Label_INNER_LOOP][S N
N
_Discard_top_stack][S S S T N
_Push_1][T  S S S _Add][S N
S _Duplicate][S N
S _Duplicate][S T   S S T   T   N
_Copy_0-based_3rd][T    S S T   _Subtract][N
T   S T N
_Jump_to_Label_PRINT_if_0][S T  S S T   S N
_Copy_0-based_2nd][S N
T   _Swap_top_two][T    S T T   _Modulo][S N
S _Duplicate][N
T   S S S N
_Jump_to_Label_FALSE_if_0][N
S N
S N
_Jump_to_Label_INNER_LOOP][N
S S T   N
_Create_Label_PRINT][T  N
S T _Print_as_integer][S S S T  S T S N
_Push_10_(newline)][T   N
S S _Print_as_character][S N
S _Duplicate][N
S S S S N
_Create_Label_FALSE][S N
N
_Discard_top_stack][S N
N
_Discard_top_stack][N
S N
N
_Jump_to_Label_OUTER_LOOP]

Lettres S(espace), T(tabulation) et N(nouvelle ligne) ajoutées uniquement en surbrillance.
[..._some_action]ajouté à titre d'explication uniquement.

Sorties indéfiniment délimitées par des sauts de ligne.

Essayez-le en ligne (avec des espaces bruts, des tabulations et des nouvelles lignes uniquement).

Explication en pseudo-code:

pn=3n24+1,n3

Integer i = 2
Start OUTER_LOOP:
  i = i + 1
  Integer n = i*i*3//4+1
  Integer x = 1
  Start INNER_LOOP:
    x = x + 1
    If(x == n):
      Call function PRINT
    If(n % x == 0):
      Go to next iteration of OUTER_LOOP
    Go to next iteration of INNER_LOOP

function PRINT:
  Print integer n
  Print character '\n'
  Go to next iteration of OUTER_LOOP

1

Python 3 , 110 108 102 102 octets

Méthode similaire à ma réponse Mathematica (c.-à-d. isPrime(1+⌊¾n²⌋) else n++) En utilisant ce vérificateur principal golfé et en renvoyant un générateur infini anonyme

from itertools import*
(x for x in map(lambda n:1+3*n**2//4,count(2)) if all(x%j for j in range(2,x)))

Essayez-le en ligne!

  • mypetlion -2 parce que les générateurs sans doute anonymes sont plus autorisés que ceux nommés
  • -6 en commençant countà 2 +1, de sorte que and x>1dans le vérificateur principal que j'ai emprunté est inutile -7

La réponse entrant dans une variable n'est généralement pas considérée comme une forme valide de "sortie". Pourriez-vous retravailler votre réponse afin que le résultat soit soit sorti vers stdout soit retourné par une fonction?
mypetlion

1
puisque les fonctions anonymes sont autorisées et que le défi autorise explicitement un générateur infini, je l'ai supprimé g=. Je l'avais seulement inclus en premier lieu car il permettait un visuel rapide sur TIO avec print(next(g) for i in range(52)).
speedstyle



1

Python 3 , 83 octets

imprime les nombres premiers cubains pour toujours.

P=k=1
while 1:P*=k*k;x=k;k+=1;P%k>0==((x/3)**.5%1)*((x/3+.25)**.5%1-.5)and print(k)

Essayez-le en ligne!

X=1+yX=2+y

p=(1+y)3-y3(1+y)-y=1+3y+3y2y=-12±14+p-13

p=(2+y)3-y3(1+y)-y=4+6y+3y2y=-1±p-13
y±-1


1

Perl 6 , 33 31 octets

-2 octets grâce à Grimy

{grep &is-prime,1+|¾*$++²xx*}

Essayez-le en ligne!

Bloc de code anonyme qui renvoie une liste infinie paresseuse de nombres premiers cubains. Celui-ci utilise la formule d' Arnauld pour générer des nombres premiers cubains possibles, puis &is-primepour les filtrer.

Explication:

{                           }  # Anonymous code block
 grep &is-prime,               # Filter the primes from
                         xx*   # The infinite list
                   ¾*          # Of three quarters
                     $++²      # Of an increasing number squared
                1+|            # Add one by ORing with 1

1
1+0+|peut être juste1+|
Grimmy


0

APL (NARS), 98 caractères, 196 octets

r←h w;y;c;v
r←c←y←0⋄→4
→3×⍳∼0πv←1+3×y×1+y+←1⋄r←v⋄→0×⍳w≤c+←1
→2×⍳∼0πv+←3×y+1⋄c+←1⋄r←v
→2×⍳w>c

en retrait:

r←h w;y;c;v
r←c←y←0⋄→4
    →3×⍳∼0πv←1+3×y×1+y+←1⋄r←v⋄→0×⍳w≤c+←1
    →2×⍳∼0πv+←3×y+1⋄c+←1⋄r←v
    →2×⍳w>c

tester:

  h ¨1..20
7 13 19 37 61 109 127 193 271 331 397 433 547 631 769 919 1201 1453 1657 1801 
  h 1000
25789873
  h 10000
4765143511

il est basé sur: si y dans N, un premier cubain possible est

S1=1+3y(y+1)

le prochain Cuban Prime possible sera

S2=3(y+1)+S1
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.