Обчисліть функцію Ландау


19

Функція Ландау ( OEIS A000793 ) задає максимальний порядок елемента симетричної групи . Тут порядок перестановки є найменшим додатним цілим числом таким, що - тотожність - яка дорівнює найменш загальному кратному довжині циклів при розкладі циклу перестановки. Наприклад, що досягається, наприклад, (1,2,3) (4,5,6,7) (8,9,10,11,12,13,14).g(n)Snπkπkg(14)=84

Тому g(n) також дорівнює максимальному значенню lcm(a1,,ak) де a1++ak=n з a1,,ak додатними цілими числами.

Проблема

Напишіть функцію або програму, яка обчислює функцію Ландау.

Вхідні дані

Позитивне ціле .n

Вихідні дані

g(n) - максимальний порядок елемента симетричної групи .Sn

Приклади

n    g(n)
1    1
2    2
3    3
4    4
5    6
6    6
7    12
8    15
9    20
10   30
11   30
12   60
13   60
14   84
15   105
16   140
17   210
18   210
19   420
20   420

Оцінка

Це : найкоротша програма в байтах виграє. (Тим не менш, найкоротші реалізації на декількох мовах вітаються.)

Зауважте, що жодних вимог, що пред'являються до часу виконання; отже, для вашої реалізації не обов'язково потрібно мати можливість генерувати всі наведені вище приклади в будь-який розумний час.

Стандартні лазівки заборонені.

Відповіді:



10

Мова Вольфрама (Mathematica) , 44 байти

Max[PermutationOrder/@Permutations@Range@#]&

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

Мова Вольфрама (Mathematica) , 31 байт

@DanielSchepler має краще рішення:

Max[LCM@@@IntegerPartitions@#]&

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


Не те, що знайоме з мовою - але, Max[Apply@LCM/@IntegerPartitions@#]&здається, працює на мене і дасть 36 байт, якщо це правильно.
Даніель Шеплер

2
@DanielSchepler так, супер! Чому ви не запропонуєте це як окреме рішення? Можна навіть Max[LCM@@@IntegerPartitions@#]&за 31 байт , бо @@@це Applyна рівні 1
Роман

4

Пітон , 87 байт

f=lambda n,d=1:max([f(m,min(range(d,d<<n,d),key=(n-m).__rmod__))for m in range(n)]+[d])

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

Рекурсивна функція, яка відстежує решту nдо розділу та запущеного LCM d. Зауважте, що це означає, що нам не потрібно відслідковувати фактичні числа в розділі або скільки з них ми використовували. Ми намагаємось кожну можливу наступну частину, n-mзамінюючи nте, що залишилося m, і dна lcm(d,n-m). Ми беремо максимум цих рекурсивних результатів і dсебе. Коли нічого не залишається n=0, результат є просто d.

Найважливіша річ у тому, що Python не має вбудованих модулів LCM, GCD або основного факторизації. Для цього lcm(d,m-n)ми формуємо список кратних dі беремо значення, що досягають мінімального модуля n-m, тобто з key=(n-m).__rmod__. Оскільки minбуде дано більш раннє значення у випадку зрівняння, це завжди перший ненульовий кратний показник, dякий ділиться на n-m, тому їх LCM. Ми маємо лише кілька кращих dдо того, d*(n-m)щоб гарантувати потрапляння в LCM, але коротше написати d<<n(що є d*2**n), що достатньо, щоб верхні межі Python були ексклюзивними.

mathБібліотека Python 3 має gcd(але не lcm) після 3,5, що на кілька байт коротше. Завдяки @Joel за скорочення імпорту.

Python 3.5+ , 84 байти

import math
f=lambda n,d=1:max([f(m,d*(n-m)//math.gcd(n-m,d))for m in range(n)]+[d])

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

Використання numpy's lcmще коротше.

Python з numpy , 77 байт

from numpy import*
f=lambda n,d=1:max([f(m,lcm(d,n-m))for m in range(n)]+[d])

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


Використання from math import*становить 85 байт, а використання import math+ math.gcd(...)- 84 байти. Те саме стосується і numpy.
Джоель

@Joel Спасибі, я забув про це.
xnor

@Joel Спасибі, я забув оновити кількість байт, вони обидва 77. numpyДовжини «х 5 є точкою беззбитковості для import*.
xnor

Правильно. У такому випадку я вважаю за краще використовувати, import numpyтому numpy.maxщо замінить вбудований Python max(те саме min), якщо from numpy import*використовується. Тут це не спричиняє проблем, але всі ми знаємо, що import*це не дуже добра практика програмування.
Джоель

@Joel Хоча import*це, без сумніву, погана практика, я не думаю, що це насправді переписує Python's, minі maxтому плутанина буде тим, хто очікує функції numpy та отримання базової.
xnor



3

JavaScript (ES6), 92 байти

lcm(а1,,ак)а1++акн

f=(n,i=1,l=m=0)=>n?i>n?m:f(n-i,i,l*i/(G=(a,b)=>b?G(b,a%b):a)(l,i)||i)&f(n,i+1,l)|m:m=l>m?l:m

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


JavaScript (ES6), 95 байт

f=(n,i=1,m)=>i>>n?m:f(n,i+1,i<m|(g=(n,k=2,p=0)=>k>n?p:n%k?p+g(n,k+1):g(n/k,k,p*k||k))(i)>n?m:i)

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

Як?

Ми визначаємо:

{г(1)=0г(н)=j=1Npjкjдлян>1ін=j=1Npjкj

(це A008475 )

Тоді ми використовуємо формулу (від A000793 ):

f(н)=максг(к)нк


3

Perl 6 , 50 байт

{max .map:{+(.[$_],{.[@^a]}...$_,)}}o&permutations

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

Перевіряє всі перестановки безпосередньо, як рішення Ruby @ histocrat's.

Пояснення

                                     &permutations  # Permutations of [0;n)
{                                  }o  # Feed into block
     .map:{                       }  # Map permutations
                           ...  # Construct sequence
             .[$_]  # Start with permutation applied to itself [1]
                  ,{.[@^a]}  # Generate next item by applying permutation again
                              $_,  # Until it matches original permutation [2]
           +(                    )  # Length of sequence
 max  # Find maximum

1 Ми можемо використовувати будь-яку послідовність із п яти різних елементів для перевірки, тому просто беремо перестановку.

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


2

Рубін , 77 байт

f=->n{a=*0...n;a.permutation.map{|p|(1..).find{a.map!{|i|p[i]}==a.sort}}.max}

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

(1..) Синтаксис нескінченного діапазону занадто новий для TIO, тому посилання встановлює довільну верхню межу.

Для цього використовується пряме визначення - перерахуйте всі можливі перестановки, а потім протестуйте кожну, мутуючи, aпоки вона не повернеться у вихідне положення (що також зручно означає, що я можу просто мутувати вихідний масив у кожному циклі).


2

Гая , 25 23 22 байт

,:Π¤d¦&⊢⌉/
1w&ḍΣ¦¦⇈⊢¦⌉

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

Відсутність LCM або цілих розділів робить цей підхід досить тривалим.

,:Π¤d¦&⊢⌉/		;* helper function: LCM of 2 inputs


1w&ḍΣ¦¦			;* push integer partitions
         ¦		;* for each
       ⇈⊢		;* Reduce by helper function
	  ⌉		;* and take the max

2

Haskell, 70 67 байт

f n=maximum[foldl1 lcm a|k<-[1..n],a<-mapM id$[1..n]<$[1..k],sum a==n]

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

Редагувати: -3 байти завдяки @xnor.


Я думаю, що це повинно працювати mapM(:[1..n]), оскільки зайвий елемент нешкідливий.
xnor

1

Python 3 + numpy, 115 102 99 байт

-13 байт завдяки @Daniel Shepler

Ще 3 байти від @Daniel Shepler

import numpy
c=lambda n:[n]+[numpy.lcm(i,j)for i in range(1,n)for j in c(n-i)]
l=lambda n:max(c(n))

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

Метод грубої сили: знайдіть усі можливі послідовності a, b, c, ... де a + b + c + ... = n, а потім виберіть ту, яка має найбільший lcm.


Між іншим, у мене є рішення Python 3 + numpy з 87 байтами.
Даніель Шеплер

Я не знаю достатньо про numpy, щоб зрозуміти, як це зробити, тому я пропоную вам опублікувати своє рішення окремо.
Хіацу

Ну, я планував почекати деякий час, щоб опублікувати його.
Даніель Шеплер

Я щойно зрозумів, що ви опублікували цей виклик. Вибачте, я зроблю все можливе.
Хіацу

1
Якщо ви зміните cповернути набір і запам'ятати його, це зовсім не погано (хоча, мабуть, це і скасує ульгоф): tio.run/##RY1BCsIwEEX3PUWWM1CLoiuhV/AKEsfUTkkmIU3AWnr2Ggvq7vM@//…
Daniel Schepler

0

Pyth , 24 15 байт

eSm.U/*bZibZd./

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

             ./Q  # List of partitions of the input
  m               # map that over lambda d:
   .U       d     # reduce d (with starting value first element of the list) on lambda b,Z:
     /*bZgbZ      # (b * Z) / GCD(b, Z)
 S                # this gives the list of lcms of all partitions. Sort this
e                 # and take the last element (maximum)

-9 байт: звернули увагу і помітили, що Pyth насправді має вбудований GCD ( i).

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