Ai-je un jumeau principal?


23

Un nombre entier est premier si et seulement s'il est positif et a exactement 2 diviseurs distincts: 1 et lui-même. Une paire prime jumelle est composée de deux éléments: pet p±2, qui sont tous deux premiers.

Vous recevrez un entier positif en entrée. Votre tâche consiste à renvoyer une vérité / fausse selon que l'entier donné appartient à une paire jumelle, en suivant les règles standard (les valeurs doivent être cohérentes).

Cas de test

  • Truthy (Twin Primes): 3, 5, 7, 11, 13, 17, 19, 29, 31, 41, 43

  • Falsy (pas Twin Primes): 2, 15, 20, 23, 37, 47, 97, 120, 566

C'est le , donc le code le plus court en octets gagne!


13 est-il un jumeau principal?
LiefdeWen

@LiefdeWen Oui, car il appartient à la paire (11, 13)
daniero

Réponses:



11

Gelée , 10 9 octets

%6+_2_ÆP⁺

Essayez-le en ligne!

Contexte

À l'exception de (3, 5) , toutes les paires principales jumelles sont de la forme (6k - 1, 6k + 1) .

Puisque (6k - 1) + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 et
(6k + 1) + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 , pour une entrée n> 3 , il suffit de vérifier si n et n + n% 6 - 3 sont tous les deux premiers.

Cette formule qui arrive à travailler pour n = 3 , ainsi, que 3 + 3% 6 - 3 = 3 est premier et 3 est un premier double.

Comment ça marche

%6+_2_ÆP⁺  Main link. Argument: n

%6         Compute n%6.
  +        Add n to the result.
   _2      Subtract 2.
     _ÆP   Subtract 1 if n is prime, 0 if not.
           If n is not a prime, since (n + n%6 - 2) is always even, this can only
           yield a prime if (n + n%6 - 2 = 2), which happens only when n = 2.
        ⁺  Call ÆP again, testing the result for primality.

7

Python 3 , 53 octets

lambda n:sum((n+n%6-3)*n%k<1for k in range(2,4*n))==2

Essayez-le en ligne!

Contexte

Tous les entiers prennent l'une des formes suivantes, avec un entier k : 6k - 3 , 6k - 2 , 6k - 1 , 6k , 6k + 1 , 6k + 2 .

Puisque 6k - 2 , 6k et 6k + 2 sont tous pairs, et puisque 6k - 3 est divisible par 3 , tous les nombres premiers sauf 2 et 3 doivent être de la forme 6k - 1 ou 6k + 1 . Étant donné que la différence d'une paire prime jumelle est de 2 , à l'exception de (3, 5) , toutes les paires prime jumelles sont de la forme (6k - 1, 6k + 1) .

Soit n la forme 6k ± 1 .

  • Si n = 6k -1 , alors n + n% 6 - 3 = 6k - 1 + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 .

  • Si n = 6k + 1 , alors n + n% 6 - 3 = 6k + 1 + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 .

Ainsi, si n fait partie d'une paire principale jumelle et n ≠ 3 , son jumeau sera n + n% 6 - 3 .

Comment ça marche

Python n'a pas de test de primalité intégré. Bien qu'il existe des moyens courts de tester la primalité d'un seul nombre, le faire pour deux nombres serait long. Nous allons plutôt travailler avec des diviseurs.

sum((n+n%6-3)*n%k<1for k in range(2,4*n))

compte le nombre d'entiers k dans l'intervalle [2, 4n) divise (n + n% 6 - 3) n uniformément, c'est-à-dire qu'il compte le nombre de diviseurs de (n + n% 6 - 3) n dans l'intervalle [2 , 4n) . Nous affirmons que ce nombre est de 2 si et seulement si n fait partie d'une paire principale jumelle.

  • Si n = 3 (un nombre premier jumeau), (n + n% 6 - 3) n = 3 (3 + 3 - 3) = 9 a deux diviseurs ( 3 et 9 ) dans [2, 12) .

  • Si n> 3 est un nombre premier jumeau, comme vu précédemment, m: = n + n% 6 - 3 est son jumeau. Dans ce cas, mn a exactement quatre diviseurs: 1, m, n, mn .

    Puisque n> 3 , nous avons m> 4 , donc 4n <mn et exactement deux diviseurs ( m et n ) tombent dans l'intervalle [2, 4n) .

  • Si n = 1 , alors (n + n% 6 - 3) n = 1 + 1 - 3 = -1 n'a pas de diviseurs dans [2, 4) .

  • Si n = 2 , alors (n + n% 6 - 3) n = 2 (2 + 2 - 3) = 2 a un diviseur (lui-même) dans [2, 8) .

  • Si n = 4 , alors (n + n% 6 - 3) n = 4 (4 + 4 - 3) = 20 a quatre diviseurs ( 2 , 4 , 5 et 10 ) dans [2, 16) .

  • Si n> 4 est pair, 2 , n / 2 et n divisent tous n et, par conséquent, (n + n% 6 - 3) n . Nous avons n / 2> 2 puisque n> 4 , il y a donc au moins trois diviseurs dans [2, 4n) .

  • Si n = 9 , alors (n + n% 6 - 3) n = 9 (9 + 3 - 3) = 81 a trois diviseurs ( 3 , 9 et 21 ) dans [2, 36) .

  • Si n> 9 est un multiple de 3 , alors 3 , n / 3 et n divisent tous n et, par conséquent, (n + n% 6 - 3) n . Nous avons n / 3> 3 depuis n> 9 , il y a donc au moins trois diviseurs dans [2, 4n) .

  • Enfin, si n = 6k ± 1> 4 n'est pas un nombre premier jumeau, n ou m: = n + n% 6 - 3 doit être composite et, par conséquent, admettre un diviseur approprié d> 1 .

    Puisque n = m + 2 ou m = n + 2 et n, m> 4 , les entiers d , m et n sont des diviseurs distincts de mn . De plus, m <n + 3 <4n depuis n> 1 , donc mn a au moins trois diviseurs dans [2, 4n) .


Sensationnel. Un tel code court et pourtant autant de cas particuliers qu'il doit gérer correctement. Une raison pour laquelle vous dites Python 3? Pour autant que je
sache,

Oui, cela fonctionnera aussi bien en Python 2. Le 3 fait partie de la publication SE générée automatiquement par TIO.
Dennis

5

05AB1E , 10 9 octets

1 octet enregistré grâce à Datboi

ÌIÍ‚pZIp*

Essayez-le en ligne! ou comme suite de tests

Explication

Ì           # push input+2
 IÍ         # push input-2
   ‚        # pair
    p       # isPrime
     Z      # max
      Ip    # push isPrime(input)
        *   # multiply

1
Utiliser ÌIÍ‚au lieu de 40SÍ+pour -1 octet
Datboi

4

PHP, 52 octets

<?=($p=gmp_prob_prime)($n=$argn)&&$p($n+2)|$p($n-2);

sans GMP, 84 octets

(en utilisant ma fonction principale de débordement de pile )

<?=p($n=$argn)&&p(2+$n)|p($n-2);function p($n){for($i=$n;--$i&&$n%$i;);return$i==1;}

Exécuter en tant que tuyau avec -nF. Sortie vide pour faux, 1pour vrai.

La grande solution de Dennis portée sur PHP, 56 octets

while($i++<4*$n=$argn)($n+$n%6-3)*$n%$i?:$s++;echo$s==3;

Exécuter en tant que pipe avec -nRou l' essayer en ligne .



3

MATL , 11 octets

HOht_v+ZpAa

La sortie est 0ou 1.

Essayez-le en ligne!

Explication

H    % Push 2
O    % Push 0
h    % Concatenate horizontally: gives [2 0]
t_   % Push a negated copy: [-2 0]
v    % Concatenate vertically: [2 0; -2 0]
+    % Add to implicit input
Zp   % Isprime
A    % All: true for columns that only contain nonzeros
a    % Any: true if there is at least a nonzero. Implicit display


2

Rétine , 45 44 octets

.*
$*
11(1+)
$1¶$&¶11$&
m`^(11+)\1+$

1<`1¶1

Renvoie 1 si l'entrée est un nombre premier jumeau, 0 sinon

Essayez-le en ligne!

Explication

.*              
$*

Convertir en unaire

11(1+)          
$1¶$&¶11$&

Mettez n-2, n et n + 2 sur leurs propres lignes

m`^(11+)\1+$   

(Trait de fin de ligne) Supprimer tous les composites supérieurs à 1

1<`1¶1          

Vérifiez s'il y a deux nombres premiers consécutifs (ou 1,3 car 3 est un nombre premier jumeau)


2

Perl 6 , 24 octets

?(*+(0&(-2|2))).is-prime

Essayez-le en ligne!

*est l'argument de cette fonction anonyme. 0 & (-2 | 2)est la jonction composée des nombres 0ET ou -2OU 2. L'ajout *à cette jonction produit la jonction du nombre *ET de l'un ou l'autre des nombres * - 2OU * + 2. L'appel de la is-primeméthode sur cette jonction renvoie une valeur véridique si *est premier ET que * - 2OU soit * + 2premier. Enfin, le ?réduit la jonction véridique à une valeur booléenne, satisfaisant la condition de valeurs de retour cohérentes.


2

JavaScript, 91 octets , 81 octets grâce à Jared Smith

p=n=>{for(i=2;i<n;)if(n%i++==0)return !!0;return n>1},t=n=>p(n)&&(p(n+2)||p(n-2))

Explication

pindique si le nombre donné nest premier ou non, et tteste le nombre donné net n±2.

Exemple


Vous n'avez pas besoin du var, des parenthèses autour nde la définition de la fonction, etc.
Jared Smith

Je pense que vous pouvez modifier votre extrait pour afficher la valeur de à ncôté de la valeur de t(n)pour une clarté accrue (par exemple. 7: true)
Taylor Scott

1
Merci à vous deux
Serge K.

1

J, 23 octets

1&p:*.0<+/@(1 p:_2 2+])

Essayez-le en ligne!

Comment?

1&p:                               is the arg a prime?
    *.                             boolean and
                                   one of +2 or -2 also a prime
                     (1 p:_2 2+])  length 2 list of booleans indicating if -2 and +2 are primes
               @                   pipe the result into...
      0<+/                         is the sum of the elements greater than 0
                                   ie, at least one true

16 octets avec3>0#.@p:0 2 _2&+
miles

@miles nice. utilisation très intelligente de la base 2 pour traiter les résultats.
Jonah



1

JavaScript(ES6), 54 bytes

a=x=>f(x)&(f(x+2)|f(x-2));f=(n,x=n)=>n%--x?f(n,x):x==1


1

Excel VBA, 102 100 Bytes

No primality built-ins for VBA :(

Code

Anonymous VBE immediate window function that takes input from cell [A1] and outputs either 1 (truthy) or 0 (falsy) to the VBE Immediate window

a=[A1]:?p(a)*(p(a-2)Or p(a+2))

Helper Function

Function p(n)
p=n>2
For i=2To n-1
p=IIf(n Mod i,p,0)
Next
End Function

Alternatively, 122 Bytes

Code

Recursive primality checking function based solution

a=[A1]:?-1=Not(p(a,a-1)Or(p(a-2,a-3)*p(a+2,a+1)))

Helper Function

Function p(n,m)
If m>1Then p=p(n,m-1)+(n Mod m=0)Else p=n<=0
End Function

0

PHP, 85 bytes 24 bytes thanks to Mayube

e($n){return f($n)&&((f($n-2)||f($n+2)))
f($n){for($i=$n;--$i&&$n%$i;)return $i==1;}

This can be golfed considerably by changing the names of both functions to 1 character each (eg a and b)
Skidsdev

2
Doesn´t PHP need the function keyword anymore?
Titus


0

Japt, 13 bytes

j ©[U+2U-2]dj

Returns true and false for whether or not the number is part of a prime twin pair.

Try it online!

Explanation

Implicit: U = input integer

j ©

Check if the input is prime (j), AND (©) ...

[U+2U-2]dj

Using the array [U+2, U-2], check if any items are true (d) according to the primality function (j).

Implicit output of the boolean result of is input prime AND is any ±2 neighbor prime.


Hmm... I feel like [U+2U-2] could be much shorter, but I can't figure out how...
ETHproductions
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.