У меня есть главный близнец?


23

Целое число является простым тогда и только тогда, когда оно положительно и имеет ровно 2 различных делителя: 1 и себя. Двойная простая пара состоит из двух элементов: pи p±2, которые являются простыми.

Вам будет дано положительное целое число в качестве входных данных. Ваша задача - вернуть истинность / ложность в зависимости от того, принадлежит ли данное целое число к паре близнецов, следуя стандартным правилам (значения должны быть непротиворечивыми).

Тестовые случаи

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

  • Ложь (не Твин Праймс): 2, 15, 20, 23, 37, 47, 97, 120, 566

Это , поэтому выигрывает самый короткий код в байтах!


13 - главный близнец?
LiefdeWen

@LiefdeWen Да, потому что он принадлежит паре (11, 13)
Даниеро

Ответы:



11

Желе , 10 9 байт

%6+_2_ÆP⁺

Попробуйте онлайн!

Задний план

За исключением (3, 5) , все пары двойниковых простых чисел имеют вид (6k - 1, 6k + 1) .

Так как (6k - 1) + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 и
(6k + 1) + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 , учитывая вход n> 3 , достаточно проверить, являются ли n и n + n% 6 - 3 простыми.

Эта формула происходит с работы по п = 3 , а, как 3 + 3% 6 - 3 = 3 является простым и 3 является твин простое число.

Как это работает

%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 байта

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

Попробуйте онлайн!

Задний план

Все целые числа принимают одну из следующих форм с целым числом k : 6k - 3 , 6k - 2 , 6k - 1 , 6k , 6k + 1 , 6k + 2 .

Поскольку 6k - 2 , 6k и 6k + 2 - все четные, а 6k - 3 делится на 3 , все простые числа, кроме 2 и 3, должны иметь вид 6k - 1 или 6k + 1 . Поскольку разница пары простых двойников равна 2 , за исключением (3, 5) , все пары двойниковых простых чисел имеют вид (6k - 1, 6k + 1) .

Пусть n имеет вид 6k ± 1 .

  • Если n = 6k -1 , то n + n% 6 - 3 = 6k - 1 + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 .

  • Если n = 6k + 1 , то n + n% 6 - 3 = 6k + 1 + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 .

Таким образом, если n является частью пары простых чисел-близнецов и n ≠ 3 , ее двойником будет n + n% 6 - 3 .

Как это работает

Python не имеет встроенного теста на простоту. Несмотря на то, что существуют краткие способы проверки единственного числа на простоту, выполнение этого для двух чисел будет длительным. Вместо этого мы будем работать с делителями.

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

подсчитывает, сколько целых чисел k в интервале [2, 4n) делит (n + n% 6 - 3) n равномерно, то есть подсчитывает количество делителей (n + n% 6 - 3) n в интервале [2 , 4н) . Мы утверждаем, что это число равно 2 тогда и только тогда, когда n является частью пары простых чисел-близнецов.

  • Если n = 3 (двойное простое число), (n + n% 6 - 3) n = 3 (3 + 3 - 3) = 9 имеет два делителя ( 3 и 9 ) в [2, 12) .

  • Если n> 3 - простое число-близнец, как показано выше, m: = n + n% 6 - 3 - его двойник. В этом случае mn имеет ровно четыре делителя: 1, m, n, mn .

    Поскольку n> 3 , имеем m> 4 , поэтому 4n <mn и ровно два делителя ( m и n ) попадают в интервал [2, 4n) .

  • Если n = 1 , то (n + n% 6 - 3) n = 1 + 1 - 3 = -1 не имеет делителей в [2, 4) .

  • Если n = 2 , то (n + n% 6 - 3) n = 2 (2 + 2 - 3) = 2 имеет один делитель (сам) в [2, 8) .

  • Если n = 4 , то (n + n% 6 - 3) n = 4 (4 + 4 - 3) = 20 имеет четыре делителя ( 2 , 4 , 5 и 10 ) в [2, 16) .

  • Если n> 4 четное, 2 , n / 2 и n все делят n и, следовательно, (n + n% 6 - 3) n . Мы имеем n / 2> 2, так как n> 4 , поэтому в [2, 4n) есть по крайней мере три делителя .

  • Если n = 9 , то (n + n% 6 - 3) n = 9 (9 + 3 - 3) = 81 имеет три делителя ( 3 , 9 и 21 ) в [2, 36) .

  • Если n> 9 кратно 3 , то все 3 , n / 3 и n делят n и, следовательно, (n + n% 6 - 3) n . Мы имеем n / 3> 3, так как n> 9 , поэтому в [2, 4n) есть по крайней мере три делителя .

  • Наконец, если n = 6k ± 1> 4 не является двойным простым числом, то либо n, либо m: = n + n% 6 - 3 должны быть составными и, следовательно, допустить правильный делитель d> 1 .

    Поскольку либо n = m + 2, либо m = n + 2 и n, m> 4 , целые числа d , m и n являются различными делителями числа mn . Кроме того, m <n + 3 <4n, так как n> 1 , поэтому mn имеет по крайней мере три делителя в [2, 4n) .


Вау. Такой короткий код и все же так много особых случаев он должен обрабатывать правильно. По какой причине вы говорите Python 3? Насколько я могу сказать, это также работает в Python 2.
kasperd

Да, это будет работать так же хорошо в Python 2. 3 является частью автоматически сгенерированного сообщения SE из TIO.
Деннис


4

PHP, 52 байта

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

без GMP, 84 байта

(используя мою простую функцию из переполнения стека )

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

Беги как труба с -nF. Пустой вывод для фальши, 1для правды.

Отличное решение Денниса, портированное на PHP, 56 байт

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

Запустите как трубу с -nRили попробуйте онлайн .



3

MATL , 11 байт

HOht_v+ZpAa

Вывод 0или 1.

Попробуйте онлайн!

объяснение

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

Retina , 45 44 байта

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

1<`1¶1

Возвращает 1, если вход является двойным простым, 0 в противном случае

Попробуйте онлайн!

объяснение

.*              
$*

Преобразовать в унарный

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

Поместите n-2, n и n + 2 в свои строки

m`^(11+)\1+$   

(Завершающий перевод строки) Удалите все композиты больше 1

1<`1¶1          

Проверьте, есть ли два последовательных простых числа (или 1,3, потому что 3 - двойное простое число)


2

Perl 6 , 24 байта

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

Попробуйте онлайн!

*аргумент этой анонимной функции. 0 & (-2 | 2)это соединение, состоящее из чисел 0И или -2ИЛИ 2. Добавление *к этому соединению производит соединение числа *И с любым из чисел * - 2ИЛИ * + 2. Вызов is-primeметода на этом соединении возвращает истинное значение, если *простое И или * - 2ИЛИ * + 2простое. Наконец, ?сворачивание истинного перехода к булевому значению удовлетворяет условию непротиворечивых возвращаемых значений.


2

JavaScript, 91 байт , 81 байт благодаря Джареду Смиту

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

объяснение

pсообщает, является ли данное число nпростым или нет, и tпроверяет заданное число nи n±2.

пример


Вам не нужны varкруглые скобки nв определении функции и т. Д.
Джаред Смит

Я думаю, что вы могли бы отредактировать свой фрагмент, чтобы показать значение nрядом со значением t(n)для большей ясности (например, 7: true)
Тейлор Скотт

1
Спасибо вам обоим
Серж К.

1

J, 23 байта

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

Попробуйте онлайн!

как?

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 байт с3>0#.@p:0 2 _2&+
милями

@ милые милые очень умное использование базы 2 для обработки результатов.
Иона



1

JavaScript (ES6), 54 байта

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 байт

Нет встроенных примитивов для VBA :(

Код

Функция анонимного непосредственного окна VBE, которая принимает входные данные из ячейки [A1]и выводит 1(истинно) или 0(ложно) в непосредственное окно VBE

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

Вспомогательная функция

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

В качестве альтернативы 122 байта

Код

Решение на основе функции рекурсивной проверки простоты

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

Вспомогательная функция

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 байтов 24 байта благодаря Mayube

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

Это можно значительно улучшить, изменив имена обеих функций на 1 символ (например, aи b)
Skidsdev

2
Разве PHP больше не нужно functionключевое слово?
Тит


0

Japt , 13 байт

j ©[U+2U-2]dj

Возвращает trueи falseдля того, является ли число частью пары первичных близнецов.

Попробуйте онлайн!

объяснение

Неявный: U= входное целое

j ©

Проверьте, является ли ввод простым ( j), И ( ©) ...

[U+2U-2]dj

Используя массив [U+2, U-2], проверьте, являются ли какие-либо элементы истинными ( d) в соответствии с функцией первичности ( j).

Неявный вывод логического результата is input prime AND is any ±2 neighbor prime.


Хм ... Я чувствую, что [U+2U-2]мог бы быть намного короче, но я не могу понять, как ...
ETHproductions
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.