Kubanische Primzahlen

20

Geben Sie bei einer natürlichen Zahl n die n te kubanische Primzahl zurück .

Kubanische Primzahlen

Eine kubanische Primzahl ist eine Primzahl der Form

p=x3y3xy

wobei y>0 und x=1+y oder x=2+y

Einzelheiten

  • Sie können eine auf 0 oder 1 basierende Indizierung verwenden, je nachdem, was für Sie am besten geeignet ist.
  • Sie können die n te Primzahl mit dem Index n oder den ersten n Primzahlen in aufsteigender Reihenfolge zurückgeben, oder Sie können eine unendliche Liste / einen Generator zurückgeben, der die Primzahlen in aufsteigender Reihenfolge erzeugt.

Testfälle

Die ersten Begriffe lauten wie folgt:

(#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

Weitere Begriffe finden Sie in OEIS: Sie werden in zwei Sequenzen aufgeteilt, je nachdem, ob x=1+y oder x=2+y : A002407 und A002648

fehlerhaft
quelle
2
Können wir die ersten n nicht sortierten Primzahlen zurückgeben?
J42161217
@ J42161217 Nein, die Primzahlen sollten in aufsteigender Reihenfolge angegeben werden.
14.

Antworten:

23

JavaScript (V8) , 54 Byte

Ein vollständiges Programm, das kubanische Primzahlen für immer druckt.

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

Probieren Sie es online!

NB: Wenn sich in Ihrem Drucker kein unbegrenztes Papier befindet, versuchen Sie nicht, dies in Ihrer Browserkonsole auszuführen , da dies print()möglicherweise eine andere Bedeutung hat.


JavaScript (ES6),  63 61 60  59 Bytes

Gibt die n te kubanische Primzahl mit einem Index zurück.

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

Probieren Sie es online!

Wie?

Dies beruht auf der Tatsache, dass kubanische Primzahlen Primzahlen der Form sind:

pn=3n24+1,n3

Die obige Formel kann wie folgt geschrieben werden:

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

oder für jedes y>0 :

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

das ist x3y3xy fürx=y+1bzw.x=y+2.

Arnauld
quelle
7

05AB1E , 16 12 9 Bytes

Erzeugt eine unendliche Liste.
4 Bytes mit Kevin Cruijssens Port-of-Arnaulds-Formel gespeichert .
Weitere 3 Bytes dank Grimy gespeichert

∞n3*4÷>ʒp

Probieren Sie es online!

Erläuterung

∞          # on the list of infinite positive integers
 n3*4÷>    # calculate (3*N^2)//4+1 for each
       ʒp  # and filter to only keep primes
Emigna
quelle
Sie haben in Ihrer Erklärung einen Tippfehler gemacht: " Eine Kopie von N^2+3auf den Stapel legen " sollte sein 3*N^2. Auch warum das )statt ¯? Weil es einfacher ist zu tippen? Und aus irgendeinem Grund habe ich das Gefühl, dass das NnN‚3*¬sO‚1 Byte kürzer sein kann, aber ich sehe es nicht. Eine leichte Gleichbyte-Alternative ist Nn3*DN3*+‚. Aber ich sehe wahrscheinlich nur Dinge, die nicht da sind.;) Nette Antwort, also +1 von mir.
Kevin Cruijssen
1
Ich habe tatsächlich versucht, meine Antwort auf 05AB1E zu portieren, bin aber kläglich gescheitert. : D
Arnauld
1
Tatsächlich ist es praktischer, eine unendliche Liste zu erstellen
Grimmy
1
OK, ich bin nicht an Spezifikationen gewöhnt, die sich widersprechen. :-)
WGroleau
6
@WGroleau Ich gehe davon aus, dass Sie Software damals noch nie professionell entwickelt haben. Ich mache mir mehr Sorgen, wenn ich Spezifikationen erhalte, die sich nicht widersprechen.
MikeTheLiar
7

R , 75 73 Bytes

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

Probieren Sie es online!

-2 Bytes, indem ich bemerke, dass ich Klammern entfernen kann, wenn ich *stattdessen verwende &(anderer Vorrang).

Gibt das aus nth Cuban prime (1-indexed).

p=1+3n2 or 4p=1+3n2 for some n, i.e. n=einp-13 is an integer for ein=1 or ein=4.

2p=1+3n23p=1+3n2ein{1,2,3,4}1:4a{1,4} (c(1,4)).

Slightly ungolfed version of the 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

(*) No prime can be of the form 3p=1+3n2, else 1=3(pn2) would be divisible by 3.

No prime other than p=2 (which isn't a Cuban prime) can of the form 2p=1+3n2: n would need to be odd, i.e. n=2k+1. Expanding gives 2p=4+12k(k+1), hence p=2+6k(k+1) and p would be even.

Robin Ryder
quelle
what about avoiding a loop by using an upper bound on the nth Cuban prime?
Xi'an
@Xi'an I thought about that, but couldn't come up with such a bound. Do you have one?
Robin Ryder
5

Wolfram Language (Mathematica), 66 65 56 bytes

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

Try it online!

  • J42161217 -1 by using ⌊ ⌋ instead of Floor[ ]

  • attinat

    • -1 by using ⌊3#/4#⌋ instead of ⌊3#^2/4⌋
    • -8 for For[n=i=0,i<#,PrimeQ@f@++n&&i++] instead of n=2;i=#;While[i>0,i-=Boole@PrimeQ@f@++n]
speedstyle
quelle
1
65 bytes. Welcome to ppcg. Nice first answer! +1
J42161217
Thanks! (Long time lurker.) I couldn't quite parse your existing answer so I wrote my own and it came out a little shorter. I might do a Python one too.
speedstyle
2
56 bytes
attinat
@attinat I thought Arnauld's formula only worked for n>2 so I didn't start with 0 - although as in your example it works for all n (because it starts 1 1 4 7 13 ... so the primes are 7 13 ...)
speedstyle
3

Java 8, 94 88 86 84 bytes

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

-6 bytes by using the Java prime-checker of @SaraJ, so make sure to upvote her!
-2 bytes thanks to @OlivierGrégoire. Since the first number we check is 7, we can drop the trailing %n from Sara's prime-checker, which is to terminate the loop for n=1.
-2 bytes thanks to @OlivierGrégoire by porting @Arnauld's answer.

Outputs space-delimited indefinitely.

Try it online.

Explanation (of the old 86 bytes version): TODO: Update explanation

Uses the formula of @Arnauld's JavaScript answer: 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)
Kevin Cruijssen
quelle
I don't really think it's feasible, but another way of finding the cuban primes uses this formula: 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);}, maybe someone can use this to golf? I couldn't.
Olivier Grégoire
1
@OlivierGrégoire You can golf yours a bit more by removing the unused ,p and changing i+=++r%2*3,n+=i to n+=i+=++r%2*3, but then I'll still end up at 106 bytes. Using Java 11's String#repeat with prime-regex is 105 bytes: 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
Yeah, I guessed it wasn't much golfable despite my (now obvious) mistakes. Thanks for giving it a ride ;)
Olivier Grégoire
@OlivierGrégoire Maybe also good to know for you, but there is apparently a shorter prime-check loop in Java. See my edit and SaraJ's prime-check answer.
Kevin Cruijssen
I might be wrong, but the last %n isn't required, is it?
Olivier Grégoire
1

Wolfram Language (Mathematica), 83 bytes

This solution will output the n-th Cuban prime with the added benefits of being fast and remembering all previous results in the symbol f.

(d:=1+3y(c=1+y)+3b c;e:=If[PrimeQ@d,n++;f@n=d];For[n=y=b=0,n<#,e;b=1-b;e,y++];f@#)&

Try it online!

Kelly Lowder
quelle
1

Whitespace, 180 bytes

[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]

Letters S (space), T (tab), and N (new-line) added as highlighting only.
[..._some_action] added as explanation only.

Outputs newline-delimited indefinitely.

Try it online (with raw spaces, tabs, and new-lines only).

Explanation in pseudo-code:

Port of my Java 8 answer, which also uses the formula from @Arnauld's JavaScript answer: 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
Kevin Cruijssen
quelle
1

Python 3, 110 108 102 bytes

Ähnliche Methode zu meiner Mathematica-Antwort (dh isPrime(1+⌊¾n²⌋) else n++) unter Verwendung dieses Golf-Prime-Checkers und Zurückgeben eines anonymen unendlichen Generators

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)))

Probieren Sie es online!

  • mypetlion -2, weil wohl anonyme Generatoren mehr erlaubt sind als namentlich genannte
  • -6 indem ich countbei 2 +1 beginne, so dass der and x>1in der Primzahl ausgeborgte Checker unnötig ist -7
Speedstyle
quelle
Die Antwort, die in eine Variable eingegeben wird, wird normalerweise nicht als gültige Form der "Ausgabe" betrachtet. Könnten Sie Ihre Antwort überarbeiten, sodass das Ergebnis entweder auf stdout ausgegeben oder von einer Funktion zurückgegeben wird?
mypetlion
1
da anonyme funktionen erlaubt sind und die herausforderung explizit einen unendlichen generator zulässt, habe ich das entfernt g=. Ich hatte es nur an erster Stelle aufgenommen, weil es ein schnelles Visualisieren auf TIO mit ermöglichte print(next(g) for i in range(52)).
Speedstyle
1

Japt , 14 13 Bytes

Adaptiert von Arnauld's Formel . 1-indiziert.

@µXj}f@Ò(X²*¾

Versuch es

1 Byte gespart dank AusführungsformVerfügbarkeit.

Zottelig
quelle
13 Bytes? Nicht gründlich getestet.
Verkörperung der Ignoranz
Vielen Dank, @EmbodimentofIgnorance. Ich hatte es versucht, aber es funktionierte nicht. Es stellte sich heraus, dass ich das vergessen hatte (.
Shaggy
1

Schläger , 124 Bytes

(require math)(define(f n[i 3])(let([t(+(exact-floor(* 3/4 i i))1)][k(+ 1 i)])(if(prime? t)(if(= 0 n)t(f(- n 1)k))(f n k))))

Probieren Sie es online!

Gibt die n-te kubanische Primzahl mit dem Index 0 zurück.

Verwendet die Formel der JavaScript-Antwort von @ Arnauld

Galen Ivanov
quelle
1

Python 3 , 83 Bytes

druckt die kubanischen Primzahlen für immer.

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)

Probieren Sie es online!

Basierend auf diesem Prime Generator. Für jede Primzahl wird geprüft, ob eine ganze Zahl y existiert, die die Gleichung für eine von beiden erfülltx=1+y oder x=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
Da ist uns nur egal ob y Hat man eine ganzzahlige Lösung, können wir die ignorieren ± und -1.

ovs
quelle
1

Perl 6 , 33 31 Bytes

-2 Bytes dank Grimy

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

Probieren Sie es online!

Anonymer Codeblock, der eine unendliche Liste fauler kubanischer Primzahlen zurückgibt. Hierbei wird die Formel von Arnauld verwendet , um mögliche kubanische Primzahlen zu generieren und diese dann &is-primezu filtern.

Erläuterung:

{                           }  # 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
Scherzen
quelle
1
1+0+|kann nur sein1+|
Grimmy
0

APL (NARS), 98 Zeichen, 196 Byte

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

eingerückt:

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

Prüfung:

  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

es basiert auf: wenn y in N ist, ist ein möglicher kubanischer Prime

S1=1+3y(y+1)

der nächste mögliche kubanische Premier wird sein

S2=3(y+1)+S1
RosLuP
quelle