是陈素吗?


27

如果数字满足两个条件,则它是Chen质数:

  • 它本身就是素
  • 本身加两个是素数或半素数。

质数是一个数字,其中恰好有两个除数,并且这些除数由自身和一个除数组成。

半素数是两个素数的乘积。(请注意,12 = 2 * 2 * 3不是半素数,而25 = 5 * 5是)。

您的任务是确定数字是否为Chen质数。您应将任何真实值输出为是,将任何虚假值输出为否。

输入将是大于或等于1的任何整数。也可以将其视为字符串,字符数组或数组或数字。

例子:

101 -> truthy
223 -> falsy
233 -> truthy
1 -> falsy

这是OEIS A109611

这在一定程度上是受苏菲·日耳曼(Sophie Germain)总理的启发吗?不幸的是,它作为重复项目被关闭,所以我要发布一个与之相关的挑战,不是重复项目。


我们可以返回True真假2还是False假假(不一致的假假值)?
Xcoder先生17年

@ Mr.Xcoder从来没有说过你不能做
Okx

对于半素数,“恰好两个素数”是否计数多重性?是2 * 2 * 2 * 3 * 3半素?那5 * 5
不是一棵树

@Notatree 5*5是半素数,2*2*2*3*3不是。我说两个。
Okx

那么,它是否算多重性呢?(您可以争辩说,它2*2*2*3*3有两个主要因素,即235*5有一个主要因素,即5。。)也许您可以将其编辑为问题?
不是一棵树

Answers:


12

Brachylog,7个字节

ṗ+₂ḋl≤2

在线尝试!

说明

ṗ         Input is prime       
   ḋ      The prime factorization of…
 +₂       … Input + 2…
    l≤2   … has 2 or less elements

1
我刚好在48,000次抓到Neil,现在您恰好在22,222次
抓捕

11

05AB1E,8个字节

p¹ÌÒg3‹*

在线尝试!

说明

p¹ÌÒg3‹*   Argument n
p          Push isPrime(n)
 ¹ÌÒ       Push list of prime factors of (n+2)
    g3‹    Length of list is lower than 3
       *   Multiplication of boolean values, 0 if either is 0 (false)

6

ArnoldC,1339字节

LISTEN TO ME VERY CAREFULLY q
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE p
GIVE THESE PEOPLE AIR
HEY CHRISTMAS TREE c
YOU SET US UP 0
HEY CHRISTMAS TREE d
YOU SET US UP 0
HEY CHRISTMAS TREE l
YOU SET US UP p
STICK AROUND l
GET TO THE CHOPPER d
HERE IS MY INVITATION p
I LET HIM GO l
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE d
BULLSHIT
GET TO THE CHOPPER c
HERE IS MY INVITATION c
GET UP 1
ENOUGH TALK
YOU HAVE NO RESPECT FOR LOGIC
GET TO THE CHOPPER l
HERE IS MY INVITATION l
GET DOWN 1
ENOUGH TALK
CHILL
I'LL BE BACK c
HASTA LA VISTA, BABY
IT'S SHOWTIME
HEY CHRISTMAS TREE p
YOU SET US UP 0
GET YOUR ASS TO MARS p
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
HEY CHRISTMAS TREE n
YOU SET US UP 0
GET YOUR ASS TO MARS n
DO IT NOW q p
HEY CHRISTMAS TREE g
YOU SET US UP 42
GET TO THE CHOPPER g
HERE IS MY INVITATION n
YOU ARE NOT YOU YOU ARE ME 2
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE g
GET TO THE CHOPPER p
HERE IS MY INVITATION p
GET UP 2
ENOUGH TALK
GET YOUR ASS TO MARS n
DO IT NOW q p
GET TO THE CHOPPER g
HERE IS MY INVITATION 5
LET OFF SOME STEAM BENNET n
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE g
TALK TO THE HAND "t"
BULLSHIT
TALK TO THE HAND "f"
YOU HAVE NO RESPECT FOR LOGIC
BULLSHIT
TALK TO THE HAND "f"
YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

在线尝试!

(这是我在codegolf.SE上的第一篇文章,请让我知道它的格式是否错误。我意识到此字节数没有竞争力,这只是为了好玩。)



5

Pyth,10个字节

&P_Q>3lP+2

在线尝试!

怎么样?

&P_Q>3lP+2  # input: Q
        +2  # Q + 2
       P    # prime factors
    >3l     # length lower than 3?
 P_Q        # Q is prime?
&           # and both results

>。<出庭>。<
Xcoder先生17年

@ Mr.Xcoder实际上,我是在5分钟前发布我的信息的
Uriel

是啊,没看出来,因为互联网连接状况不佳的
Xcoder先生

3

带有sympy的Python 69  56字节

感谢alephalpha -13个字节(通过升级到sympy 1.1并primeomega(n+2)用于替换sum(factorint(n+2).values())

...接管了狮ry的已删除稿件。

from sympy import*
lambda n:primeomega(n+2)<3*isprime(n)

返回TrueChen素数或False其他函数的未命名函数。

n+2通过求和其主要因子的乘数来计算因子。

请注意,在进行比较之前3会乘以,因此对于非素数,代码会测试是否具有小于因子(总是yield ),而对于素数,则检查是素数还是半素数。isprime(n)<nn+20Falsenn+2


@Gryphon-我接管了,但是如果没有任何进口,它可能是可击败的。
乔纳森·艾伦

我已经出气了!该3*isprime(n)诀窍是什么,我在清理条件语句寻找。
Chase Vogeli '17

啊,@ icosahedron,我没注意到你的,对不起-这太相似了,我会发表评论以帮助你改善你的。请随意处理此答案,请让我知道,我将删除该答案。
乔纳森·艾伦

我认为sympy具有primomega功能。
alephalpha

@alephalpha谢谢,刚刚升级到1.1可以看到它,它将节省字节!
乔纳森·艾伦


3

Java 8,85 84 83字节

n->{int a=n+2,b=0,c=0,i=1;for(;i++<n;b+=n%i<1?1:0)c+=a%i<1?1:0;return n>1&b<2&c<3;}

@OlivierGrégoire通过使用迭代方法而不是递归来获得-1个字节。

说明:

在这里尝试。

n->{            // Method with integer parameter and boolean return-type
  int a=n+2,    //  Start `a` at the input + 2
      b=0,c=0,  //  Start `b` and `c` at 0
      i=1;      //  Start `i` at 1
  for(;i++<n;   //  Loop from 1 to `n` (and raise `i` immediately by 1)
    b+=n%i<1?   //   If the input is divisible by `i`
        1       //    Raise `b` by 1
       :        //   Else:
        0)      //    Leave `b` as is
    c+=a%i<1?   //   If the input + 2 is divisible by `i`:
        1       //    Raise `c` by 1
       :        //   Else:
        0;      //    Leave `c` as is
                //  End of loop (implicit / single-line body)
  return n>1    //  Return if the input is larger than 1
         &b<2   //   And `b` is now smaller than 2
         &c<3;  //   And `c` is now smaller than 3
}               // End of method

迭代版本仅短一个字节:n->{int N=n+2,f=0,F=0,d=1;for(;d++<n;f+=n%d<1?1:0)F+=N%d<1?1:0;return n>1&f<2&F<3;}
奥利维尔·格雷戈尔


2

JavaScript(ES6),63 61字节

g=(e,i=e)=>i--<3?1:e%i?g(e,i):g(i)+1
f=e=>e>1&g(e)<2&g(e+2)<3
Test cases:<br><textarea id=i rows=6 oninput="go()">101&#10;223&#10;233&#10;1</textarea><br><pre id=q></pre><script>window.onload=function go(){document.getElementById('q').innerHTML=document.getElementById('i').value.split('\n').map(e=>e+' -> '+f(+e)).join('\n')}</script>

定义一个函数f这需要n作为参数并返回结果。我对结果感到非常满意g;它计算一个数字中素数的数量。

多亏了Kevin Cruijssen的&把戏,节省了2个字节。

不打高尔夫球

Ω = (n,          // Ω(n) = number of n's prime factors, n > 1.
    i = n) =>    // Start iterating from i = n - 1. Since we'll immediately
                 // decrement i, n is used here.
    --i          // Immediately decrement i.

    < 2          // If i = 0 or i = 1, n is a prime at this point.
    ? 1 :        // Therefore Ω(n) = 1.

    n % i != 0 ? // If n is not divisible by i,
    Ω(n, i)      // try again with i := i - 1 (immediately decremented, so use i).

    : Ω(i) + 1   // n is divisible by i. Since we're counting down from n - 1
                 // and i is the first such number, i is n's largest non-trivial
                 // divisor, and thus n/i is a prime.
                 // Therefore Ω(n) = Ω(i) + Ω(n/i) = Ω(i) + 1.

is_chen = n =>     // An integer n ≥ 1 is a Chen prime if and only if:
    n > 1          // n > 1,
    & Ω(n) < 2     // Ω(n) = 1 < 2, i.e. n is a prime, and
    & Ω(n + 2) < 3 // Ω(n + 2) < 3, i.e. n + 2 is a prime or a semiprime.

您不能将两者都更改&&&吗?由于0/1也是JS中的真/假值?
凯文·克鲁伊森

@KevinCruijssen似乎可行。太糟糕了|而且&不要短路,这可能会在中节省更多的字节g
PurkkaKoodari


2

PHP,64字节

for($i=$n=$argn+2;--$i;$argn%$i?:$q++)$n%$i?:++$p;echo$p<4^--$q;

打印0为真,其他整数为假。与管道一起运行-nR在线尝试

分解

for($i=$n=$argn+2;--$i; # loop $i from N+1 to 1
    $argn%$i?:$q++)         # if $i divides N, increment $q
    $n%$i?:++$p;            # if $i divides N+2, increment $p
echo$p<4                # $p is 1 for a prime, 3 for a semiprime
    ^--$q;              # $q is 2 for prime; so this is 1^1 (==0) for a Chen Prime

一致的假值,65个字节:

for($i=$n=2+$k=$argn;--$i;$k%$i?:$q++)$n%$i?:++$p;echo$p<4&$q==2;

打印1真相和0虚假。


1

Python 3中与SymPy,73 71个字节

lambda n:(sum(factorint(n+2).values())<3)&isprime(n)
from sympy import*

在线尝试!


这是早先在此处发布的答案的摘要版本,但似乎已被删除。


感谢@JonathanAllan节省了2个字节!


1
...还请注意,您不需要f=,创建未命名函数对代码高尔夫球来说是很好的。
乔纳森·艾伦


1

APL NARS,23个字符

{1≥⍵:0⋄(1=⍴π⍵)∧3>⍴π⍵+2}

此处,π⍵返回from的因子数组,该因子与1不同;一些测试:

  f←{1≥⍵:0⋄(1=⍴π⍵)∧3>⍴π⍵+2}
  f 101
1 
  f 223
0 
  f 233
1 
  f 1
0
  f ¯10
0

1

正则表达式(ECMAScript),31个字节

^(?!((xx+)(\2(xx))*)(\1\4)+$)xx

在线尝试!(显示所有陈数≤1000的陈数)

给定一串n x s,当且仅当n是Chen质数时,此正则表达式将匹配。

它断言n大于2,并且字符串的格式不正确。((xx+)(\2(xx))*)(\1\4)+
此正则表达式有两种含义,具体取决于(\2(xx))重复的次数。
如果将其重复0次,则可以将regex简化为(xx+)\1+,以匹配复合数字。
当重复正数次时,正则表达式等于((xx+)(\2xx)+)(\1xx)+

该正则表达式需要一些解释,但是,我将提供很少的见解。
如果您遍历代数,则会发现((xx+)(\2xx)+)(\1xx)+与形式a*b*c-2where 匹配的数字a≥4,b≥2,c≥2
因此,只要n +2具有两个以上素数,它将匹配(几乎)。(即素数和半素数都没有)
请注意,它与6、16或25不匹配,但这并不重要,因为它们都是复合的。

因此,(?!((xx+)(\2(xx))*)(\1\4)+$)如将只要符合ñ是不是复合,并ñ +2或者是黄金或半素。
不幸的是,其中包括1(和0),因此我们检查n是否至少为2xx

几个不同的“ 31个字节”是:

^xx(?!((x*)(\2xx)+)\1?(\1xx)*$)
^(?!(xx((x*)(\3xx)+))\2?\1*$)xx

1

红宝石49 41字节

->n{/^(.?|((..+)\3+))(\2+|..)$/!~?l*n+=2}

在线尝试!

感谢H.PWiz -8个字节

怎么样?

首先,获得一串'l'重复n + 2次的字符串。然后应用正则表达式检查是否:

  • 长度为2或3 (.?)(..)
  • 长度是一个复合数字加2 ((..+)\1)(..)
  • 长度是至少3个数字的乘积 ((..+)\2)\1+

这两个正则表达式部分生成了第四个情况,该情况没有意义,可以忽略::(.?)\2+,由于为空,因此可以解析为空字符串或单个字符\2


您可以将靠得很|近的两半合并在一起:^((..+)\2+)(\1+|..)$。另外,您在与我相似的时间尝试了regex这个问题的巧合:)
H.PWiz

我相信您可以使用.代替,.?因为输入始终至少为1
H.PWiz

0

朱莉娅59字节

x->((0∉x%(2:x-1))&(length(find(x->x==0,(x+2)%(2:x)))<=2))


0

Haskell 163字节

p k=last$(not$elem 0(map(mod k)[2..k-1])):[1>2|k<=1]
r=round
s n=p(r n)||any(\(a,b)->p(r a)&&p(r b))[(n/x,x)|x<-[2..n],n/x==(fromIntegral.r)n/x]
c n=p(r n)&&s(n+2)

在线尝试!

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.