A083569:m + nが素数になるように最小のmが先に発生しない


26

次のように1インデックス付きシーケンスを定義します。

  • A083569(1) = 1
  • A083569(n)ここで、nはより大きい1整数m+nです。これは、素数であるなど、以前に発生していない最小の整数m です。

あなたの仕事は取り入れてn戻ること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

より多くのテストケースはこちらにあります。OEISの元のシーケンスはここにあります

これはです。バイト単位の最短回答が優先されます。標準の抜け穴が適用されます。


Mr.Xcoder @「次のように1インデックス付き配列の定義」
漏れヌン

回答:


14

Haskell87 86 83 80 74 69バイト

3バイトを節約したいくつかの変更を提案してくれたxnorに感謝します!

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

オンラインでお試しください!

私はHaskellとHaskellのゴルフが初めてなので、フィードバックを歓迎します!

説明

関数を定義しますf n。リストのf n最初の要素!!0として定義します:

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

分解すると:

[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ゴルフへようこそ![2,3..]ちょうどすることができ[2..]、1だけカウントアップがデフォルトです。が組み込まれていnotElemます。
-xnor

@xnorありがとう!私は結局、より良い使用方法を見つけましたnotElemが、最初のヒントは役に立ちました。2番目のヒントは必ずバックポケットに入れておきます。
小麦ウィザード

新しいリビジョンがf 1間違っているようです。1である必要があります。
xnor17年

@xnor固定、残念ながら3バイトのコスト。
小麦ウィザード

6

ゼリー16 15バイト

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

これは、A083569(n)≤n²(シーケンスは線形に増加しているように見える)を想定しています。

オンラインでお試しください!

使い方

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
確かに、A083569(n)せいぜいその定義によるnよりもn多くても2nth個の素数であり、それはせいぜいth番目の素数であり、これは(のためにn≥34n*log(n)ロッサー・シェーンフェルドの結果よりも小さい。
グレッグマーティン

@GregMartinがそれを検証しながら、それは...まだ作るためにかなりワイルドな仮定だ
Esolangingフルーツ

4
@ Challenger5「教育的推測」が好きです。
デニス

6

Pyth- 18 17 15バイト

2バイト節約してくれた@isaacgに感謝します!

このサイトに戻って、しばらく忙しかった後、これをさらにゴルフすることを願っています。

esmaYf&-TYP_+Th

こちらからオンラインでお試しください


4
PPCGへようこそ!
リーキー修道女

@LeakyNunありがとう:)
マルティセン

1
-TY!/YT、よりも1バイト短く、同じ場合は真実です。
isaacg

に変更+hdTすると、別のバイトを保存できます+Th
-isaacg

@isaacg、最初の要素をリストにキャストしますか?かっこいい。
マルティセン

3

C#(.NET Core)、169バイト

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;}}

オンラインでお試しください!

結果を計算する最も非効率的な方法なので、このコードで計算することf(n)は控えてくださいn>=30。最初のステップは、再帰的に値を計算することf(1)f(n-1)した後の計算に進むf(n)最初のを検索することによりi、このようなn+i素数であり、i前の値のリストにありません。


3

x86-64アセンブリ、57 55バイト

ゴルフは初めてなので、コメント/フィードバックをお願いします。

注:これは、ソースの長さではなく、マシンコードの長さに対して最適化されています。

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

符号なし32ビット整数を受け取り、最小のmなどを返す標準の規則(つまり、eaxの戻り値、ediの最初の引数、呼び出し元が保存するすべてのレジスタ)を使用して、関数を定義します。

ソース:

    .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

オンラインでお試しください!


1

Clojure、158 155バイト

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

これはまだ少し太っているかもしれませんが、私はあまり満足していません(+ 1 i j)が、これはベースケースn = 1と残りを処理する最も簡単な方法でした。((set r)j)がセットにないnil場合を返し、空のリストではnilも返します。48秒で計算します。j(seq ())n = 1000

更新:コードがなくてもコードが正常に機能するため、チェックnilから削除されまし=た。



1

パイソン、194の 170 110バイト

Leaky Nunが84バイトを節約

mathmandanによって保存された2バイト

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

入力として数値を受け取り、A083569(n)を返す関数s(n)を定義します。

オンラインで試す


1
このTIOリンクを含めることを検討してください
リーキー修道女

1
p=lambda n:any(n%i<1for i in range(2,n))素数チェックに使用できます。
リーキー修道女


1
ビット単位を使用したり、数バイトを節約したりできますwhile(i in a)|any(...
。– mathmandan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.