计数坎宁安链


14

素数总是让人着迷。2300年前,欧几里得在他的《元素》中写道

质数是仅由一个单位测量的质数。

这意味着素只能被 1(或本身)。

人们一直在寻找素数之间的关系,并提出了一些非常奇怪的东西(如“有趣的”)。

例如,一个索菲·热尔曼质数是一个主要p针对2*p+1也是素数。

一个安全素是一种主要p用于哪些(p-1)/2也是黄金,而这正是一个索菲·热尔曼质数的倒退状态。

这些与我们在此挑战中寻找的东西有关。

一个坎宁安链型我是一系列素数,其中除了最后一个的每一个元素是的索菲·热尔曼质数,而除了第一个的每一个元素是一个安全的黄金。该中元素的数量称为它的length

这意味着我们从素数开始p计算q=2*p+1。如果也q为质数,则我们有长度为2的I型Cunnigham链。然后进行测试2*q+1,以此类推,直到下一个生成的数字为复合数为止。

II型坎宁安链是按照几乎相同的原理构造的,唯一的区别是我们检查了2*p-1在每个阶段。

坎宁安链的长度可以为1,这意味着2 * p + 1和2 * p-1都不是素数。我们对这些不感兴趣

坎宁安链的一些例子

2启动长度为5的I型链。

2, 5, 11, 23, 47

下一个构造的数字95不是素数。
这也告诉我们,那5112347不启动类型的任何链,因为这将有前述的元素。

2也开始长度为3的II型链。

2, 3, 5

接下来是9,这不是素数。

让我们尝试II11型(之前我们将其排除在I型之外)。 好吧,接下来是下一个,它不是素数,因此该“链”的长度为1,我们不将其计入此挑战。
21

挑战

写一个程序或功能,给定一个号码n作为输入,写入/返回的起始数第n个的坎宁安链I或II型至少长度为2,后跟一个空格,随后链的类型它开始(II),然后是冒号,然后是该类型链的长度。万一素数同时启动两种类型的链(类型I 型 II型),则首先计算型链。

例: 2 I:5

请记住,这n可能是任何类型的先前启动链的一部分,在这种情况下,不应将其视为该类型链的起始编号

让我们看看这是如何开始的

我们从开始2。由于它是第一个素数,因此我们可以确定没有链从包含的较低素数开始2
类型I中的下一个数字将是2*2+1 == 55是素数,因此我们已经有了至少长度为2的链。
我们将其视为第一条链。那II型呢?下一个号码是2*2-1 == 33是素数,因此II型的链长也至少为2。
我们将其视为第二条链。我们已经完成了2

下一个素数是3。在这里,我们应该检查一个较低的素数是否在链中开始。
检查I型:(3-1)/2 == 11不是素数,因此3可能是类型I链的起点。
让我们检查一下。接下来是3*2+1 == 77是素数,因此我们拥有长度至少为2的I型链。我们将其视为第三条链。
现在,我们检查是否3在类型II链中出现了较低质数开始的链。 (3+1)/2 == 22是素数,因此3不能视为II型链的起始数字。因此,即使3此链中的下一个数字是5,是素数。(当然,我们已经知道了这一点,您当然可以并且应该考虑自己的方法如何进行这些检查。)

因此,我们检查了5711等,计数,直到我们找到至少长度为2的n次方坎宁安链。

然后(或者可能更早一些;)),我们需要确定找到的链的完整长度,并以前面提到的格式打印结果。

顺便说一句:在我的测试中,除了2使长度大于的两种链条都开始以外,我没有发现其他质数1

输入/输出示例

输入值

1

输出量

2 I:5


输入值

10

输出量

79 II:3


输入值

99

输出量

2129 I:2


输入1..20的输出

2 I:5
2 II:3
3:2
7 II:2
19 II:3
29我:2
31 II:2
41我:3
53我:2
79二:3
89我:6
97 II:2
113我:2
131我:2
139第二章:2
173我:2
191我:2
199第二章:2
211 II:2
229第二章:2

可在此处找到前5000个输出的列表。

这是代码高尔夫。输出中允许使用任意空格,但是如示例中所示,类型和数字应以单个空格和冒号分隔。利用任何漏洞是不允许的,尤其是获得来自Web的结果是容许。

祝好运 :)


3
忘记了在沙箱中提:它很容易证明,2并且3是唯一的素数p为这两个2p-12p+1是素数,所以2是唯一的黄金,其启动两种类型的非平凡坎宁安链。
彼得·泰勒

好的。感谢您的帮助:)
Cabbie407

3
(从答案中转换为注释。)除了双链长度大于1的以外,没有其他质数2这是消除的证明。
pbeentje

好,感谢您再次如此详细地指出这一点。您是否只是想对此发表评论,还是您认为我因此应该改变挑战?
Cabbie407's

只是一句话。我认为这在任何情况下都不会改变挑战,仅对打高尔夫球有潜在帮助:找到一个链条时,无需检查另一个。
pbeentje

Answers:


2

Javascript,236208字节

保存的28个字节:

p=(n,i=n)=>n%--i?p(n,i):i==1;f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:`+eval(`for(j=1;p(k=2*k+l);j++);j`))}

p使用以下命令p=(n,i=n)=>n%--i?p(n,i):i==1
t函数上节省了9个字节:该函数被eval(...)直接在f函数中的语句替换。


先前的解决方案:

p=n=>{for(i=n;n%--i&&i;);return 1==i};t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j};f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:${t(k,l)}`)}

例: f(6)

输出: 29 I:2

说明
我正在使用3个功能

1 p:知道n是否为素数: p=n=>{for(i=n;n%--i&&i;);return 1==i}

2 t:根据m参数(为1或-1)来知道以I或II类型的n开头的坎宁安链的长度: t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j}

3 f:计算链数(用于循环),然后显示结果

f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:${t(k,l)}`)}

for循环:对于每个数字,如果以下情况有效,则坎宁安链(如果需要,则为I,然后为II)有效

  • 这个数字是素数
  • 前身不是素数
  • 继任者是总理
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.