У мене головний близнюк?


23

Ціле число є простим, якщо і тільки якщо воно є позитивним і має рівно два різних дільника: 1 і себе. Двомісний простий пар складається з двох елементів: pі p±2, які є обома простими.

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

Випробування

  • Труті (Близнюки): 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)
daniero

Відповіді:



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 є простими.

Ця формула також працює для n = 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 є частиною пари близнюків.

  • Якщо п = 3 (подвійний просте число), (п + п% 6 - 3) п = 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, 16) чотири дільники ( 2 , 4 , 5 та 10 ) .

  • Якщо 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 має в [2, 36) три дільники ( 3 , 9 і 21 ) .

  • Якщо 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

Сітківка , 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
Thx для вас обох
Serge K.

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&+
миль

@miles приємно. дуже розумне використання бази 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(truthy), або 0(Falsy) в негайне вікно 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.