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,n≥3

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=a⋅p−13 ,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(p−n2) 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,n≥3

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,n≥3

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+3y2⇔y=-12±14+p-13

p=(2+y)3-y3(1+y)-y=4+6y+3y2⇔y=-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.