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_0
to 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)
。最小的n
是2^w
。请注意,如果2^{n-w}
至少为3(即,如果n-w>1
,则为true n>2
),则n
在保持w
恒定的情况下增加将使LHS增加的幅度大于RHS。还请注意,对于不等式,w>2
并采用最小的可能n
,并且没有固定点。
这给我们留下了三种情况:w = 0
和n = 1
; w = 1
并且n
是首要的;或w = 2
和n
是半素数。
案子w = 0
。n = 1
,N
任何素数也是如此。
案子w = 1
。如果那样的n = 2
话N = 2p
,我们需要p = p + 2
,这没有解决方案。如果是,n = 3
那么我们有pq = p + q + 3
和两个解决方案,(p=2, q=5)
和(p=3, q=3)
。如果那样的n = 5
话2^4 > 3 * 5 - 2 * 1
,那么就没有进一步的解决方案了w = 1
。
案子w = 2
。如果那样的n = 4
话N = 4pq
,我们要求pq = p + q + 4
。这具有整数解p=2, q=6
,但没有素数解。如果那样的n = 6
话2^4 > 3 * 6 - 2 * 2
,那么就没有进一步的解决方案了w = 2
。
所有情况都已用尽,因此唯一的非主要定点是27和30。
highley(1) == 1
呢?一个没有素数,因此4)中的结果列表为[1, 0]
,highley(1) == 2
如我所见。