素数-1がnで割り切れるようなn番目の素数を見つける


33

問題

目標は、タイトルがn番目の素数を見つけることで、素数-1がnで割り切れるようにすることです。

説明

質問を理解するための例を次に示しますが、これは必ずしも解決すべき方法ではありません。それは単に質問を説明する方法として

入力として3を指定すると、まずすべての素数を調べます

 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 ...

次に、素数-1がn(この場合は3)で割り切れるような素数を選択します

 7 13 19 31 37 43 61 67 73 79 97 103 107 109 127 ...

次に、このシーケンスのn番目の用語を選択します

3の入力に対して19を出力します

注意

これは、シーケンス{1、n + 1、2n + 1、3n + 1 ... kn + 1}のn番目の素数と考えることもできます。ここで、kは任意の自然数です

テストケース

  1 --> 2
  2 --> 5
  3 --> 19
  4 --> 29
100 --> 39301
123 --> 102337

nで割り切れるN番目の素数[...]と言います。あるNnは同じ番号が?
デニス

ごめんなさい、ええ、彼らは同じです、私は今それを修正する必要がありました
安藤坂東


4
テストケースに1-> 2を追加できます。ある時点で私の答えの1つが間違っていました。
デニス

これを表現する別の方法は、「算術シーケンス1、n + 1,2n + 1、...、kn + 1、...のn番目の素数を見つけることです(このシーケンスは、ディリクレのThmによって無限に多くの素数を持つことが保証されています。
。– hardmath

回答:


9

05AB1E9 8バイト

05AB1EはCP-1252エンコードを使用します。

Osableのおかげで1バイト節約

µN¹*>Dp½

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

説明

µ          # for N in [1 ...] loop until counter == input
 N¹*>      # N*input+1 (generate multiples of input and increment)
     D     # duplicate
      p½   # if prime, increase counter
           # implicitly output last prime

3
総当たり攻撃の代わりに、最初にNの倍数を生成し、次にそれらが素数であるかどうかを確認することをお勧めします。私はµN¹*>Dp½1バイトを節約し、計算を高速化することを思いつきました。
2016年

2
@Osable:もちろんです!それは確かにはるかに優れたアプローチです。ありがとう:)
エミグナ

7

Python 2、58バイト

n=N=input();m=k=1
while N:m*=k*k;k+=1;N-=m%k>~-k%n
print k

5

Mathematica、48バイト

Select[Array[Prime,(n=#)^3],Mod[#-1,n]==0&][[n]]&

名前のない単一の引数を取る名前のない関数n。最初のn^3素数のリストを生成し、1 modulo nに一致するものを選択してnから、結果のth要素を取得します。入力123で数秒で実行されます。

最初のn^3素数の中に常に1つの素数があり、それが1モジュロnに一致しているかどうかは、現時点ではわかりませnん。ただし、アルゴリズムnは、一般化されたリーマン仮説の仮定の下で(少なくとも大きい場合は)正しいことが証明できます!


5

Haskell、59 47バイト

f n=[p|p<-[1,n+1..],all((<2).gcd p)[2..p-1]]!!n

使用例:f 4-> 29

使い方:

[p|p<-[1,n+1..]                     ]    -- make a list of all multiples of n+1
                                         -- (including 1, as indexing is 0-based)
           ,all((<2).gcd p)[2..p-1]      -- and keep the primes
                              !!n       -- take the nth element

編集:分割可能性テストを削除し、最初の倍数だけを見て、12バイトの@Damienに感謝します。


f n=[p|p<-[1,n+1..],all((<2).gcd p)[2..p-1]]!!n
ダミアン

@Damien:うわー、20%のバイト節約。どうもありがとう!
nimi

3

ゼリー、9 バイト

‘ÆP>%ð#Ṫ‘

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

使い方

‘ÆP>%ð#Ṫ‘  Main link. Argument: n

     ð#    Call the dyadic chain to the left with right argument n and left
           argument k = n, n+1, n+2, ... until n of them return 1.
‘          Increment; yield k+1.
 ÆP        Test k+1 for primality, yielding 1 or 0.
    %      Compute k%n.
   >       Compare the results to both sides, yielding 1 if and only if k+1 is
           prime and k is divisible by n.
       Ṫ   Tail; extract the last k.
        ‘  Increment; yield k+1.

3

Java 7、106バイト

int c(int n){for(int z=1,i=2,j,x;;i++){x=i;for(j=2;j<x;x=x%j++<1?0:x);if(x>1&(i-1)%n<1&&z++==n)return i;}}

ゴルフをしていない:

int c(int n){
  for(int z = 1, i = 2, j, x; ; i++){
    x = i;
    for(j = 2; j < x; x = x % j++ < 1
                           ? 0
                           : x);
    if(x > 1 & (i-1) % n < 1 && z++ == n){
      return i;
    }
  }
}

テストコード:

ここで試してみてください(最後のテストケースでは、ideoneの制限時間が超過します)

class M{
  static int c(int n){for(int z=1,i=2,j,x;;i++){x=i;for(j=2;j<x;x=x%j++<1?0:x);if(x>1&(i-1)%n<1&&z++==n)return i;}}

  public static void main(String[] a){
    System.out.println(c(1));
    System.out.println(c(2));
    System.out.println(c(3));
    System.out.println(c(4));
    System.out.println(c(100));
    System.out.println(c(123));
  }
}

出力:

2
5
19
29
39301
102337

比較のためにゴルフのないコードを見るのはいいですが、テストは意味のあるゴルフのコードで行う必要があります
...-trichoplax

@trichoplaxまあ、私はいつも私の回答のUngolfedとテストコードの部分に完全なテストプログラムを投稿します。System.out.printlnあなたは、私が示す出力を与えるために使用しました、とすべてがまた誰でもコピー&ペーストすることがで遊ぶために彼らのIDEに望んでいる場合には与えられているものを入力見て、主に追加されます。
ケビンCruijssen

1
私のコメントはひどく真剣に意図されたものではありませんでした- ゴルフをする前にコードをテストしただけだと思わせる人もいるかもしれません。前提条件から脱却したい場合は、常に3つのセクション(テストコード付きのGolfed、Ungolfed、およびGolfed)を使用できます
...-trichoplax

1
@trichoplaxああ、その場合、それは確かに正当化された良いコメントです。:)これを編集し、将来の課題に備えて心に留めておきます。
ケビンCruijssen

3

NASM 679バイト(命令Intel 386 CPU 120バイト)

isPrime1:  
push ebp
mov ebp,dword[esp+ 8]
mov ecx,2
mov eax,ebp
cmp ebp,1
ja .1
.n: xor eax,eax
jmp short .z
.1: xor edx,edx
cmp ecx,eax
jae .3
div ecx
or edx,edx
jz .n
mov ecx,3
mov eax,ebp
.2: xor edx,edx
cmp ecx,eax
jae .3
mov eax,ebp
div ecx
or edx,edx
jz .n
inc ecx
inc ecx
jmp short .2
.3: xor eax,eax
inc eax
.z: pop   ebp
ret 4
Np:  
push esi
push edi
mov esi,dword[esp+ 12]
xor edi,edi
or esi,esi
ja .0
.e: xor eax,eax
jmp short .z
.0: inc esi
jz .e
push esi
call isPrime1
add edi,eax
dec esi
cmp edi,dword[esp+ 12]
jae .1
add esi,dword[esp+ 12]
jc .e
jmp short .0
.1: mov eax,esi
inc eax
.z: pop edi
pop esi
ret 4

これは無制限のものであり、結果

;0k,4ra,8Pp
isPrime1: 
          push    ebp
          mov     ebp,  dword[esp+  8]
          mov     ecx,  2
          mov     eax,  ebp
          cmp     ebp,  1
          ja      .1
.n:       xor     eax,  eax
          jmp     short  .z
.1:       xor     edx,  edx
          cmp     ecx,  eax
          jae     .3
          div     ecx
          or      edx,  edx
          jz      .n
          mov     ecx,  3
          mov     eax,  ebp
.2:       xor     edx,  edx
          cmp     ecx,  eax
          jae     .3
          mov     eax,  ebp
          div     ecx
          or      edx,  edx
          jz      .n
          inc     ecx
          inc     ecx
          jmp     short  .2
.3:       xor     eax,  eax
          inc     eax
.z:       
          pop     ebp
          ret     4

; {1, n+1, 2n+1, 3n+1 }
; argomento w, return il w-esimo primo nella successione di sopra
;0j,4i,8ra,12P
Np:       
          push    esi
          push    edi
          mov     esi,  dword[esp+  12]
          xor     edi,  edi
          or      esi,  esi
          ja      .0
.e:       xor     eax,  eax
          jmp     short  .z
.0:       inc     esi
          jz      .e
          push    esi
          call    isPrime1
          add     edi,  eax
          dec     esi
          cmp     edi,  dword[esp+  12]
          jae     .1
          add     esi,  dword[esp+  12]
          jc      .e
          jmp     short  .0
.1:       mov     eax,  esi
          inc     eax
.z:       
          pop     edi
          pop     esi
          ret     4

00000975  55                push ebp
00000976  8B6C2408          mov ebp,[esp+0x8]
0000097A  B902000000        mov ecx,0x2
0000097F  89E8              mov eax,ebp
00000981  81FD01000000      cmp ebp,0x1
00000987  7704              ja 0x98d
00000989  31C0              xor eax,eax
0000098B  EB28              jmp short 0x9b5
0000098D  31D2              xor edx,edx
0000098F  39C1              cmp ecx,eax
00000991  731F              jnc 0x9b2
00000993  F7F1              div ecx
00000995  09D2              or edx,edx
00000997  74F0              jz 0x989
00000999  B903000000        mov ecx,0x3
0000099E  89E8              mov eax,ebp
000009A0  31D2              xor edx,edx
000009A2  39C1              cmp ecx,eax
000009A4  730C              jnc 0x9b2
000009A6  89E8              mov eax,ebp
000009A8  F7F1              div ecx
000009AA  09D2              or edx,edx
000009AC  74DB              jz 0x989
000009AE  41                inc ecx
000009AF  41                inc ecx
000009B0  EBEE              jmp short 0x9a0
000009B2  31C0              xor eax,eax
000009B4  40                inc eax
000009B5  5D                pop ebp
000009B6  C20400            ret 0x4
68

000009B9  56                push esi
000009BA  57                push edi
000009BB  8B74240C          mov esi,[esp+0xc]
000009BF  31FF              xor edi,edi
000009C1  09F6              or esi,esi
000009C3  7704              ja 0x9c9
000009C5  31C0              xor eax,eax
000009C7  EB1D              jmp short 0x9e6
000009C9  46                inc esi
000009CA  74F9              jz 0x9c5
000009CC  56                push esi
000009CD  E8A3FFFFFF        call 0x975
000009D2  01C7              add edi,eax
000009D4  4E                dec esi
000009D5  3B7C240C          cmp edi,[esp+0xc]
000009D9  7308              jnc 0x9e3
000009DB  0374240C          add esi,[esp+0xc]
000009DF  72E4              jc 0x9c5
000009E1  EBE6              jmp short 0x9c9
000009E3  89F0              mov eax,esi
000009E5  40                inc eax
000009E6  5F                pop edi
000009E7  5E                pop esi
000009E8  C20400            ret 0x4
000009EB  90                nop
120


[0, 0] [1, 2] [2, 5] [3, 19] [4, 29] [5, 71] [6, 43] [7, 211] [8, 193] [9, 271] [1
0, 191] [11, 661] [12, 277] [13, 937] [14, 463] [15, 691] [16, 769] [17, 1531] [18
, 613] [19, 2357] [20, 1021] [21, 1723] [22, 1409] [23, 3313] [24, 1609] [25, 3701
] [26, 2029] [27, 3187] [28, 2437] [29, 6961] [30, 1741] [31, 7193] [32, 3617] [33
, 4951] [34, 3877] [35, 7001] [36, 3169] [37, 10657] [38, 6271] [39, 7879] [40, 55
21] [41, 13613] [42, 3823] [43, 15137] [44, 7349] [45, 9091] [46, 7499] [47, 18049
] [48, 6529] [49, 18229] [50, 7151] [51, 13159] [52, 10141] [53, 26501] [54, 7669]
 [55, 19801] [56, 11593] [57, 18127] [58, 13109] [59, 32569] [60, 8221] [61, 34649
] [62, 17981] [63, 21799] [64, 16001] [65, 28081] [66, 10429] [67, 39799] [68, 193
81] [69, 29947] [70, 14771] [71, 47713] [72, 16417] [73, 51539] [74, 25013] [75, 2
9101] [76, 26449] [77, 50051] [78, 16927] [79, 54037] [80, 23761] [81, 41149] [82,
 31489] [83, 68891] [84, 19237] [85, 51341] [86, 33713] [87, 45589] [88, 34057] [8
9, 84551] [90, 19531] [91, 64793] [92, 42689] [93, 54499] [94, 41737] [95, 76001]
[96, 27457] [97, 97583] [98, 40867] [99, 66529] [100, 39301] [101, 110899] [102, 2
9989] [103, 116803] [104, 49297] [105, 51871] [106, 56711] [107, 126047] [108, 385
57] [109, 133853] [110, 42901] [111, 76369] [112, 53089] [113, 142607] [114, 40129
] [115, 109481] [116, 63337] [117, 83071] [118, 67733] [119, 112337] [120, 41281]
[121, 152219] [122, 70639] [123, 102337]

2

実際には、13バイト

ゴルフの提案を歓迎します!オンラインでお試しください!

;╗`PD╜@%Y`╓NP

アンゴルフ

         Implicit input n.
;╗       Save a copy of n to register 0.
`...`╓   Push first n values where f(x) is truthy, starting with f(0).
  PD       Get the x-th prime - 1.
  ╜@%      Push (x_p - 1) % n.
  Y        If x_p-1 is divisible by n, return 1. Else, return 0.
NP       Get the n-th prime where n_p-1 is divisible by n.
         Implicit return.

2

Common Lisp、162バイト

(defun s(n)(do((b 2(loop for a from(1+ b)when(loop for f from 2 to(1- a)never(=(mod a f)0))return a))(a 0)(d))((= a n)d)(when(=(mod(1- b)n)0)(incf a)(setf d b))))

使用法:

* (s 100)

39301

ゴルフをしていない:

(defun prime-search (n)
  (do ((prime 2 (loop for next from (1+ prime) when
                 (loop for factor from 2 to (1- next) never
                      (= (mod next factor) 0)) return next))
       (count 0) (works))
      ((= count n) works)
    (when (= (mod (1- prime) n) 0)
      (incf count)
      (setf works prime))))

これらのloop構造のいくつかはおそらくdoループに短縮できますが、これは私が今持っているものです。


2

MATL、12バイト

1i:"`_YqtqG\

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

(入力について123は、オンラインコンパイラではタイムアウトしますが、オフラインで動作します。)

説明

1          % Push 1
i:         % Input n and push [1 2 ... n]
"          % For each (that is, do the following n times)
  `        %   Do...while
    _Yq    %     Next prime
    tq     %     Duplicate, subtract 1
    G      %     Push n again
    \      %     Modulo
           %   End (implicit). Exit loop if top of stack is 0; else next iteration
           % End (implicit)
           % Display (implicit)

1

Perl、77 76 + 1 = 77バイト

for($p=2;@a<$_;$p++){push@a,$p if(1 x$p)!~/^(11+?)\1+$/&&($p%$_<2)}say$a[-1]

素数テスト正規表現を使用して素数であるかどうかを判断し$p、入力が1 modに一致することを確認します(2未満の非負の整数は0と1ですが、素数の場合は0にできないため、 1.を1バイト節約します==1)。


これは、入力1に対して3を印刷するように見えます(2でなければなりません)。
デニス

実行することで10バイト節約できます(1 x++$.)!~/^(11+?)\1+$/&&($.%$_<2)&&push@a,$.while@a<$_;say$a[-1](これは前のコメントで話していたことです)。しかし、(どちらかのバージョンの)出力が...少なくとも2と3のために間違っているようだ
ダダ

1

Mathematica 44バイト

   Pick[x=Table[i #+1,{i,# #}],PrimeQ/@x][[#]]&

とても早い。「メモ」のアイデアを使用します

% /@ {1, 2, 3, 4, 100, 123} // Timing

出力

{0.0156001, {2, 5, 19, 29, 39301, 102337}}


0

Java 8、84バイト

ゴルフ

(n)->{for(int s=n,i=1;;i+=n)for(int j=2;i%j>0&j<i;)if(++j==i&&--s<1)return n>1?i:2;}

非ゴルフ

(n) -> { 
for (int s = n,      // Counting down to find our nth prime.
    i = 1;           // Counting up for each multiple of n, plus 1.
    ;                // No end condition specified for outer for loop.
    i += n)          // Add n to i every iteration.
for (int j = 2;      // Inner for loop for naive primality check.
     i % j > 0)      // Keep looping while i is not divisible by j 
                     // (and implicitly while j is less than i).
     if(++j==i       // Increment j. If j has reached i, we've found a prime
     &&              // Short-circutting logical AND, so that we only decrement s if a prime is found
     --s < 1)        // If we've found our nth prime...
     return n>1?i:2; // Return it. Or 2 if n=1, because otherwise it returns 3.
}

説明

他のいくつかの回答に触発されたソリューション。関数は、単一のintを予期するラムダです。

これn>1?i:2は安価なハックです。n= 1の場合を考慮するより良い方法を見つけられなかったからです。

また、このソリューションはIdeoneではタイムアウトしますが、すべてのテストケースでテストされています。タイムアウトになるのは、数バイトを削るためj<iに、内側のループで明示的なチェックを外したためです。and (非常に最初の反復)i%j>0の場合を除いて、主に... によって暗示されます。その後、すべての反復に対して正常に機能します。i=1j=2

タイムアウトしないバージョンについては、数バイト長くなります。こちらをご覧ください!


0

ラケット109バイト

(let p((j 2)(k 0))(cond[(= 0(modulo(- j 1)n))(if(= k(- n 1))j(p(next-prime j)(+ 1 k)))][(p(next-prime j)k)]))

ゴルフをしていない:

(define (f n)
  (let loop ((j 2)
             (k 0))
    (cond
      [(= 0 (modulo (sub1 j) n))
       (if (= k (sub1 n)) 
           j
           (loop (next-prime j) (add1 k)))]
      [else (loop (next-prime j) k)]  )))

テスト:

(f 1)
(f 2)
(f 3)
(f 4)
(f 100)
(f 123)

出力:

2
5
19
29
39301
102337

0

Ruby 64バイト

require'prime';f=->(n){t=n;Prime.find{|x|(x-1)%n==0&&(t-=1)==0}}

このように呼び出されます:

f.call(100)
# 39301

また、このコマンドラインアプリは動作します。

n=t=ARGV[0].to_i;p Prime.find{|x|(x-1)%n==0&&(t-=1)==0}

こう呼ばれる

ruby -rprime find_golf_prime.rb 100

しかし、私は文字を数える方法がよくわかりません。言語名は無視できますが-rprime、スクリプト名の前にandスペースを含める必要があるので、63で少し短くなります。。。


0

R、72バイト

n=scan();q=j=0;while(q<n){j=j+1;q=q+1*(numbers::isPrime(j)&!(j-1)%%n)};j

ひどく非効率的で低速ですが、動作します。stdinから入力を読み取りisPrimenumbersパッケージの関数を使用して素数を見つけます。残りはprime - 1で割り切れるかどうかを確認するだけnです。


0

JavaScript(ES6)、65バイト

f=(n,i=n,j=1)=>i?f(n,i-!/^(..+?)\1+$/.test('.'.repeat(j+=n)),j):j

正規表現の素数テスターを使用します。a)私の純粋な再帰アプローチよりも8バイト短く、b)再帰性が低いためです。


0

公理64バイト

f(n)==(n<0 or n>150=>0;[i*n+1 for i in 0..2000|prime?(i*n+1)].n)

誰かがAxiomストリームを使用して上記の書き方を知っていますか?...いくつかの例

-> f(i)  for i in 1..150
   Compiling function f with type PositiveInteger -> NonNegativeInteger


   [2, 5, 19, 29, 71, 43, 211, 193, 271, 191, 661, 277, 937, 463, 691, 769,
    1531, 613, 2357, 1021, 1723, 1409, 3313, 1609, 3701, 2029, 3187, 2437,
    6961, 1741, 7193, 3617, 4951, 3877, 7001, 3169, 10657, 6271, 7879, 5521,
    13613, 3823, 15137, 7349, 9091, 7499, 18049, 6529, 18229, 7151, 13159,
    10141, 26501, 7669, 19801, 11593, 18127, 13109, 32569, 8221, 34649, 17981,
    21799, 16001, 28081, 10429, 39799, 19381, 29947, 14771, 47713, 16417,
    51539, 25013, 29101, 26449, 50051, 16927, 54037, 23761, 41149, 31489,
    68891, 19237, 51341, 33713, 45589, 34057, 84551, 19531, 64793, 42689,
    54499, 41737, 76001, 27457, 97583, 40867, 66529, 39301, 110899, 29989,
    116803, 49297, 51871, 56711, 126047, 38557, 133853, 42901, 76369, 53089,
    142607, 40129, 109481, 63337, 83071, 67733, 112337, 41281, 152219, 70639,
    102337, 75641, 126001, 42589, 176531, 85121, 107071, 62791, 187069, 55837,
    152419, 94873, 104761, 92753, 203857, 62929, 226571, 72661, 144103, 99401,
    193051, 69697, 168781, 112859, 133183, 111149, 250619, 60601]

タイプ:Tuple NonNegativeInteger

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.