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 , и пробует мало a
. ( a==1
дает фиксированность простых чисел).
Поиск с помощью программы приводит к появлению второй точки фиксации: 30 = (2 + 3 + 5) * 3
Приложение: доказательство того, что есть только две не простые фиксированные точки
Обозначение: sopfr(x)
сумма простых множителей x
с повторением (A001414). Omega(x)
число простых факторов x
(A001222). Таким образом, функция преемника Хигли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
. Wlog мы возьмем их, чтобы быть последним 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
чтобы p_{n-w-1}
больше 1, увеличение любого из них увеличивает на LHS больше , чем ОРЗ. Таким образом, для данного 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
, что верно, если 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
как я вижу.