素数的孤独


24

最近,我读了小说素数的孤独》,其中主要字符与双素数(“ 总是在一起,但从未碰过 ”)进行了比较。

孪生素是一个素数要么是2或更少2多于另一个素数-例如,孪生素对(41,43)。换句话说,孪生素数是素数差距为2的素数。有时,双素数一词用于一对双素数。此名称的替代名称是素对双胞胎或素对。维基百科

尽管我不太喜欢那部令人沮丧的小说,而且由于我最近陷入了PPCG的境地,所以这在我脑海中引发了一个疑问……

任务:

给定一个正整数N> 4,找出最接近的一对双素数之间的孤独素数(AKA 孤立素数

请注意,在这种情况下,术语“ 素数素数”是指所有不是双素数且在成对素数之间的所有素数。这就是N> 4的原因,因为前两个素数对是(3,5)和(5,7)。

例:

  1. N = 90。
  2. 查找前两个素数<N和> N的前两对。它们分别是(71,73)和(101,103)。
  3. 在> 73和<101的范围内找到孤独的素数
  4. 他们是:79、83、89、97。

特别案例:

  • 如果N在两个孪生素数之间,请找到> N + 1和<N-1的最接近的孪生素数对。示例:N = 72,找到> 73和<71的双素数最接近的对,然后将它们排除在列表71和73中,因为它们不是孤独的素数。因此,对于N = 72的预期的结果是:67,7173,79,83,89,97
  • 如果N属于一对孪生素数,例如N = 73,则最接近的一对孪生素数是(71,73)和(101,103)。如果N = 71,则双素数最接近的对是(59,61)和(71,73)。

测试用例:

N = 70   >  Lonely primes are:  67
N = 71   >  Lonely primes are:  67
N = 72   >  Lonely primes are:  67, 79, 83, 89, 97 (not the twins 71 and 73)
N = 73   >  Lonely primes are:  79, 83, 89, 97 
N = 90   >  Lonely primes are:  79, 83, 89, 97
N = 201  >  Lonely primes are:  211, 223
N = 499  >  Lonely primes are:  467, 479, 487, 491, 499, 503, 509

规则:

  • 编写一个完整的程序或函数,该程序或函数将从标准输入中获取数字N。
  • 以易读的格式(例如csv,列表,数组等)输出孤独素数的列表。
  • 最短的代码胜出。
  • 请(如果可能)包括可测试的在线小提琴。

4
71、72或73等输入的预期输出是什么?
马丁·恩德

1
孤独的总理又名孤立的总理
数字创伤

@MartinEnder我用特殊情况扩展了我的问题。感谢您的澄清。
马里奥

1
我发现特殊情况稍微破坏了挑战(在发布一些答案
后才

1
@JonathanAllan是的,您可以考虑N> 4,因为孪生素数的前两对分别是(3,5)和(5,7)。我添加了规范,以使所有人都清楚。
马里奥

Answers:


2

实际上是47个字节

这与在情况溶液交易n是两张的素数之间,通过检查下界较大的一对双素数的(从成为我们下界消除了孪生素到我们留下的),并且如果上界就是一对孪生素数中的较小者(从我们的上限消除了我们右边的孪生素数)。为了防止孪生素数被包含在我们的范围内,一旦我们有上限和下限,我们需要删除的素数p,其中p-2OR p+2是主要的,因此在代码的逻辑OR和否定。

这有点长,可能还可以打高尔夫球。欢迎打高尔夫球。在线尝试!

╗1`╜+;⌐p@p&`╓F╜+1`╜-;¬p@p&`╓F╜-x`;;¬p@⌐p|Y@p&`░

开球

╗         Store implicit input n in register 0.

1`...`╓   Get the first value x for which the following function f returns a truthy value.
  ╜         Push n from register 0.
  +         Add x to n.
  ;⌐        Duplicate n+x and add 2 to a copy of n+x.
  p         Check if n+x+2 is prime.
  @p        Swap n+x to TOS and check if n+x is prime.
  &         Logical AND the two results.
F         Push the first (and only) result of previous filtering
╜+        Add that result to n to get the upper bound for our solitude.

1`...`╓   Get the first value x for which the following function f returns a truthy value.
  ╜         Push n from register 0.
  -         Subtract x from n.
  ;¬        Duplicate n-x and subtract 2 from a copy of n-x.
  p         Check if n-x-2 is prime.
  @p        Swap n-x to TOS and check if n-x is prime.
  &         Logical AND the two results.
F         Push the first (and only) result of previous filtering.
╜-        Subtract that result from n to get the lower bound for our solitude.

x`...`░   Push values of the range [a...b] where f returns a truthy value. Variable m.
  ;;        Duplicate m twice.
  ¬p        Check if m-2 is prime.
  @⌐p       Check if m+2 is prime. 
  |Y        Logical OR the results and negate.
             This eliminates any numbers with neighboring primes.
  @p        Check if m is prime.
  &         Logical AND primality_check(m) and the previous negation.
             This keeps every other prime number in the range.

23输入时我没有得到预期的输出24。孪生素数边界应为17 / 1929 / 31,并且23是范围内的孤立素数19 .. 29
AdmBorkBork

@TimmyD哦,对esolangs的热爱。自修复该错误以来,要么p25尚未修复的错误要么尚未修复,要么丹尼斯尚未撤出。我去检查一下
Sherlock16年

@TimmyD由于错误修复已完成,因此由于主要解释器的工作,此答案仍然有效。只是在线解释器Try It Online尚未更新。此后已更新,TIO现在应该可以工作。
Sherlock16年

是的-感谢您的解释!
AdmBorkBork

8

PowerShell的V2 +,237 149 147 231 216个 181 174 169 166字节

param($n)filter f($a){'1'*$a-match'^(?!(..+)\1+$)..'}for($i=$n;!((f $i)-and(f($i+2)))){$i++}for(){if(f(--$i)){if((f($i-2))-or(f($i+2))){if($i-lt$n-1){exit}}else{$i}}}

接受输入$n。将一个新函数定义fregex素数函数(如果输入是否为素数,在此返回一个布尔值)。

下一部分设置$i$n,然后向上循环,直到找到孪生素数对上限的下半部分。例如,对于输入90,此位置在停止$i=101

然后,我们从上限向下循环。我知道,它看起来像一个无限循环,但最终会结束。

如果当前数字是质数(f(--$i)),+/- 2 不是质数,则将其添加$i到管道中。但是,如果它+/- 2是素数,则我们检查是否低于$n-1(即,考虑到它在双素数对中的情况)exit。程序完成时,通过隐式将管道打印到屏幕上Write-Output

注意-由于采用了循环结构,因此按降序打印素数。OP明确表示可以。

例子

此处的输出以空格分隔,因为这是数组的默认字符串化方法。

PS C:\Tools\Scripts\golfing> 70,71,72,73,90,201,499,982|%{"$_ --> "+(.\the-solitude-of-prime-numbers.ps1 $_)}
70 --> 67
71 --> 67
72 --> 97 89 83 79 67
73 --> 97 89 83 79
90 --> 97 89 83 79
201 --> 223 211
499 --> 509 503 499 491 487 479 467
982 --> 1013 1009 997 991 983 977 971 967 953 947 941 937 929 919 911 907 887

4

Haskell,105个字节

p x=all((>0).mod x)[2..x-1]
a%x=until(\z->p z&&p(z+2*a))(+a)x
f n=[x|x<-[(-1)%n+1..1%n-1],p x,1%x>x,(-1)%x<x]

在线尝试


3

JavaScript中,186 183 168 158个字节

// solution:
function d(d){function p(n){for(i=n;n%--i;);return!--i}u=d;for(;!p(d--)||!p(--d););for(;!p(u++)||!p(++u););for(;++d<u;)if(p(d)&&!p(d-2)&&!p(d+2))console.log(d)}

// runnable test cases:
console.info('Test ' + 70);
d(70);
console.info('Test ' + 71);
d(71);
console.info('Test ' + 72);
d(72);
console.info('Test ' + 73);
d(73);
console.info('Test ' + 90);
d(90);
console.info('Test ' + 201);
d(201);
console.info('Test ' + 499);
d(499);


欢迎来到PPCG!不错的第一答案。
AdmBorkBork

2

PHP,207字节

47 54字节用于is_primePHP所没有的功能。如果没有那点,我将击败Mathematica。:-D

function p($n){for($i=$n>1?$n:4;$n%--$i;);return$i<2;}if(p($n=$argv[1])&p($n+2)|$z=p($n-1)&p($n+1))$n-=2;for($n|=1;!p($n)|!p($n-2);$n--);for($z++;$z--;$n+=2)for(;$n+=2;)if(p($n)){if(p($n+2))break;echo"$n,";}

与运行-r。打印尾随逗号。

分解

// is_prime function:
// loops from $n-1 down to 1, breaks if it finds a divisor.
// returns true if divisor is <2 (==1)
// special case $n==1: initialize $i=4 to prevent warnings
function p($n){for($i=$n>1?$n:4;$n%--$i;);return$i<2;}

// is $n between primes?
if($z=p(1+$n=$argv[1])&p($n-1)) // set $z to go to the _second_ twin pair above
    $n-=2;
// no:
else
    if(p($n)&p($n+2))$n-=2;     // $n is part of the upper pair
    // p($n)&p($n-2):           // $n is part of the lower pair
    // else:                    // this is a lonely (isolated) prime

// 1. find closest twins <=$n
for($n|=1;!p($n)|!p($n-2);$n--);

// 2. list primes until the next twin primes
L:
for(;$n+=2;)if(p($n))
    if(p($n+2))break;       // next twin primes found: break loop
    else echo"$n,";         // isolated prime: print

// 3. if ($z) repeat (once)
$n+=2;  // skip twin pair
if($z--)goto L;

注意事项

is_prime函数实际上返回true$n<2; 但至少不会发出警告。插入$n=之前$n>1进行修复。



@JörgHülsermann:如果要提供至少11个字节,如果gmp在标准安装中。试试吧。
泰特斯(Titus)

1

Mathematica,169157字节

Select[PrimeQ]@Sort@Flatten@{If[q@#,0,#],Most@NestWhileList[i-=2;#+i&,#,!q@#&]&/@(i=3;q=PrimeQ@#&&Or@@PrimeQ[{2,-2}+#]&;#+{1,-1}(1+Boole@PrimeQ[{1,-1}+#]))}&

1

拍子228字节

(λ(n)(let*((t 0)(lr(λ(l i)(list-ref l i)))(pl(drop(reverse(for/list((i(in-naturals))#:when(prime? i)#:final(and(> i n)
(= 2(- i t))))(set! t i)i))2)))(for/list((i(length pl))#:break(= 2(-(lr pl i)(lr pl(add1 i)))))(lr pl i))))

此版本的缺点是它会找到直到N的所有素数,而不仅仅是N周围的素数。

非高尔夫版本:

(define (f n)
  (let* ((t 0)
         (lr (λ(l i) (list-ref l i)))
         (pl (drop(reverse  
                   (for/list ((i (in-naturals))
                              #:when (prime? i)
                              #:final (and
                                       (> i n)
                                       (= 2 (- i t))))
                     (set! t i)
                     i)) 2)))
    (for/list ((i (length pl))
               #:break (= 2 (- (lr pl i) (lr pl (add1 i)))) )
      (lr pl i)))
)

测试:

(f 90)

输出:

'(97 89 83 79)

1

拍子245字节

(λ(n)(let((pl(reverse(let lp((n n)(t 0)(ol '()))(set! t(prev-prime n))(if(and(>(length ol)0)
(= 2(-(car ol)t)))(cdr ol)(lp t 0(cons t ol)))))))(let lq((n n)(t 0)(ol pl))(set! t(next-prime n))
(if(= 2(- t(car ol)))(cdr ol)(lq t 0(cons t ol))))))

非高尔夫版本:

(require math)
(define f
  (lambda(n)
    (let ((pl 
           (reverse
            (let loop ((n n) (t 0) (ol '()))
              (set! t (prev-prime n))
              (if (and
                   (> (length ol) 0)
                   (= 2 (- (car ol) t)))
                  (cdr ol)
                  (loop t 0 (cons t ol)))))))
      (let loop2 ((n n) (t 0) (ol pl))
        (set! t (next-prime n))
        (if (= 2 (- t (car ol)))
            (cdr ol)
            (loop2 t 0 (cons t ol))))))
  )

(f 90)

输出:

'(97 89 83 79)

1

Python 2.7:160个字节

t=lambda n:all(n%d for d in range(2,n))
def l(n):
 i=n
 while t(i)*t(i+2)-1:i+=1
 while t(n)*t(n-2)-1:n-=1
 print[x for x in range(n,i)if t(x)&~(t(x-2)|t(x+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.