古巴总理


20

给定自然数,返回第个古巴质数ñn

古巴Prime

古巴素数是形式的素数

p=x3y3xy

其中且或y>0x=1+yx=2+y

细节

  • 您可以使用最适合您的索引(基于0或1)。
  • 您可以返回给出的指数个主要或第一按升序排列的素数,或者你可以返回一个无限列表/发电机产生递增的顺序的素数。ñññ

测试用例

前几个术语如下:

(#1-13)   7, 13, 19, 37, 61, 109, 127, 193, 271, 331, 397, 433, 547,
(#14-24) 631, 769, 919, 1201, 1453, 1657, 1801, 1951, 2029, 2269, 2437,
(#25-34) 2791, 3169, 3469, 3571, 3889, 4219, 4447, 4801, 5167, 5419,
(#35-43) 6211, 7057, 7351, 8269, 9241, 10093, 10267, 11719, 12097,
(#44-52) 12289, 13267, 13669, 13873, 16651, 18253, 19441, 19927, 20173

在OEIS上可以找到更多的术语:根据或,它们分为两个序列:A002407A002648X=1个+ÿX=2+ÿ


2
我们可以返回未排序的前n个素数吗?
J42161217

@ J42161217不,素数应按升序排列。
flawr

Answers:


23

JavaScript(V8),54个字节

可以永久打印古巴素数的完整程序。

for(x=0;;){for(k=N=~(3/4*++x*x);N%++k;);~k||print(-N)}

在线尝试!

注意:除非您在您的打印机有无限的纸张,不要试图在你的浏览器控制台运行此,其中print()可能有不同的含义。


JavaScript(ES6), 63 61 60  59字节

返回第ñ个第1个索引的古巴质数。

f=(n,x)=>(p=k=>N%++k?p(k):n-=!~k)(N=~(3/4*x*x))?f(n,-~x):-N

在线尝试!

怎么样?

这是基于以下事实:古巴素数是以下形式的素数:

pñ=3ñ24+1个ñ3

上面的公式可以写成:

pñ={3ñ2+1个4 如果 ñ 很奇怪3ñ2+44 如果 ñ 甚至

或任何ÿ>0

p2ÿ+1个=32ÿ+1个2+1个4=3ÿ2+3ÿ+1个
p2ÿ+2=32ÿ+22+44=3ÿ2+6ÿ+4

就是x3y3xy表示x=y+1x=y+2


7

05AB1E16 12 9字节

生成无限列表。
使用Kevin Cruijssen的 Arnaulds公式端口保存了4个字节。
多亏了Grimy,又节省了3个字节

∞n3*4÷>ʒp

在线尝试!

说明

∞          # on the list of infinite positive integers
 n3*4÷>    # calculate (3*N^2)//4+1 for each
       ʒp  # and filter to only keep primes

您在解释中打了错字:“ 将一个副本N^2+3放在堆栈上 ”应该是3*N^2。另外,为什么要)代替¯?因为它更容易输入?出于某种原因,我觉得NnN‚3*¬sO‚可以缩短1个字节,但是我没有看到它。稍等字节的替代方法是Nn3*DN3*+‚。但我可能只是看到不存在的东西..;)好的答案,所以我+1。
凯文·克鲁伊森

1
我实际上试图将答案移植到05AB1E,但失败了。:D
Arnauld

1
实际上,产生一个无限列表是更方便的:9个字节,∞n3* 4÷>ʒp
Grimmy

1
好吧,我不习惯与自己矛盾的规格。:-)
WGroleau

6
@WGroleau我认为您那时从未专业开发过软件。当我得到与自己矛盾的规格时,我会更加担心。
MikeTheLiar

7

R75 73字节

n=scan()
while(F<n)F=F+any(!(((T<-T+1)*1:4-1)/3)^.5%%1)*all(T%%(3:T-1))
T

在线尝试!

-2字节,注意如果使用*而不是&(不同的优先级),可以删除方括号。

输出n第古巴古数(1索引)。

它使用了一个事实(在OEIS中给出),古巴质数的形式对于某些np=1个+3ñ24p=1个+3ñ2,即n = ñn=ap13a=1a=4的整数。

诀窍是没有素数可以是2p=1+3n23p=1+3n2(*),因此,我们可以通过检查公式保存2个字节a{1,2,3,4}1:4),而不是a{1,4}c(1,4))。

代码的略微版本:

# F and T are implicitly initialized at 0 and 1
# F is number of Cuban primes found so far
# T is number currently being tested for being a Cuban prime
n = scan()                       # input
while(F<n){
  T = T+1                        # increment T 
  F = F +                        # increment F if
    (!all(((T*1:4-1)/3)^.5 %% 1) # there is an integer of the form sqrt(((T*a)-1)/3)
     & all(T%%(3:T-1)))          # and T is prime (not divisible by any number between 2 and T-1)
  }
T                                # output T

(*)质数不能为3p=1+3n2,否则1=3(pn2)将被3整除。

p=2(不是古巴素数)外,没有其他素数可以具有2p=1+3n2n需要为奇数,即n=2k+1。扩展得到2p=4+12k(k+1),因此p=2+6k(k+1)p将是偶数。


如何通过使用第n个古巴素数的上限来避免循环?
西安

@西安我曾考虑过,但无法解决。你是否有一个?
罗宾·赖德

5

Wolfram语言(Mathematica)66 65 56字节

(f=1+⌊3#/4#⌋&;For[n=i=0,i<#,PrimeQ@f@++n&&i++];f@n)&

在线尝试!

  • J42161217 -1通过⌊ ⌋代替Floor[ ]

  • Attinat

    • -1通过使用⌊3#/4#⌋代替⌊3#^2/4⌋
    • -8用于For[n=i=0,i<#,PrimeQ@f@++n&&i++]代替n=2;i=#;While[i>0,i-=Boole@PrimeQ@f@++n]

1
65个字节。欢迎来到ppcg。不错的第一答案!+1
J42161217

谢谢!(长时间潜伏。)我无法完全解析您现有的答案,所以我写了自己的答案,但答案要短一些。我也可以使用Python。
speedstyle


@attinat我以为Arnauld的公式仅适用于n> 2,所以我没有以0开头-尽管在您的示例中,它适用于所有n(因为它以1 1 4 7 13 ...开头,所以质数为7 13。 ..)
speedstyle

3

Java 8,94 88 86 84字节

v->{for(int i=3,n,x;;System.out.print(x<1?++n+" ":""))for(x=n=i*i++*3/4;~n%x--<0;);}

使用@SaraJ的Java素数检查器可得到 -6个字节,因此请确保对她进行!
-2个字节,感谢@OlivierGrégoire。由于我们检查的第一个数字是7,因此我们可以删除%nSara的质数检验器的结尾,后者将终止的循环n=1@OlivierGrégoire通过移植@Arnauld的答案获得
-2个字节。

输出不确定的空格。

在线尝试。

说明(旧的86字节版本): TODO:更新说明

pñ=3ñ24+1个ñ3

v->{                     // Method with empty unused parameter and no return-type
  for(int i=3,           //  Loop-integer, starting at 3
          n,x            //  Temp integers
      ;                  //  Loop indefinitely:
      ;                  //    After every iteration:
       System.out.print( //     Print:
        n==x?            //      If `n` equals `x`, which means `n` is a prime:
         n+" "           //       Print `n` with a space delimiter
        :                //      Else:
         ""))            //       Print nothing
    for(n=i*i++*3/4+1,   //   Set `n` to `(3*i^2)//4+1
                         //   (and increase `i` by 1 afterwards with `i++`)
        x=1;             //   Set `x` to 1
        n%++x            //   Loop as long as `n` modulo `x+1`
                         //   (after we've first increased `x` by 1 with `++x`)
             >0;);}      //   is not 0 yet
                         //   (if `n` is equal to `x`, it means it's a prime)

我真的不认为这是可行的,但是找到古巴素数的另一种方法是使用以下公式:v->{for(int n=7,i=3,p,x,d,r=0;;i+=++r%2*3,n+=i,System.out.print(x>1?x+" ":""))for(x=n,d=1;++d<n;x=x%d<1?0:n);},也许有人可以用它来打高尔夫球吗?我不能
OlivierGrégoire

1
@OlivierGrégoire您可以通过删除未使用的,p并更改i+=++r%2*3,n+=i为来打更多的高尔夫球n+=i+=++r%2*3,但是最后我仍然会得到106个字节。将Java 11 String#repeat与prime-regex一起使用是105个字节:v->{for(int n=7,i=3,r=0;;n+=i+=++r%2*3)if(!"x".repeat(n).matches(".?|(..+?)\\1+"))System.out.println(n);}
凯文·克鲁伊森

是的,尽管我犯了错误(现在很明显),但我猜想它并不适合打高尔夫球。感谢您乘车;)
OlivierGrégoire

@OlivierGrégoire也许对您也很了解,但是Java中的素数检查循环显然更短。看到我的编辑和SaraJ的主要检查答案。
凯文·克鲁伊森

我可能是错的,但是%n不需要最后一个,对吗?
奥利维尔·格雷戈尔




1

空格,180字节

[S S S T    S N
_Push_2][S N
S _Duplicate][N
S S N
_Create_Label_OUTER_LOOP][S N
N
_Discard_top_stack][S S S T N
_Push_1][T  S S S _Add][S N
S _Duplicate][S N
S _Duplicate][T S S N
_Multiply][S S S T  T   N
_Push_3][T  S S N
_Multiply][S S S T  S S N
_Push_4][T  S T S _Integer_divide][S S S T  N
_Push_1][T  S S S _Add][S S S T N
_Push_1][S N
S _Duplicate_1][N
S S S N
_Create_Label_INNER_LOOP][S N
N
_Discard_top_stack][S S S T N
_Push_1][T  S S S _Add][S N
S _Duplicate][S N
S _Duplicate][S T   S S T   T   N
_Copy_0-based_3rd][T    S S T   _Subtract][N
T   S T N
_Jump_to_Label_PRINT_if_0][S T  S S T   S N
_Copy_0-based_2nd][S N
T   _Swap_top_two][T    S T T   _Modulo][S N
S _Duplicate][N
T   S S S N
_Jump_to_Label_FALSE_if_0][N
S N
S N
_Jump_to_Label_INNER_LOOP][N
S S T   N
_Create_Label_PRINT][T  N
S T _Print_as_integer][S S S T  S T S N
_Push_10_(newline)][T   N
S S _Print_as_character][S N
S _Duplicate][N
S S S S N
_Create_Label_FALSE][S N
N
_Discard_top_stack][S N
N
_Discard_top_stack][N
S N
N
_Jump_to_Label_OUTER_LOOP]

字母S(空格),T(制表符)和N(换行符)仅作为突出显示而添加。
[..._some_action]仅作为说明添加。

无限输出换行符分隔。

在线尝试(仅使用空格,制表符和换行符)。

伪代码中的解释:

pñ=3ñ24+1个ñ3

Integer i = 2
Start OUTER_LOOP:
  i = i + 1
  Integer n = i*i*3//4+1
  Integer x = 1
  Start INNER_LOOP:
    x = x + 1
    If(x == n):
      Call function PRINT
    If(n % x == 0):
      Go to next iteration of OUTER_LOOP
    Go to next iteration of INNER_LOOP

function PRINT:
  Print integer n
  Print character '\n'
  Go to next iteration of OUTER_LOOP

1

Python 3中110个 108 102字节

与我的Mathematica答案类似的方法(即isPrime(1+⌊¾n²⌋) else n++),使用此高尔夫球质数检查器并返回匿名无限生成器

from itertools import*
(x for x in map(lambda n:1+3*n**2//4,count(2)) if all(x%j for j in range(2,x)))

在线尝试!

  • 甲壳虫 -2因为可以说匿名生成器比命名生成器更受允许
  • count2 +1开始为-6,这样and x>1我借用的主要检查程序中的不必要-7

通常,将变量中的答案视为“输出”的有效形式。您可以重做答案,以便将结果输出到stdout或由函数返回吗?
mypetlion

1
由于允许使用匿名函数,并且挑战明确允许使用无限生成器,因此我删除了g=。我之所以只包括它,是因为它允许使用来快速查看TIO print(next(g) for i in range(52))
speedstyle



1

Python 3,83个字节

永远打印古巴素数。

P=k=1
while 1:P*=k*k;x=k;k+=1;P%k>0==((x/3)**.5%1)*((x/3+.25)**.5%1-.5)and print(k)

在线尝试!

X=1个+ÿX=2+ÿ

p=1个+ÿ3-ÿ31个+ÿ-ÿ=1个+3ÿ+3ÿ2ÿ=-1个2±1个4+p-1个3

p=2+ÿ3-ÿ31个+ÿ-ÿ=4+6ÿ+3ÿ2ÿ=-1个±p-1个3
ÿ±-1个


1

Perl 6的33 31个字节

-2个字节归功于Grimy

{grep &is-prime,1+|¾*$++²xx*}

在线尝试!

匿名代码块,返回一个无穷无尽的古巴素数列表。这使用Arnauld公式生成可能的古巴素数,然后对其&is-prime进行过滤。

说明:

{                           }  # Anonymous code block
 grep &is-prime,               # Filter the primes from
                         xx*   # The infinite list
                   ¾*          # Of three quarters
                     $++²      # Of an increasing number squared
                1+|            # Add one by ORing with 1

1
1+0+|可能只是1+|
肮脏的


0

APL(NARS),98个字符,196个字节

r←h w;y;c;v
r←c←y←0⋄→4
→3×⍳∼0πv←1+3×y×1+y+←1⋄r←v⋄→0×⍳w≤c+←1
→2×⍳∼0πv+←3×y+1⋄c+←1⋄r←v
→2×⍳w>c

缩进:

r←h w;y;c;v
r←c←y←0⋄→4
    →3×⍳∼0πv←1+3×y×1+y+←1⋄r←v⋄→0×⍳w≤c+←1
    →2×⍳∼0πv+←3×y+1⋄c+←1⋄r←v
    →2×⍳w>c

测试:

  h ¨1..20
7 13 19 37 61 109 127 193 271 331 397 433 547 631 769 919 1201 1453 1657 1801 
  h 1000
25789873
  h 10000
4765143511

它基于:如果y为N,则一个可能的Cuban Prime为

S1=1+3y(y+1)

下一个可能的古巴总理将是

S2=3(y+1)+S1
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.