伯特兰素数


24

Bertrand的假设指出,对于每个整数n≥1,至少有一个素数p使得n <p≤2n。为了验证n <4000的该定理,我们不必检查4000个情况:Landau技巧说,检查

2, 3, 5, 7, 13, 23, 43, 83, 163, 317, 631, 1259, 2503, 5003

都是素数 因为这些数字中的每一个小于其前身的两倍,所以每个间隔{y:n <y≤2n}至少包含那些质数之一。

此数字序列为Bertrand素数(OEIS A006992),其定义如下:

a(1) = 2
a(n) = largest prime below 2a(n-1)

挑战

执行此序列。你可以写

  • 给定n的函数或程序返回a(n)(索引为0或1),
  • 给定n的函数或程序返回此序列的前n个(或n-1n + 1)条目,
  • 语言中的无限列表或流或生成器或类似的等效项。

Answers:


8

八度,32字节

k=2
do k=primes(k+k)(end)until 0

无限期地打印这些值(每个值前面都有k =)。

在线尝试!


八度,42字节

k=2
for i=2:input('')k=primes(k+k)(end)end

n作为输入并输出n个第一个值(每个值前面都有k =)。

在线尝试!


八度,51字节

k=2;for i=2:input('')k=primes(k+k)(end);end
disp(k)

Luis Mendo的MATL答案相似。将n作为输入并输出a(n)(1索引)。

在线尝试!


八度,60字节

k=2;for i=2:input('')k*=2;while~isprime(--k)
end
end
disp(k)

n作为输入并输出a(n)(1索引)。

在线尝试!


7

J,11个字节

_4&(p:+:)2:

在线尝试!

0索引。

_4&(p:+:)2:  Input: integer n
         2:  Constant 2
_4&(    )    Repeat n times
      +:       Double
_4  p:         Find the largest prime less than the double


6

05AB1E14 7 6字节

$F·.ØØ

在线尝试!


1个索引的答案(除非应该将0输出1),说明:

$       # Push 1 and input (n)...
 F      # n-times do... 
  ·     # Double the current prime (first iteration is 1*2=2).
   .ØØ  # Find prime slightly less than double the current prime.

之所以以1为索引,是因为所有迭代都使用进行“虚拟”迭代n=1


Fx.ØØ是如此接近...适用于以上任何条件n > 2
魔术章鱼缸

1
我有$F·ÅPθ相同的字节数。
Emigna

@Emigna有吗?就像0%一样哈哈。我的意思是,从技术上讲是一样的,但是不一样。仍然可以发布它; P。
魔术章鱼缸


5

果冻,6个字节

2ḤÆp$¡

在线尝试!

0索引。

说明

2ḤÆp$¡  Main link. Input: n
2       Constant 2
    $¡  Repeat n times
 Ḥ        Double
  Æp      Find the largest prime less than the double

你现在需要另一个字节 ;)...
魔术章鱼缸

@MagicOctopusUrn输入0会返回2,1返回3,依此类推。我没看到任何问题。
英里

我的意思是您需要在此答案上保留一个字节才能赢,因为我将您的字节数限制为6个字节,您的答案本身就很好。
魔术章鱼缸

5

玛特,9个字节

1i:"EZq0)

输入n,输出a 1索引的 n)。

在线尝试!

说明

1       % Push 1
i       % Push input n
:"      % Do the following that many times
  E     %   Multiply by 2
  Zq    %   Primes up to that
  0)    %   Get last entry
        % End (implicit). Display (implicit)

5

Stax,10 个字节

ü☼┌τ,æ▒ìn(

运行测试用例

此问题暴露了stax的的实现中的错误,该错误:p得到的最大质数少于其输入的指令。如果正常工作,将有一个5 6字节的解决方案。 但是可惜的是,没有,没有。 作为语言的创造者,我将修复它,但是在问题发布后修复和使用它似乎有点便宜。

无论如何,这是上面程序的相应ascii表示。

ODH{|p}{vgs

这是问题陈述的相对简单的实现。唯一可能有趣的是使用gs生成器形式。生成器是将初始条件,转换和过滤器组合在一起以产生一个或多个令人满意的值的构造系列。在这种情况下,它用于代替残破的:p指令。

O               Push integer 1 underneath the input number.
 D              Pop the input and repeat the rest of the program that many times.
  H             Double number.
   {|p}         Predicate block: is prime?
       {vgs     Decrement until the predicate is satisfied.
                Output is implicitly printed.

编辑: 是6字节的解决方案,但它要求仅在发布此挑战后才应用的错误修复。


语言不错!我已将其添加到我的高尔夫语言列表中。让我知道您是否发现任何错误,或者是否还有其他想要添加的内容。
ETHproductions '18

@ETHproductions:很好,谢谢!如果您不介意,是否可以将解释器URL更改为staxlang.xyz, 我决定为其提供域。
递归

1
哇,整个领域只适合打高尔夫吗?幸运的esolang;)更新!
ETHproductions '18

@recursive WOW,每个xyz域1.99美元?我进去了
魔术章鱼缸

4

Python 2,63个字节

r=m=k=P=2
while k:
 P*=k;k+=1
 if k>m:print r;m=r*2
 if P%k:r=k

在线尝试!

永远打印。

使用威尔逊定理素数生成器,即使向前生成素数对此问题比较笨拙。跟踪当前看到的最大素数r和边界加倍m

这样做会节省两个字节,P*=k而不是P*=k*k像往常一样保存字节,因为唯一的效果是声称4是质数,而加倍的顺序会丢失它。


4

CJam(15字节)

2{2*{mp},W=}qi*

在线演示。请注意,这是0索引。


一种更有效的方法是向后搜索,但这需要一个字符,因为它不能使用隐式,(范围):

2{2*,W%{mp}=}qi*

4

Japt16 14 13 12字节

价格为1的两种解决方案,均采用1索引。


第N学期

最后,我可以编写一个有效的解决方案来作为一个挑战F.g()

_ôZ fj Ì}g°U

试试吧

                 :Implicit input of integer U
_       }g       :Starting with the array [0,1] take the last element (Z),
                 :pass it through the following function
                 :and push the returned value to the array
 ôZ              :  Range [Z,Z+Z]
    fj           :  Filter primes
       Ì         :  Get the last item
          °U     :Repeat that process U+1 times and return the last element in the array

前N个词

ÆV=ôV fj ̪2

试试吧

                 :Implicit input of integer U
                 :Also makes use of variable V, which defaults to 0
Æ                :Create range [0,U) and pass each through a function
  ôV             :  Range [V,V+V]
     fj          :  Filter primes
        Ì        :  Get the last item
         ª2      :  Logical OR with 2, because the above will return undefined on the first iteration
 V=              :  Assign the result of the above to V




2

Python 2,68个字节

无限期打印序列(您必须第二次单击“运行”以停止执行)。

k=2
while 1:
 print k;k+=k
 while any(k%u<1for u in range(2,k)):k-=1

在线尝试!

Python 3,90个字节

返回第n 项。

f=lambda n,i=1,p=1:n*[0]and p%i*[i]+f(n-1,i+1,p*i*i) 
a=lambda n:n and f(2*a(n-1))[-1]or 1

在线尝试!


2

C(gcc)97 87 86 80 79字节

  • 通过内联非素校验功能节省了十个字节 P到主循环中,。
  • 通过移动 printf通话。
  • 通过返回以下内容节省了六个字节 i -th个序列项(索引为0)而不是输出永无休止的流来。
  • 多亏了ceilingcat,节省了一个字节。
f(p,r,i,m,e){for(r=2;p--;)for(e=0,i=r+r;e=m=!e;r=i--)for(;i-++m;e=e&&i%m);p=r;}

在线尝试!


@ceilingcat谢谢。
乔纳森·弗雷奇

1

附件,38字节

{If[_,Last[Series[Prime,2*$[_-1]]],2]}

在线尝试!

从0开始;返回nth Bertrand素数。

当前没有内建函数可以找到上一个/下一个素数,因此我使用Series内建函数来计算所有素数2*$[_-1]。最后一个表达式使用隐式递归(绑定到$)轻松定义递归关系。if条件用于确定基本条件。



1

视网膜,39字节

.K`_
"$+"{`_
__
+`^(?=(..+)\1+$).

*\`_

在线尝试!说明:

.K`_

从1开始

"$+"{`

使用输入作为循环计数重复循环。

_
__

将值加倍。

+`^(?=(..+)\1+$).

找到小于该值的最高质数。

*\`_

打印出来。


0

Ruby,51 + 7(-rprime)= 58字节

->n{x=2
n.times{x=(x..2*x).select(&:prime?)[-1]}
x}

在线尝试!

兰伯接受n并返回nth零索引的Bertrand素数。这里没有太多,但是无论如何我还是要取消高尔夫:

->n{
  x=2                       # With a starting value of 2
  n.times{                  # Repeat n times:
    x=(x..2*x)              # Take the range from x to its double
      .select(&:prime?)[-1] # Filter to only primes, and take the last
  }
  x                         # Return
}

红宝石,48 + 7 = 55字节

x=2
loop{puts x
x*=2
loop{(x-=1).prime?&&break}}

在线尝试!

为了好玩,这里有一个无限循环的解决方案。它随即打印,并且需要中断。根据中断的确切时间,您可能会看到或可能不会看到输出。取消高尔夫:

x=2
loop{
  puts x
  x*=2
  loop{
    (x-=1).prime? && break
  }
}

0

APL(Dyalog扩展),12字节

将用户的输入作为N,返回序列的第N个元素(0索引)。

42×⍵}⍣⎕⊢2

在线尝试!

说明:

42×⍵}⍣⎕⊢2  Full program
              Get input from user - call it 'N'
          2  Repeat the left function N times, beginning with 2
    2×⍵        Double the function input
 ¯4           Find the largest prime less than above

0

[R,87字节

给定n输出a(n)

j=scan();n=2;while(j-1){for(i in (n+1):(2*n)){n=ifelse(any(i%%2:(i-1)<1),n,i)};j=j-1};n

在线尝试!

我仍在研究“给定n输出a(1),a(2)... a(n)”。我以为我可以稍微修改一下这段代码,但是似乎比这困难得多。

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.