Гольфскрипт, 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
як я бачу.