Küba Asalları


20

Doğal bir numara Verilen , dönmek -inci Küba asal .nn

Küba Asalları

Küba asal formun asal sayıdır

p=x3-y3x-y

burada ve veyay>0x=1+yx=2+y

ayrıntılar

  • Size en uygun olanı 0 veya 1 tabanlı indeksleme kullanabilirsiniz.
  • Sen dönebilirsiniz endeksi verilen bırakanların asal veya birinci artan sırayla asal veya alternatif olarak artan sırada asal üreten sonsuz liste / jeneratör döndürebilir.nnn

Test senaryoları

İlk birkaç terim şu şekildedir:

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

OEIS'de daha fazla terim bulunabilir: Bunlar veya : A002407 ve A002648'e bağlı olarak iki diziye ayrılır.x=1+yx=2+y


2
Sıralanmamış ilk n primeri iade edebilir miyiz?
J42161217

@ J42161217 Hayır, primerler artan sırada olmalıdır.
Kusur

Yanıtlar:


23

JavaScript (V8) , 54 bayt

Küba asallarını sonsuza dek basan tam bir program.

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

Çevrimiçi deneyin!

Not: Eğer yazıcı sonsuz kağıt yoksa, tarayıcı konsolunda bu çalıştırmayı denemeyin nerede, print()farklı bir anlama sahip olabilir.


JavaScript (ES6),  63 61 60  59 bayt

İade oyunu bırakanların Küba asal, 1-endekslendi.n

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

Çevrimiçi deneyin!

Nasıl?

Bu, Küba primerlerinin formun primerleri olduğu gerçeğine dayanmaktadır:

pn=3n24+1,n3

Yukarıdaki formül şu şekilde yazılabilir:

pn={3n2+14 Eğer n garip3n2+44 Eğer n eşit

veya herhangi bir :y>0

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

olan için ve , sırasıyla.x3-y3x-yx=y+1x=y+2


7

05AB1E , 16 12 9 bayt

Sonsuz bir liste oluşturur. Kevin Cruijssen'in Arnaulds limanı formülü
ile 4 bayt kurtardı . Grimy sayesinde 3 bayt daha kurtardı

∞n3*4÷>ʒp

Çevrimiçi deneyin!

açıklama

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

Açıklamanızda bir yazım hatası yaptınız: " yığının bir kopyasını koymalısınızN^2+3 " olmalıdır 3*N^2. Ayrıca, neden )yerine ¯? Çünkü yazmak daha kolay mı? Ve bir nedenden dolayı NnN‚3*¬sO‚1 bayt daha kısa olabileceğini hissediyorum , ama görmüyorum. Hafif bir eşit bayt alternatifi Nn3*DN3*+‚. Ama muhtemelen sadece orada olmayan şeyleri görüyorum ..;) Güzel cevap, bu yüzden benden +1.
Kevin Cruijssen

1
Aslında 05AB1E'ye cevabımı vermeye çalıştım, ama perişan bir şekilde başarısız oldum. : D
Arnauld

1
Aslında, sonsuz bir liste oluşturmak daha uygundur: ∞n3 * 4
Grimmy

1
Tamam, kendileriyle çelişen özelliklere alışık değilim. :-)
WGroleau

6
@WGroleau Profesyonel olarak hiç yazılım geliştirmediğinizi düşünüyorum. Ben gözlük almak zaman daha endişeleniyorum yok kendilerini çelişiyor.
MikeTheLiar

7

R , 75 73 bayt

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

Çevrimiçi deneyin!

-2 bayt (farklı öncelik) *yerine kullanırsam destekleri kaldırabileceğimi fark ederek &.

Çıkışlar ninci Küba asal (1 endeksli).

Küba primerlerinin bazı n için p=1+3n2 veya 4p=1+3n2 formunda olduğu gerçeğini (OEIS'de verilen) kullanır , yani n = nn=ap13 ,a=1veyaa=4için bir tam sayıdır.

Hile bir ana formu olabilmesidir 2p=1+3n2 ya da 3p=1+3n2 (*), biz formülünü denetleyerek 2 bayt kaydedebilmek için a{1,2,3,4} ( 1:4) yerine a{1,4} ( c(1,4)).

Kodun hafifçe çözülmemiş sürümü:

# 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

(*) Resim asal bir şekilde olabilir 3p=1+3n2 , başka bir 1=3(pn2) ile bölünebilir olacak 3 .

Başka hiç asal diğer p=2 (Küba asal olmayan) formu olabilir 2p=1+3n2 : n tek olması gerekir, yani n=2k+1 . Genişletme 2p=4+12k(k+1) , bu nedenle p=2+6k(k+1) ve p eşit olur.


Küba başbakanında bir üst sınır kullanarak bir döngüden kaçınmaya ne dersiniz?
Xi'an

@ Xi'an Bunu düşündüm, ama böyle bir bağ kuramadım. Sen de var mı?
Robin Ryder

5

Wolfram Dili (Mathematica) , 66 65 56 bayt

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

Çevrimiçi deneyin!

  • J42161217 -1⌊ ⌋ yerine kullanarakFloor[ ]

  • attinat

    • -1⌊3#/4#⌋ yerine kullanarak⌊3#^2/4⌋
    • -8 için For[n=i=0,i<#,PrimeQ@f@++n&&i++]yerinen=2;i=#;While[i>0,i-=Boole@PrimeQ@f@++n]

1
65 bayt . Ppcg'ye hoş geldiniz. Güzel ilk cevap! +1
J42161217

Teşekkürler! (Uzun zaman pusuda.) Mevcut cevabınızı tam olarak ayrıştıramadım, bu yüzden kendi yazdım ve biraz daha kısa çıktı. Ben de bir Python yapabilirim.
speedstyle


@attinat Arnauld'un formülünün sadece n> 2 için çalıştığını düşündüm, bu yüzden 0 ile başlamamıştım - örneğinizde olduğu gibi tüm n için işe yarıyor (çünkü 1 1 4 7 13 başlıyor ... yani asallar 7 13. ..)
speedstyle

3

Java 8, 94 88 86 84 bayt

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

@SaraJ'ın Java prime checker'ını kullanarak -6 bayt , bu yüzden onu onayladığınızdan emin olun! @ OlivierGrégoire
sayesinde -2 bayt . Kontrol ettiğimiz ilk sayı olduğu için , Sara'yı baş denetleyiciden bırakabiliriz , bu da döngüyü sonlandıracaktır . -2 sayesinde bayt @ OlivierGrégoire adapte edilmesiyle @Arnauld 'cevabını.7%nn=1

Süresiz olarak sınırlandırılmış çıktılar verir.

Çevrimiçi deneyin.

Açıklama (eski 86 bayt sürümünün): TODO: Açıklamayı güncelle

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)

Gerçekten mümkün olduğunu düşünmüyorum, ama Küba primlerini bulmanın başka bir yolu bu formülü kullanıyor: 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);}belki birisi bunu golf oynamak için kullanabilir mi? Yapamadım.
Olivier Grégoire

1
Biraz daha kullanılmamış kaldırarak OlivierGrégoire Sen can golf senin @ ,pve değişen i+=++r%2*3,n+=iiçin n+=i+=++r%2*3, ama sonra yine 106 bayt en bitireceğiz. Java 11 's kullanma String#repeatprime-regex ile 105 bayt: 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

Evet, (şimdi açık olan) hatalarıma rağmen çok golf edilebilir olmadığını tahmin ettim. Sürüş yaptığınız için teşekkürler;)
Olivier Grégoire

@ OlivierGrégoire Belki de sizin için bilmek iyi, ama görünüşe göre Java'da daha kısa bir prime check döngüsü var. Düzenlememe ve SaraJ'ın ana kontrol yanıtına bakın.
Kevin Cruijssen

Yanılıyor olabilirim, ama son %ngerekli değil, değil mi?
Olivier Grégoire




1

Boşluk , 180 bayt

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

Harfler S(boşluk), T(sekme) ve N(yeni satır) yalnızca vurgulama olarak eklendi.
[..._some_action]yalnızca açıklama olarak eklendi.

Süresiz olarak sınırlandırılmış yeni satır çıktıları.

Çevrimiçi deneyin (yalnızca ham alanlar, sekmeler ve yeni satırlarla).

Sahte kodda açıklama:

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

Piton 3 , 110 108 102 bayt

Bu golfed prime denetleyiciyi kullanarak ve anonim sonsuz bir jeneratör döndüren Mathematica cevabım (ie isPrime(1+⌊¾n²⌋) else n++) için benzer yöntem

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

Çevrimiçi deneyin!

  • mypetlion -2 çünkü tartışmasız anonim üreticilere adlandırılmış olanlardan daha fazla izin verilir
  • -6 başlatarak count2'de + 1 böylece and x>1ödünç ana denetleyicisi I gereksizdir -7

Değişkene verilen cevap genellikle geçerli bir "çıktı" biçimi olarak kabul edilmez. Sonucun stdout'a çıkması veya bir işlev tarafından döndürülmesi için cevabınızı yeniden çalıştırabilir misiniz?
mypetlion

1
anonim işlevlere izin verildiğinden ve meydan okuma açıkça sonsuz bir jeneratöre izin verdiğinden, kaldırdım g=. Sadece ilk etapta dahil ettim çünkü TIO ile hızlı bir görselliğe izin verdi print(next(g) for i in range(52)).
speedstyle



1

Python 3 , 83 bayt

Küba asallarını sonsuza dek basar.

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)

Çevrimiçi deneyin!

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 bayt

Grimy sayesinde -2 bayt

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

Çevrimiçi deneyin!

Küba primlerinin tembel sonsuz listesini döndüren anonim kod bloğu. Bu, olası Küba primerlerini üretmek için Arnauld'un formülünü kullanır , sonra &is-primebunları filtrelemek için kullanılır.

Açıklama:

{                           }  # 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+|sadece olabilir1+|
Grimmy


0

APL (NARS), 98 karakter, 196 bayt

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

girintili:

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

Ölçek:

  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

dayanır: N'de y ise, olası bir Küba Başbakanı

S1=1+3y(y+1)

bir sonraki olası Küba Başbakanı

S2=3(y+1)+S1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.