Обчисліть цілу послідовність, отриману з простих множників


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

(Як вказував Бальфа, відповідь higley(1)- 2, зі списку 1 0. Спочатку у мене було 1, через помилку в моєму оригінальному алгоритмі, написаному Дж.)

Оскільки я задуманий SOB і не знайшов цього в OEIS , давайте назвемо це «Послідовність Хіглі», принаймні на час проведення цього раунду кодового гольфу. Як додатковий бонус, знайдіть перші два, які nмають найнижчий рівень, higley(n)де nне є простим і n>1. (Я думаю, що їх лише два, але я не можу цього довести.)

Це стандартний гольф з кодом, тому, як правило, виграють найменші натискання клавіш, але я прошу вас підкріпити розумні відповіді іншими мовами, навіть якщо вони є багатослівними.


4
Чому так highley(1) == 1? У одного немає простих факторів, тому отриманий список у 4) є [1, 0], так highley(1) == 2як я бачу.
balpha

Чи можемо ми припустити, що вхідне число та проміжні значення будуть не більше 2 ^ 31-1 (тобто вписується у підписане 32-бітове ціле число)?
Пітер Тейлор

@ Петер Тейлор Впевнений.
Грегорі Хіглі

Якщо хтось вважає це корисним, послідовності OEIS, які нечітко пов’язані між собою і можуть дати деяке натхнення, є A001414, A001222 та A002217.
Пітер Тейлор

1
оскільки ви не коментували, я припускаю, що ви не помітили: я довів, що є лише дві непримітні точки виправлення, і додав це як додаток до моєї публікації.
Пітер Тейлор

Відповіді:


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

Оце Так! Рішення AJ, яке коротше, ніж рішення GolfScript. Перший, кого я бачив. (Я великий шанувальник Дж.)
Грегорі Хіглі

3
Це можна значно скоротити, використовуючи дещо інший алгоритм:, #@((~.@,((+/*#)@:q:)@{:)^:_)`2:@.(=&1)який становить 38 символів.
Грегорі Хіглі

Нічого собі, я спробував розібратися, як це зробити за допомогою q: але намагався перетворити його на своє рішення 2 p: так що я не отримав цього. Очевидно в ретроспективі.
Джессі Мілікан

Той факт, що ви можете подивитися на цей вибух персонажів і сказати це " очевидно в ретроспективі ", просто дує мені на думку. Одного дня я повинен перевірити Гольфскрипт або Дж.
Кейсі

@Casey Я почував себе так само і свого часу, але чим більше J ти вчишся і використовуєш, тим більше це щось на кшталт "вискакує на тебе", хоча я все ще бачу речі, які мені доводиться загадувати. Одне корисне, що потрібно знати про J - це те, що якщо ти додаєш. або: після того, як символ, він створює новий символ, наприклад, {, {., і {:все означають різні речі, але {-(наприклад), безумовно , послідовність з двох речей, {і -.
Грегорі Хіглі

5

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


1
Знайшли ці дві точні точки виправлення за допомогою олівця-паперу: 27 і 30. Я погодився б з ОП, схоже, це єдині два.
mellamokb

1
Наступне цікаве питання може бути. Чи є нескінченно багато higley (x) = 2? Як щодо того, чи існує спосіб генерування довільних higley (x), таких як higley (x) = 100?
mellamokb

Дуже хороший! Я хлопець J, але мені просто доведеться вивчити GolfScript.
Грегорі Хіглі

@mellamokb Я думаю, що з цією послідовністю є ряд цікавих питань. Наприклад, якщо ми розглянемо послідовність чисел, згенерованих для кожного, nперш ніж його підрахувати, чи є непрості nпісля 49, для яких зазначена послідовність не закінчується на 28?
Грегорі Хіглі

2
Ще одне цікаве запитання - чи є проста функція, nяка межує higley(n)вище. (Це дозволило б значно спростити цикл - просто повторіть f(n)час, а потім відкиньте дублікати).
Пітер Тейлор

4

Рубі, 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 (див. Коментар Бальфи вище):

(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);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.