A083569: En küçük m + n asal olacak şekilde daha erken oluşmuyor


26

1 indeksli bir diziyi aşağıdaki gibi tanımlayın:

  • A083569(1) = 1
  • A083569(n)nerede nbüyük bir tam sayı olduğu 1, en küçük tam sayı m olduğu daha önce böyle meydana olmayan m+nbir asal sayıdır.

Senin görevin almak nve geri dönmek A083569(n).

 n  A083569(n)
 1  1
 2  3
 3  2
 4  7
 5  6
 6  5
 7  4
 8  9
 9  8
10 13
11 12
12 11
13 10
14 15
15 14
16 21
17 20
18 19
19 18
20 17

Daha testcases bulunabilir burada . OEIS üzerindeki orijinal sekans burada bulunabilir .

Bu . Bayt cinsinden en kısa cevap kazanır. Standart boşluklar uygulanır.


@ Mr.Xcoder "1-indeksli bir diziyi aşağıdaki gibi tanımlayın"
Leaky Nun

Yanıtlar:


14

Haskell , 87 86 83 80 74 69 bayt

3 bayt kazandıran bazı değişiklikler önerdiğiniz için xnor'a teşekkürler!

f n=[m|m<-[1..],all((>0).mod(n+m))[2..n+m-1],all((/=m).f)[1..n-1]]!!0

Çevrimiçi deneyin!

Haskell ve Haskell golf oynamak için yeniyim, geri bildiriminiz için teşekkür ederiz!

açıklama

Bir fonksiyon tanımlarız f n. Listenin f nilk elemanı olarak tanımlarız !!0:

[m|m<-[1..],all((>0).mod(n+m))[2..n+m-1],all((/=m).f)[1..n-1]]

Bu bozuldu:

[m|          # Numbers m
m<-[1..],    # From the integers greater than 0
all          # Forall x
(>0).mod(n+m)# n+m mod x is not zero
[2..n+m-1]   # from the integers from 2 to n+m-1
all          # Forall
((/=m).f)    # when f is applied the result is not m
[1..n-1]     # from the integers from 1 to n-1

3
Haskell golfüne hoş geldiniz! [2,3..]Sadece olabilir [2..]1 ile yukarı sayma varsayılan. Bir yerleşik var notElem.
xnor

@xnor Teşekkürler! Kullanarak daha iyi bir yol buldum notElemama ilk ipucu yardımcı oldu ve ikincisini arka cebimde tutacağımdan emin olacağım.
Buğday Sihirbazı

Yeni revizyonunuz f 1yanlış anlaşılıyor gibi görünüyor , 1 olmalı
xnor 5

@xnor Sabit, ne yazık ki 3 bayt pahasına.
Buğday Sihirbazı,

6

Jöle , 16 15 bayt

Rɓ²R+⁸ÆPTḟḢṭµ/Ṫ

Bu, A083569 (n) ≤ n² ( varsayımın doğrusal olarak büyüdüğü görülüyor) olarak kabul edilir.

Çevrimiçi deneyin!

Nasıl çalışır

Rɓ²R+⁸ÆPTḟḢṭµ/Ṫ  Main link. Argument: n

R                Range; yield [1, ..., n].
 ɓ               Begin a dyadic chain with swapped arguments.
            µ/   Reduce the range by that chain.
                 If we call the chain f, this computes f(2,1), then f(3,f(2,1)),
                 then f(4,f(3,f(2,1)), etc.
                 The left argument is an integer k, the right one an array A.
  ²                Square; yield k².
   R               Range; yield [1, ..., k²].
    +⁸             Add k, yielding [1+k, ..., k²+k].
      ÆP           Test each sum for primality.
        T          Truth; get all indices of 1‘s. This finds all m in [1, ..., k²]
                   such that m+k is prime.
         ḟ         Filterfalse; remove all resulting elements that appear in A.
          Ḣ        Head; extract the first remaining result.
           ṭ       Tack; append the extracted integer to A.
                 This computes the first n elements of the sequence.
              Ṫ  Tail; extract the last, n-th element.

4
Nitekim, A083569(n)en çok, en nfazla n, en fazla Rosser-Schoenfeld'in sonuçlarından daha az olan, en fazla 2nbirinci olan tanımından n≥3daha büyüktür 4n*log(n).
Greg Martin

@GregMartin bunu doğrularken, hala yapmak için oldukça vahşi bir varsayım ...
Esolanging Fruit

4
@ Challenger5 Ben "eğitimli tahmin" tercih ederim.
Dennis

6

Pyth - 18 17 15 bayt

Beni iki bayt kurtardığı için @ isaacg'a teşekkürler!

Bu siteye geri döndükten sonra, bir süre meşgul olduktan sonra, umarım bunu daha da golf oynayacak.

esmaYf&-TYP_+Th

Burada çevrimiçi deneyin .


4
PPCG'ye tekrar hoş geldiniz!
Leaky Rahim

@LeakyNun Thanks :)
Maltysen

1
-TY!/YTAynı durumda , bir bayt daha kısa ve truthy.
isaacg

Sen değiştirerek başka byte kaydedebilirsiniz +hdTiçin +Th.
isaacg

@isaacg, oh ilk elemanı listeye mi koyuyor? Bu gerçekten havalı.
Maltysen

3

C # (.NET Core) , 169 bayt

n=>{if(n<2)return 1;var p=new int[n-1];int i=0,j,s;for(;i<n-1;)p[i]=f(++i);for(i=1;;i++){for(j=2,s=i+n;j<s&&s%j++>0;);if(j==s&!System.Array.Exists(p,e=>e==i))return i;}}

Çevrimiçi deneyin!

Şimdiye kadar sonuçları hesaplamak için en verimsiz yol, bu nedenle lütfen bu kod f(n)için hesaplama yapmaktan kaçının n>=30. İlk adım yinelemeli değerleri hesaplamaktır f(1)için f(n-1)ve sonra hesapla geçin f(n)ilk arayarak iböyle n+iasal ve iönceki değerler listesinde değil.


3

x86-64 Meclisi, 57 55 bayt

Golf oynamak için yeniyim, bu nedenle yorumlarınız / yorumlarınız için teşekkür ederiz.

Not: Bu, kaynak uzunluğu için değil makine kodu uzunluğu için optimize edilmiştir.

0: 89 f8 ff cf 74 32 97 89 fe 89 f1 ff c6 89 f0 99
1: f7 f1 85 d2 e0 f7 85 c9 75 ed 89 f9 ff c9 56 29
2: fe 56 57 51 89 fc e8 d3 ff ff ff 59 5f 5e 39 c6
3: e0 ef 96 5e 74 d1 c3

İmzasız bir 32-bit tamsayı alan ve en küçük m'yi döndüren standart bir kuralı (yani eax cinsinden dönüş değeri, edig'deki ilk argüman, ebx hariç arayanların tümü kaydedilmiş) kullanan bir işlev tanımlar.

Kaynak:

    .globl a083569
    // edi = original, probably don't touch
    // esi = candidate prime, if it's not a repeat we return edi-this
a083569:
    mov %edi, %eax
    dec %edi
    jz end
    xchg %eax, %edi
    mov %edi, %esi
primecheck:
    mov %esi, %ecx
    inc %esi
primeloop:
    mov %esi, %eax
    cdq
    div %ecx
    test %edx, %edx
    loopnz primeloop
/* end */
    // if esi isn't prime, then ecx is now one or greater.
    test %ecx, %ecx
    jnz primecheck
    // esi is now our target prime: check if it's not already one
    mov %edi, %ecx
    dec %ecx
    push %rsi   /* we need a flag-safe way to restore this later */
    sub %edi, %esi
chkdup:
    push %rsi
    push %rdi
    push %rcx
    mov %ecx, %edi
    call a083569
    pop %rcx
    pop %rdi
    pop %rsi
    cmp %eax, %esi
    loopne chkdup
/* end loop - chkdup */
    xchg %esi, %eax
    pop %rsi
    je primecheck
/* end outer loop - primecheck */
end:
    ret

Çevrimiçi deneyin!


1

Clojure, 158 155 bayt

#(loop[r[0 1]i 1](if(= i %)(last r)(recur(conj r(nth(for[j(range):when(=((set r)j)(seq(for[k(range 2(+ 1 i j)):when(=(mod(+ 1 i j)k)0)]j)))]j)0))(inc i))))

Bu hala biraz yağ olabilir, ben çok mutlu değilim (+ 1 i j)ama bu temel davayı n = 1ve gerisini halletmenin en kolay yoluydu . ((set r)j)döner nileğer jkümesinde değildir ve (seq ())boş bir liste döndürür de nil üzerinde. n = 100048 saniyede hesaplar .

Güncelleme: kod nil, =kodsuz olarak da çalıştığından kontrollerden kaldırıldı .



1

Python, 194 170 110 bayt

Leaky Nun tarafından kaydedilen 84 bayt

Mathmandan tarafından kaydedilen 2 bayt

def s(n):
 a=[s(j)for j in range(1,n)];i=1
 while(i in a)|any((i+n)%j<1for j in range(2,i+n)):i+=1
 return i

Bir sayıyı giriş olarak alan ve A083569 (n) döndüren bir işlevi s (n) tanımlar.

Çevrimiçi Deneyin



1
p=lambda n:any(n%i<1for i in range(2,n))Primallik kontrolü için kullanabilirsiniz .
Leaky Rahim


1
Bit yönünde kullanabilirsiniz ya da bir kaç baytı kurtarmak için:while(i in a)|any(...
mathmandan
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.