邻居数的最高素数


13

我认为以顺序的方式解释这一挑战是最简单的。以输入数字N开头:

  1. 找到其最高素数
  2. 检查的上方和下方的数字Ñ,看看是否最高素因子较高(即,最高的素因子N-1和/或N + 1比的因数更高Ñ
  3. 继续检查更高和/或较低的数字相邻Ñ在方向其中最高因素正在增加((N-2,N-3 ...)和/或(N + 2,N + 3,...)等上)
  4. 一旦在任一方向上没有任何高于我们已经发现的素数的素数,我们就会停止并输出遇到的最高素数。

让我们看一个例子:

245有主要因素5, 7, 7。它的邻居是:

244 -> 2,  2,  61
245 -> 5,  7,  7
246 -> 2,  3,  41

最高质数因子在两个方向上都在增加,因此我们必须查看下一个邻居:

243 -> 3,   3,  3,  3,  3
244 -> 2,   2,  2,  61
245 -> 5,   7,  7
246 -> 2,   3,  41
247 -> 13,  19

现在,最高质数因子在两个方向上都在减小,因此我们遇到的最高质数因子为61,因此应返回。

另一个例子:

让我们来看看1024。其主要因素是2, 2, 2, 2, 2, 2, 2, 2, 2, 2。它最接近的邻居的主要因素是:

1023 -> 3, 11, 31
1024 -> 2,  2,  2,  2,  2,  2,  2,  2,  2,  2
1025 -> 5,  5, 41

最高的素数因子从231或在两个方向上都在增加41。让我们看看邻居:

1022 -> 2, 7,  73
1023 -> 3, 11, 31
1024 -> 2,  2,  2,  2,  2,  2,  2,  2,  2,  2
1025 -> 5,  5, 41
1026 -> 2,  3,  3, 19

对于最高首要因素1022就是73,和最高的主要因素102619。由于19低于41我们对此不感兴趣。小于N的数字仍在增加,因此我们将朝该方向检查下一个

1021 -> 1021
1022 -> 2, 7,  73
1023 -> 3, 11, 31
1024 -> 2,  2,  2,  2,  2,  2,  2,  2,  2,  2
1025 -> 5,  5, 41
1026 -> 2,  3,  3, 19

1021 是素数,也是我们遇到的最高素数,因此应将其返回。

规则:

  • 您只会得到N大于1和小于的正数2^31-2
  • 输入和输出格式是可选的,但数字必须以10为底。
  • 只要最大值朝那个方向增加,就应该继续搜索较高的素数。方向彼此独立。

测试用例:

格式: N, highest_factor

2, 3
3, 3
6, 7
8, 11
24, 23 
1000, 997
736709, 5417 
8469038, 9431

假设我们得到2N 的最高素因。然后得到5N-1和61N + 1。然后我们得到19N-2和67N + 2。我们应该继续尝试减少数字,19>5还是因为5<61?即最大值是否保持不变?(我不确定该示例在数学上是否可行。)
PurkkaKoodari

@ Pietu1998,这个问题现在更清楚了吗?
Stewie Griffin

N=2实际上,由于1没有素数因素,因此似乎是一个边缘情况,因此没有最大的素数可以与我们进行比较以确定我们是否应该继续。
乔纳森·艾伦

Answers:


4

Mathematica,82 74字节

感谢Martin Ender节省了8个字节!

Max@@(±n_:=#//.x_/;l[t=x+n]>l@x:>t;l=FactorInteger[#][[-1,1]]&)/@{±-1,±1}&

未命名函数采用整数输入并返回整数。

±n_:=#//.x_/;l[t=x+n]>l@x:>t定义一元函数±n只要最大质数不断增加,该函数就会不断增加全局函数的整数输入。(最大素数函数定义为l=FactorInteger[#][[-1,1]]&。){±-1,±1}因此将该函数两次应用到输入整数,增量为增量-1,再次应用增量1。然后,Max@@(...l...)/@...采用由此发现的两个最大素数中较大的一个。

先前提交的内容:

Max@@(l=FactorInteger[#][[-1,1]]&)/@(#//.x_/;l[t=x+#2]>l[x]:>t&@@@{{#,-1},{#,1}})&

避免了几个字节的操作@@@(您可以在其中使用l@x):Max@@(±n_:=#//.x_/;l[t=x+n]>l@x:>t;l=FactorInteger[#][[-1,1]]&)/@{±-1,±1}&
Martin Ender

1

Perl,137个字节

122个字节的代码+ 15个字节的-p-Mntheory=:all

sub f{$t=(factor$_+pop)[-1]}$i=$j=1;while($i|$j){f++$c;($i&=$t>$h)&&($h=$t);f-$c;($j&=$t>$l)&&($l=$t)}$_=$h>$l?$h:$l?$l:$_

要运行它:

perl -pMntheory=:all -e 'sub f{$t=(factor$_+pop)[-1]}$i=$j=1;while($i|$j){f++$c;($i&=$t>$h)&&($h=$t);f-$c;($j&=$t>$l)&&($l=$t)}$_=$h>$l?$h:$l?$l:$_' <<< 736709

如果尚未ntheory安装,则可以通过(echo y;echo) | perl -MCPAN -e 'install ntheory'在终端中键入来安装它。


0

Ruby,99个字节

->n{f=->n{i=2;n%i<1?n/=i:i+=1while i<n;n};g=->s,z{s+=z while f[s+z]>b=f[s];b};[g[n,1],g[n,-1]].max}

说明:

  • f()是最高素数
  • g()是在一个方向上搜索邻居的函数
  • 将g应用于(n,-1)和(n,+ 1)在两个方向上搜索
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.