我有头生双胞胎吗?


23

一个整数是质数,当且仅当它是正数且正好具有2个不同的除数:1及其本身。双素数对由两个元素组成:pp±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

Answers:



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,检查nn + 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

在线尝试!

背景

所有整数采取以下形式,其中一个整数ķ6K - 36K - 26K - 16K6K + 16K + 2

由于6K - 26K6K + 2都是偶数,并且由于6K - 3是整除3,除了所有素数23的形式必须的6K - 16K + 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))

计数多少整数ķ在区间[2,1 4N)除以(N + N%6 - 3)N均匀,即,它计算的约数的数目(N + N%6 - 3)N在区间[2 ,4n)。我们声称,当且仅当n是双素数对的一部分时,此计数为2

  • 如果n = 3(双素数),则(n + n%6-3)n = 3(3 + 3-3 )= 9[2,12)中有两个除数(39

  • 如果n> 3是孪生素数,如前所示,m:= n + n%6-3是其孪生素数。在这种情况下,mn正好有四个除数:1,m,n,mn

    由于n> 3,我们有m> 4,所以4n <mn,正好两个除数(mn)落在区间[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具有四个除数(245,和10中)[2,16)

  • 如果n> 4为偶数,则2n / 2n都将n除,因此(n + n%6 -3)n。因为n> 4,所以我们有n / 2> 2,因此[2,4n)中至少有三个除数。

  • 如果N = 9,则(N + N%6 - 3)N = 9(9 + 3 - 3)= 81具有三个除数(39,和21中)[2,36)

  • 如果n> 93的倍数,则3n / 3n都将n除以,因此(n + n%6-3)n。由于n> 9,所以我们有n / 3> 3,因此[2,4n)中至少有三个除数。

  • 最后,如果n = 6k±1> 4不是双素数,则nm:= n + n%6-3必须是复合的,因此,可以接受适当的因数d> 1

    由于n = m + 2m = n + 2n,m> 4,因此整数dmnmn的不同因数。此外,由于n> 1m <n + 3 <4n,因此mn[2,4n)中至少具有三个除数。


哇。如此短的代码以及许多特殊情况必须正确处理。您说Python 3有什么理由?据我所知,它也适用于Python2。–
kasperd

是的,这在Python 2中同样有效。3是TIO自动生成的SE帖子的一部分。
丹尼斯


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真实。

Dennis的出色解决方案已移植到PHP,56字节

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

与管道一起运行-nR在线尝试



3

MATL,11个字节

HOht_v+ZpAa

输出为01

在线尝试!

说明

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)是由数字0AND或-2OR 组成的连接点2。添加*到该结点可生成数字*与任意一个数字的结点* - 2 OR * + 2is-prime如果*为prime并且* - 2OR 为Prime,则在此联结上调用方法将返回真实值* + 2。最后,?崩溃真值结点为布尔值,满足一致返回值条件。


2

JavaScript,91字节,81字节归功于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))

说明

p告诉我们给定数字n是否为质数,并t测试给定数字nn±2


你不需要的var,括号周围的n函数定义等
贾里德·史密斯

我认为您可以编辑代码段以显示的值 n旁边的值,t(n)以提高清晰度(例如7: true
Taylor Scott

1
谢谢你们
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很好。非常聪明地使用base 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,102100字节

没有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个字符(例如ab
大大提高效率

2
PHP function不再需要该关键字了吗?
泰特斯(Titus),


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's
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.