Максимальна взаємно спільна просте факторизація


14

Визначення

  • Два числа є спільними простими, якщо є єдиним позитивним спільним дільником 1.
  • Список номерів є спільно простим, якщо кожна пара чисел у цьому списку є одночасно простими.
  • Факторизація числа n- це перелік чисел, продукт яких є n.

Завдання

Враховуючи додатне число n, виведіть взаємно спільну простим nкоефіцієнтом максимальну довжину, яка не включає 1.

Приклад

Адже n=60відповідь полягає в [3,4,5]тому, що 3*4*5=60і жодна інша взаємно-просте факторизація без 1довжини, більшої або дорівнює 3, тривалості факторизації.

Правила і свободи

  • Ви можете використовувати будь-який розумний формат вводу / виводу.
  • Записи у списку вихідних даних не потрібно сортувати.

Тестові шафи

n   output
1   []
2   [2]
3   [3]
4   [4]
5   [5]
6   [2, 3]
7   [7]
8   [8]
9   [9]
10  [2, 5]
11  [11]
12  [3, 4]
13  [13]
14  [2, 7]
15  [3, 5]
16  [16]
17  [17]
18  [2, 9]
19  [19]
20  [4, 5]
21  [3, 7]
22  [2, 11]
23  [23]
24  [3, 8]
25  [25]
26  [2, 13]
27  [27]
28  [4, 7]
29  [29]
30  [2, 3, 5]
31  [31]
32  [32]
33  [3, 11]
34  [2, 17]
35  [5, 7]
36  [4, 9]
37  [37]
38  [2, 19]
39  [3, 13]
40  [5, 8]
41  [41]
42  [2, 3, 7]
43  [43]
44  [4, 11]
45  [5, 9]
46  [2, 23]
47  [47]
48  [3, 16]
49  [49]
50  [2, 25]
51  [3, 17]
52  [4, 13]
53  [53]
54  [2, 27]
55  [5, 11]
56  [7, 8]
57  [3, 19]
58  [2, 29]
59  [59]
60  [3, 4, 5]
61  [61]
62  [2, 31]
63  [7, 9]
64  [64]
65  [5, 13]
66  [2, 3, 11]
67  [67]
68  [4, 17]
69  [3, 23]
70  [2, 5, 7]
71  [71]
72  [8, 9]
73  [73]
74  [2, 37]
75  [3, 25]
76  [4, 19]
77  [7, 11]
78  [2, 3, 13]
79  [79]
80  [5, 16]
81  [81]
82  [2, 41]
83  [83]
84  [3, 4, 7]
85  [5, 17]
86  [2, 43]
87  [3, 29]
88  [8, 11]
89  [89]
90  [2, 5, 9]
91  [7, 13]
92  [4, 23]
93  [3, 31]
94  [2, 47]
95  [5, 19]
96  [3, 32]
97  [97]
98  [2, 49]
99  [9, 11]

Оцінка балів

Це . Найкоротша відповідь у байтах виграє.




Важке завдання для подальшого спостереження: лише сусідні пари в списку, що випливає, повинні бути одночасно основними.
Мартін Ендер

4
Це лише факторизація на прем'єр-сили?
Paŭlo Ebermann

1
@ PaŭloEbermann так, так і є.
Лина монашка

Відповіді:



9

Брахілог , 4 байти

ḋḅ×ᵐ

Спробуйте в Інтернеті!

Пояснення

       # output is the list of
  ×ᵐ   # products of each
 ḅ     # block of consecutive equal elements
ḋ      # of the prime factors
       # of the input

2
З повагою до Вашої першої відповіді Брахілог! ... принаймні я думаю?
Фаталізувати

1
@Fatalize: Мій другий я думаю. У мене був такий раніше. Безумовно, найкоротший мій :)
Емінья,

5

05AB1E , 3 5 байт

+2 байти, щоб виправити край крайника 1. Дякую Райлі за виправлення (а також для тестового набору, мій 05ab1e не такий сильний!)

ÒγP1K

Тестовий набір у Спробуйте онлайн

Як?

Ò     - prime factorisation, with duplicates
 γ    - split into chunks of consecutive equal elements
  P   - product of each list
   1  - literal one
    K - removed instances of top from previous
      - implicitly display top of stack

@Adnan - це найкраще посилання на "байти" чи є десь відформатована кодова сторінка?
Джонатан Аллан

Так, є сторінка коду, яка відображає всі байти.
Аднан

1
О, як я пропустив його> _ <Дякую колись так :)
Джонатан Аллан

Не працює для 1.
Лина монашка

@LeakyNun зафіксував допомогу :)
Джонатан Аллан


3

Haskell , 51 байт

(2#) це анонімна функція, яка приймає ціле число і повертає список.

Використовувати як (2#) 99.

m#n|m>n=[]|x<-gcd(m^n)n=[x|x>1]++(m+1)#div n x
(2#)

Спробуйте в Інтернеті!

Натхненний силовим трюком, який деякі люди використовували в нещодавньому виклику без квадратних номерів .

  • m#nпороджує фактори n, починаючи з m.
  • Якщо m>nми зупинимось, зробивши висновок, що ми вже знайшли всі фактори.
  • x=gcd(m^n)nє найбільшим фактором n, основними факторами якого є все m. Зауважте, що оскільки менші mтестуються спочатку, це буде, 1якщо mце не просто.
  • Ми включаємо xдо отриманого списку, якщо він не 1, а потім повторюємо з наступним m, поділяючи nна x. Зауважте, що xі div n xне може мати загальних факторів.
  • (2#)бере число і починає знаходити його фактори 2.

3

MATL , 7 байт

&YF^1X-

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

Розглянемо вклад 80 як приклад.

&YF    % Implicit input. Push array of unique prime factors and array of exponents
       % STACK: [2 3 5], [4 0 1]
^      % Power, element-wise
       % STACK: [16 1 5]
1      % Push 1
       % STACK: [16 1 5], 1
X-     % Set difference, keeping order. Implicitly display
       % STACK: [16 5]

EDIT (9 червня 2017 р.): YFУ випуску 20.1.0 було змінено два виходи : нефакторні праймери та їх (нульові) показники пропускаються. Це не впливає на наведений вище код, який працює без необхідності будь-яких змін (але їх 1X-можна буде видалити).


Я припускаю, що засіб зміни 1X-є зайвим у новому випуску ... також, це схоже на задану різницю, а не на перетин.
Ørjan Johansen

@ ØrjanJohansen Правильно на обох. Спасибі!
Луїс Мендо

2

Желе , 5 байт

ÆF*/€

Тестовий набір у Спробуйте онлайн

Як?

ÆF*/€ - Main link: n
ÆF    - prime factors as [prime, exponent] pairs
   /€ - reduce €ach with:
  *   - exponentiation

Альтернативне рішення 6-байтовое в спробі знайти інший метод , який би пов'язати з вашими ( до жаль , зуміти) ÆfŒgZP. У ній однакова кількість лексем, але занадто багато двобайтових атомів;)
HyperNeutrino

... і як мій видалений запис 05ab1e, він повертається, 1для введення 1якого заборонено (ефект від виконання порожнього продукту).
Джонатан Аллан

:( Ну, ну, проігнорували це. Дарн .: P
HyperNeutrino

2

Аліса , 10 байт

Ifw.n$@EOK

Спробуйте в Інтернеті!

На жаль, це використовує код точки , як ціле число I O знову / . Тестовий випадок посилання TIO - це вхід 191808, який розкладається на 64 , 81 та 37 . Зауважте, що це рішення друкує основні сили для того, щоб від найбільшого до найменшого простих, тому ми отримуємо вихід %Q@.

Для зручності, ось 16-байтове рішення з десятковим введенням-виведенням, яке використовує той самий алгоритм основних:

/O/\K
\i>fw.n$@E

Спробуйте в Інтернеті!

Пояснення

Як і інші відповіді, це розкладає вклад у прості сили.

I      Read a code point as input.
f      Compute its prime factorisation a prime/exponent pairs and push them
       to the stack in order from smallest to largest prime.
w      Remember the current IP position on the return address stack. This
       starts a loop.
  .      Duplicate the current exponent. This will be zero once all primes
         have been processed.
  n$@    Terminate the program if this was zero.
  E      Raise the prime to its corresponding power.
  O      Output the result as a character.
K      Return to the w to run the next loop iteration.

2

математика 46 байт

#[[1]]^#[[2]]&/@If[#==1,#={},FactorInteger@#]&

Спробуйте в Інтернеті!


Хороша відповідь, але це дає дещо неправильний вихід для деяких тестових випадків. В даний час ваш код виводить, {}; {2}; {3}; {2}; {5}; {2,3}; {7}; {2}; {3}; {2,5}; {11}; {2,3}; {13}; ... але він повинен виводитись {}; {2}; {3}; {4}; {5}; {2,3}; {7}; {8}; {9}; {2,5}; {11}; {4,3}; {13}; ...замість цього.
Кевін Кройсейсен

Думаю, я це
виправив

Здається, справді працює в TIO . +1 О, і ласкаво просимо до PPCG, я бачу, ти тут досить новий. Ви напевно це вже бачили, але якщо ні, поради щодо гольфу в Mathematica можуть бути цікавими для прочитання. Насолодитися перебуванням! :)
Кевін Кройссен

1
Якщо ви знайдете доступ до компонентів #більше, ніж до #себе, ви можете зберегти багато байтів, використовуючи Apply( @@@) замість Map( /@):#^#2&@@@If...
Martin Ender

1

PHP, 62 байти

друкує асоціативний масив із простим ключем, і як часто прайм використовується як значення, а нічого для введення 1

for($i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!++$r[$i];print_r($r);

Спробуйте в Інтернеті!

Вихід для 60

Array
(
    [2] => 2
    [3] => 1
    [5] => 1
)

PHP, 82 байт

for($i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!($r[$i]=$r[$i]?$r[$i]*$i:$i);print_r($r);

Спробуйте в Інтернеті!

не надрукує нічого для введення, 1якщо замість цього ви хочете порожній масив і відсортований масив, це буде трохи довше

for($r=[],$i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!($r[$i]=$r[$i]?$r[$i]*$i:$i);sort($r);print_r($r);



0

miniML , 47 байт

Проблеми, пов'язані з основною факторизацією, тут страшенно представлені, тому ми, на жаль, змушені мати факторизацію в стандартній бібліотеці.

fun n->map(fun p->ipow(fst p)(snd p))(factor n)

Зауважимо, що "mini" в мінімумі означає розмір набору функцій, а не розмір вихідного коду, записаного в ньому.


0

Рубін, 61 байт

require 'prime'
->n{(2..n).select{|e|n/e.to_f%1==0&&e.prime?}}

Я дуже розчарований, переглянувши 6-7 байт-рішення -))


0

Математика, 24 байти

Power@@@FactorInteger@#&

Шкода @@@*- це не річ. Крім того , я хотів би /@*, @@*і справді, зміни @@@в /@@, //@до @@@або що - то і додати нескінченну сімейство з //@, ///@...

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