Trouver le nième premier tel que le premier - 1 soit divisible par n


33

Problème

Le but est, comme le dit le titre, de trouver le nième nombre premier tel que le nombre premier - 1 soit divisible par n.

Explication

Voici un exemple pour que vous compreniez bien la question, ce n’est pas nécessairement la façon dont elle devrait être résolue. C'est simplement comme un moyen d'expliquer la question

étant donné 3 comme entrée, nous examinons d’abord tous les nombres premiers

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

Ensuite, nous sélectionnons les nombres premiers tels que le nombre premier - 1 soit divisible par n (3 dans ce cas)

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

Nous sélectionnons ensuite le nième terme de cette séquence

Nous produirions 19 pour une entrée de 3

Remarque

Nous pouvons aussi penser à cela comme au nième nombre premier de la suite {1, n + 1, 2n + 1, 3n + 1 ... kn + 1} où k est un nombre naturel quelconque

Cas de test

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

Vous dites Nth prime [...] divisible par n . Est-ce que N et n sont le même nombre?
Dennis

Désolé, oui, ils sont les mêmes, j'aurais dû le réparer maintenant
Ando Bando


4
Vous voudrez peut-être ajouter 1 -> 2 aux cas de test. L'une de mes réponses s'est trompée à un moment donné.
Dennis

Une autre façon d’exprimer ceci est "trouver le nième nombre premier dans la séquence arithmétique 1, n + 1,2n + 1, ..., kn + 1, ... (laquelle séquence est garantie avoir un nombre infini de nombres premiers par Thm. De Dirichlet. ).
Hardmath

Réponses:


9

05AB1E , 9 à 8 octets

05AB1E utilise le codage CP-1252 .

Enregistré un octet grâce à Osable

µN¹*>Dp½

Essayez-le en ligne!

Explication

µ          # 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
Au lieu de forcer brutalement, je suggérerais de générer d'abord des multiples de N, puis de vérifier s'ils sont premiers. Je suis venu avec µN¹*>Dp½ce qui enregistre un octet et accélère le calcul.
Osable

2
@Osable: Ah bien sûr! C'est en effet une bien meilleure approche. Merci :)
Emigna

7

Python 2, 58 octets

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

5

Mathematica, 48 octets

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

Fonction sans nom prenant un seul argument, qu’elle nomme n. Génère une liste des premiers n^3premiers, sélectionne ceux qui sont congruents à 1 modulo n, puis prend le ne élément du résultat. Il s'exécute en quelques secondes sur l'entrée 123.

À l'heure actuelle, on ne sait pas s'il y a toujours un seul nombre premier, parmi les premiers n^3premiers, qui est congruent à 1 modulo n, et encore moins n. Cependant, l'algorithme peut être prouvé correct (au moins pour les grands n) sous l'hypothèse de l' hypothèse généralisée de Riemann !


5

Haskell, 59 47 octets

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

Exemple d'utilisation: f 4-> 29.

Comment ça marche:

[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

Edit: Merci @ Damien pour 12 octets en supprimant le test de divisibilité et en ne regardant que les multiples en premier lieu.


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

@ Damien: wow, une économie d'octet de 20%. Merci beaucoup!
nimi

3

Gelée , 9 octets

‘ÆP>%ð#Ṫ‘

Essayez-le en ligne!

Comment ça marche

‘Æ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 octets

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

Ungolfed:

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

Code de test:

Essayez-le ici (les résultats du dernier test dans un délai dépassé sur idéone)

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

Sortie:

2
5
19
29
39301
102337

Sympa de voir le code non-golfé pour la comparaison, mais les tests auraient besoin d'être sur le code golfé pour avoir un sens ...
trichoplax

@trichoplax Eh bien, je poste toujours le programme de test complet dans la partie du code de test et non testée de mes réponses. Ils System.out.printlnsont généralement ajoutés pour que vous puissiez voir quelle entrée j'ai utilisée pour afficher la sortie affichée. Tout est également indiqué au cas où quelqu'un voudrait le copier-coller dans son IDE pour jouer.
Kevin Cruijssen

1
Mon commentaire n'était pas terriblement sérieux - cela pourrait amener certaines personnes à penser que vous n'aviez testé que le code avant de jouer au golf. Vous pouvez toujours avoir trois sections: Golfed, Ungolfed et Golfed with code test, si vous voulez éviter cette hypothèse ...
trichoplax

1
@trichoplax Ah ok, dans ce cas c'est un commentaire justifié et bon. :) Je vais éditer celui-ci, et le garder à l'esprit pour les défis futurs.
Kevin Cruijssen

3

Nasm 679 octets (Instruction Intel 386 unités de traitement 120 octets)

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

c'est un non-golf et les résultats

;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

En fait , 13 octets

Suggestions de golf bienvenues! Essayez-le en ligne!

;╗`PD╜@%Y`╓NP

Ungolfing

         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 octets

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

Usage:

* (s 100)

39301

Ungolfed:

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

Certaines de ces loopconstructions peuvent probablement être raccourcies en doboucles, mais c'est ce que j'ai pour le moment.


2

MATL , 12 octets

1i:"`_YqtqG\

Essayez-le en ligne!

(Pour l'entrée, 123le délai est écoulé dans le compilateur en ligne, mais cela fonctionne hors ligne.)

Explication

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 octets

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

Utilise la regex prime-testing pour déterminer s'il $pest premier et s'assure qu'il est congruent à 1 mod l'entrée (les seuls entiers non négatifs inférieurs à 2 sont 0 et 1, mais il ne peut pas être 0 s'il est premier, il doit donc be 1. enregistre 1 octet de plus ==1).


Cela semble imprimer 3 pour l’entrée 1 (devrait être 2 ).
Dennis

Vous pouvez économiser 10 octets en faisant (1 x++$.)!~/^(11+?)\1+$/&&($.%$_<2)&&push@a,$.while@a<$_;say$a[-1](c’est ce dont je parlais dans mon précédent commentaire). Cependant, la sortie (de chaque version) semble fausse pour au moins 2 et 3 ...
Dada

1

Mathematica 44 octets

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

Très vite. Utilise l'idée de la "note"

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

Sortie

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

1

Perl 6 ,  46 39  37 octets

->\n{(2..*).grep({.is-prime&&($_-1)%%n})[n-1]}
->\n{(1,n+1...*).grep(*.is-prime)[n-1]}
{(1,$_+1...*).grep(*.is-prime)[$_-1]}

0

Java 8, 84 octets

Golfé

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

Ungolfed

(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.
}

Explication

Solution inspirée par plusieurs autres réponses. Function est un lambda qui attend un seul int.

le n>1?i:2 un bidouillage pas cher parce que je ne pouvais pas trouver un meilleur moyen de considérer le cas de n = 1.

En outre, cette solution arrive à expiration sur Ideone, mais a été testée pour tous les cas de test. Il expire car, afin de gagner quelques octets, j'ai retiré la j<ivérification explicite de la boucle interne. C'est surtout impliqué par i%j>0... sauf dans le cas de i=1etj=2 (la toute première itération), auquel cas la boucle s'exécute jusqu'à ce que j déborde (je suppose). Ensuite, cela fonctionne bien pour toutes les itérations après.

Pour une version qui n'expire pas, cela ne prend que quelques octets de plus, voir ici!


0

Raquette 109 octets

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

Ungolfed:

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

Essai:

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

Sortie:

2
5
19
29
39301
102337

0

Ruby 64 octets

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

Appelé comme ça:

f.call(100)
# 39301

En outre, cette application en ligne de commande fonctionne:

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

appelé comme ça

ruby -rprime find_golf_prime.rb 100

mais je ne sais pas trop comment compter les personnages. Je pense que je peux ignorer le nom de la langue, mais que je dois inclure l’ -rprimeespace et avant le nom du script, ce qui est légèrement plus court, à 63. . .


0

R, 72 octets

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

Terriblement inefficace et lent mais ça marche. Il lit les entrées de stdin puis utilise la isPrimefonction du numberspaquet pour trouver les nombres premiers. Le reste ne fait que vérifier si prime - 1est divisible par n.


0

JavaScript (ES6), 65 octets

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

Utilise le testeur de primalité regexp, car il est a) inférieur de 8 octets et b) moins récursif que mon approche purement récursive.


0

Axiome 64 octets

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

quelqu'un sait-il comment écrire ci-dessus à l'aide des flux Axiom? ... un exemple

-> 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]

Type: Tuple NonNegativeInteger

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.