计算从素因数得出的整数序列


10

创建执行以下操作的函数,表达式或程序:

  1. 取任意数量的素数因子并求和。例如,28的素数是2 2 7,总和为11。
  2. 将结果乘以给定数素数的数量。例如,28有3个素因,总和为11。11 * 3为33。
  3. 递归地重复该过程,存储结果列表(以原始编号开头),直到列表中已经包含一个编号。暂停而不添加该最终编号,以便该列表不包含重复项。28的级数是28 33,因为33再次导致28。
  4. 计算结果列表中的元素。对于28,答案为2。

这是的结果0<n<=10,因此您可以检查算法。

2 1 1 10 1 11 1 9 5 10

(正如balpha所指出的higley(1),从列表1 0中得到的答案是2。由于我用J编写的原始算法中的错误,我原来只有1。)

由于我是自负的SOB,并且尚未在OEIS上找到它,因此至少在本轮代码测试期间,我们称其为“ Higley序列”。作为额外的奖励,发现前两个n具有最低的higley(n)地方n是不是素数和n>1。(我认为只有两个,但是我无法证明。)

这是标准代码高尔夫球,因此,通常击键次数最少,但是我想请您用其他语言推荐更聪明的答案,即使它们很冗长。


4
为什么highley(1) == 1呢?一个没有素数,因此4)中的结果列表为[1, 0]highley(1) == 2如我所见。
balpha 2011年

我们是否可以假定输入数字和中间值不大于2 ^ 31-1(即适合带符号的32位整数)?
彼得·泰勒

@彼得·泰勒当然。
Gregory Higley

如果有人发现它有用,则模糊相关的OEIS序列可能会提供一些启发,例如A001414,A001222和A002217。
彼得·泰勒

1
由于您未发表评论,所以我假设您没有注意到:我证明只有两个非主要定点,并将其作为附录添加到我的文章中。
彼得·泰勒

Answers:


6

J,47 45

#@((~.@,[:(+/@{:*+/@:*/)2 p:{:)^:_)`2:@.(=&1)

如果不使用^:_,这可能会更短一些,但是我的大脑已经足够油炸了。

编辑:(47-> 45)双重优惠券天。

用法:

   higley =: #@((~.@,(+/@{:*+/@:*/)@(2&p:)@{:)^:_)`2:@.(=&1)
   higley 1
2
   higley"0 (1 + i. 10)
2 1 1 10 1 11 1 9 5 10

哇!比GolfScript解决方案短的AJ解决方案。我见过的第一个。(我是J的忠实粉丝)
Gregory Higley

3
您可以使用稍微不同的算法来大大缩短此时间:#@((~.@,((+/*#)@:q:)@{:)^:_)`2:@.(=&1),这是38个字符。
格雷戈里·希格利

哇,我试图弄清楚如何用q:来解决这个问题,但是试图将其处理到我的2 p:解决方案中,所以我没有得到。回想起来很明显。
杰西·米利坎

您可以看到字符爆炸并说“ 回想起来很明显 ” 这一事实,真让我大吃一惊。这些日子之一,我应该查看Golfscript或J。–
Casey

@Casey我一次也有相同的感觉,但是您学习和使用的J越多,“跳出来对您的攻击”就越多,尽管我仍然觉得我必须困惑。有关J的一件有用的事情是,如果添加。或:一个符号后,它会创建一个新的符号,例如{{.{:一切意味着不同的事情,但{-(例如)绝对是两件事情的序列,{-
格雷戈里·希格利

5

Golfscript,68 67 62 61个字符

[.]({[.2@{1$1$%{)}{\1$/1$}if}*;;].,*0+{+}*.2$?@@.@+\@)!}do;,(

这是一个表达式:它接受n堆栈,并将结果保留在堆栈上。要将其转换为n从stdin提取结果并将其打印到stdout的程序,请[~

它的核心是[.2@{1$1$%{)}{\1$/1$}if}*;;](28个字符),它是堆栈上的最高数字,并且(通过效率极低的算法)生成了其主要因素的列表。C样式的伪代码等效项:

ps = [], p = 2;
for (int i = 0; i < n; i++) {
    if (n % p == 0) {
        ps += p;
        n /= p;
    }
    else p++;
}

0+之前{+}*是处理特殊情况n==1,因为Golfscript不喜欢在空列表折叠二元运算。

非主要定点之一是27。通过考虑映射(p a -> a 2 p)(如果a == p (a-1)/ 2是一个固定点,并尝试使用small ),我没有使用该程序就发现了这一点a。(a==1给出素数的定点性)。

使用程序搜索会出现第二个固定点:30 =(2 + 3 + 5)* 3


附录:证明只有两个非主要定点

表示法:sopfr(x)是的素因子之和x,具有重复(A001414)。Omega(x)x(A001222)的素数。因此,Higley后继功能是h(x) = sopfr(x) Omega(x)

假设我们有一个定点N = h(N),它是n=Omega(N)素数的乘积。

N = p_0 ... p_{n-1} = h(N) = n (p_0 + ... + p_{n-1})

基本数论:n分为p_0 ... p_{n-1},因此w=Omega(n)素数是的素数n。在博客中,我们将其视为最后一个w。所以我们可以将双方除以n得到

p_0 ... p_{n-w-1} = p_0 + ... + p_{n-1}

要么

p_0 ... p_{n-w-1} = p_0 + ... + p_{n-w-1} + sopfr(n)

假定所有素数p_0to p_{n-w-1}都大于1,则增加任何素数都会使LHS比RHS多。因此,对于给定n,我们可以列举所有候选解决方案。

特别是,如果LHS大于RHS(将所有“免费”素数设置为2),则将没有解决方案。也就是说,如果

2^{n-w} > 2 (n-w) + sopfr(n)

既然sopfr(n) <= n(仅对n = 4或n素数具有相等性),我们可以做出较弱的声明,即如果

2^{n-w} > 3 n - 2 w

保持w固定,我们可以选择n满足的不同值w=Omega(n)。最小的n2^w。请注意,如果2^{n-w}至少为3(即,如果n-w>1,则为true n>2),则n在保持w恒定的情况下增加将使LHS增加的幅度大于RHS。还请注意,对于不等式,w>2并采用最小的可能n,并且没有固定点。

这给我们留下了三种情况:w = 0n = 1; w = 1并且n是首要的;或w = 2n是半素数。

案子w = 0n = 1N任何素数也是如此。

案子w = 1。如果那样的n = 2N = 2p,我们需要p = p + 2,这没有解决方案。如果是,n = 3那么我们有pq = p + q + 3和两个解决方案,(p=2, q=5)(p=3, q=3)。如果那样的n = 52^4 > 3 * 5 - 2 * 1,那么就没有进一步的解决方案了w = 1

案子w = 2。如果那样的n = 4N = 4pq,我们要求pq = p + q + 4。这具有整数解p=2, q=6,但没有素数解。如果那样的n = 62^4 > 3 * 6 - 2 * 2,那么就没有进一步的解决方案了w = 2

所有情况都已用尽,因此唯一的非主要定点是27和30。


1
使用铅笔和纸找到了两个相同的固定点:27和30。我同意OP,看来那是仅有的两个。
mellamokb

1
下一个有趣的问题可能是。是否存在无限多个higley(x)= 2?有什么方法可以生成任意的higley(x),例如higley(x)= 100?
mellamokb

非常好!我是J家伙,但可能只需要学习GolfScript。
格雷戈里·希格利

@mellamokb我认为这个序列有很多有趣的问题。例如,如果我们考虑在对每个数字进行n计数之前生成的数字序列,那么n在49之后是否有任何非质数的序列不能以28结尾?
Gregory Higley

2
要问的另一个有趣的问题是nhigley(n)上面的界限是否有简单的函数。(这将允许大大简化循环-只是迭代f(n)时间,然后丢弃重复项)。
彼得·泰勒

4

Ruby,92个字符

f=->i{r=[i];(x=s=0;(2..i).map{|j|(s+=j;x+=1;i/=j)while i%j<1};r<<i=s*x)until r.uniq!;r.size}

此解决方案假定higley(1)实际上是2,而不是1(请参见上面的balpha注释):

(1..10).map &f
=> [2, 1, 1, 10, 1, 11, 1, 9, 5, 10]

2

八度-109个字符

l=[input('')];while size_equal(unique(l),l);n=factor(l(1));l=[sum(n)*length(n) l];endwhile;disp(length(l)-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.