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