找到第n个素数,使得素数-1被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个项

我们将输入19输入3

注意

我们还可以将其视为序列{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整除。是Ññ相同数量?
丹尼斯

抱歉,是的,它们是相同的,我现在应该修复它
Ando Bando


4
您可能想在测试用例中添加1-> 2。我的答案之一是在某个时候弄错了。
丹尼斯

这种说法的另一种方式是“在算术序列1,n + 1,2n + 1,...,kn + 1,...中找到第n个素数(Dirichlet的Thm保证该序列具有无限多个素数)
hardmath

Answers:


9

05AB1E9 8字节

05AB1E使用CP-1252编码。

感谢Osable节省了一个字节

µ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½一个节省一个字节并加速计算的方法。
2016年

2
@Osable:当然可以!这确实是一个更好的方法。谢谢:)
Emigna '16

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模数一致的素数n,然后取结果的nth元素。它可以在几秒钟内在输入123上运行。

目前尚不知道在第一个n^3素数中,是否总是有一个素数与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

编辑:感谢@Damien通过删除除数测试并仅在第一位查看倍数获得了12个字节。


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

@Damien:哇,节省了20%的字节。非常感谢!
nimi 2016年

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与玩弄复制粘贴。
凯文·克鲁伊森

1
我的评论并不是很认真地打算-可能会使某些人认为您只是打高尔夫球之前测试过代码。如果您想摆脱这种假设,您始终可以分为三个部分:高尔夫,无高尔夫和带有测试代码的
高尔夫

1
@trichoplax嗯,在那种情况下,确实是一个合理且好的评论。:)我将对其进行编辑,并牢记未来的挑战。
凯文·克鲁伊森

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

普通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个错误...
Dada

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的lambda。

n>1?i:2是一个便宜的技巧,因为我想不出一种更好的方法来考虑n = 1的情况。

同样,此解决方案在Ideone上超时,但已针对所有测试用例进行了测试。超时是因为为了节省几个字节,我j<i在内部循环中进行了显式检查。i%j>0除... i=1和的情况外,它通常由... 隐含j=2(第一次迭代),在这种情况下,循环运行直到j溢出(我假设)。然后在以后的所有迭代中都可以正常工作。

对于不超时的版本,它的长度要长几个字节,请参见此处!


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在脚本名称之前包含和空格,因此稍短一些,为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读取输入,然后使用包中的isPrime函数numbers查找素数。剩下的只是检查是否可以prime - 1被整除n


0

JavaScript(ES6),65个字节

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

使用regexp素数测试器,因为它比我的纯递归方法短了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]

类型:元组NonNegativeInteger

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.