Tính hàm Landau


19

Hàm Landau g(n) ( OEIS A000793 ) đưa ra thứ tự tối đa của một phần tử của nhóm đối xứng . Ở đây, thứ tự của một hoán vị là số nguyên dương nhỏ nhất sao cho là danh tính - bằng với bội số chung nhỏ nhất của độ dài của các chu kỳ trong phân rã chu kỳ hoán vị. Ví dụ: đạt được ví dụ bằng (1,2,3) (4,5,6,7) (8,9,10,11,12,13,14).Snπkπkg(14)=84

Do đó, cũng bằng giá trị tối đa của trong đó với số nguyên dương.g(n)lcm(a1,,ak)a1++ak=na1,,ak

Vấn đề

Viết hàm hoặc chương trình tính toán hàm Landau.

Đầu vào

Một số nguyên dương .n

Đầu ra

g(n) , thứ tự tối đa của một phần tử của nhóm đối xứng .Sn

Ví dụ

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

Ghi bàn

Đây là : Chương trình ngắn nhất tính bằng byte thắng. (Tuy nhiên, việc triển khai ngắn nhất bằng nhiều ngôn ngữ đều được chào đón.)

Lưu ý rằng không có yêu cầu áp đặt cho thời gian chạy; do đó, việc triển khai của bạn không nhất thiết phải có khả năng tạo ra tất cả các kết quả ví dụ trên trong bất kỳ thời gian hợp lý nào.

Sơ hở tiêu chuẩn bị cấm.

Câu trả lời:



10

Ngôn ngữ Wolfram (Mathicala) , 44 byte

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

Hãy thử trực tuyến!

Ngôn ngữ Wolfram (Mathicala) , 31 byte

@DanielSchepler có một giải pháp tốt hơn:

Max[LCM@@@IntegerPartitions@#]&

Hãy thử trực tuyến!


Không quen thuộc với ngôn ngữ này - nhưng Max[Apply@LCM/@IntegerPartitions@#]&dường như hoạt động với tôi và sẽ cung cấp 36 byte nếu nó đúng.
Daniel Schepler

2
@DanielSchepler vâng, siêu! Tại sao bạn không đề xuất nó như một giải pháp riêng biệt? Bạn thậm chí có thể làm Max[LCM@@@IntegerPartitions@#]&cho 31 byte , vì @@@làm Applyở cấp 1.
La Mã

4

Python , 87 byte

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

Hãy thử trực tuyến!

Một hàm đệ quy theo dõi phần còn lại nđể phân vùng và LCM đang chạy d. Lưu ý rằng điều này có nghĩa là chúng ta không cần phải theo dõi các con số thực tế trong phân vùng hoặc số lượng chúng đã sử dụng. Chúng tôi thử từng phần tiếp theo có thể n-m, thay thế nbằng những gì còn lại mdbằng lcm(d,n-m). Chúng tôi lấy tối đa các kết quả đệ quy và dchính nó. Khi không còn gì n=0, kết quả chỉ là d.

Điều khó khăn là Python không có bất kỳ tích hợp nào cho LCM, GCD hoặc thừa số nguyên tố. Để làm lcm(d,m-n), chúng tôi tạo ra một danh sách bội số của dvà lấy giá trị đạt được modulo tối thiểu n-m, đó là với key=(n-m).__rmod__. Vì minsẽ đưa ra giá trị sớm hơn trong trường hợp hòa, đây luôn là bội số khác không đầu tiên dchia hết cho n-mLCM của chúng. Chúng tôi chỉ bội số của dlên đến d*(n-m)để được đảm bảo để đạt LCM, nhưng nó ngắn hơn để ghi d<<n(đó là d*2**n) mà cũng đủ với giới hạn trên của Python là độc quyền.

mathThư viện của Python 3 có gcd(nhưng không lcm) sau 3,5, ngắn hơn một vài byte. Cảm ơn @Joel đã rút ngắn quá trình nhập.

Python 3.5+ , 84 byte

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

Hãy thử trực tuyến!

Sử dụng numpy's lcmvẫn chưa ngắn hơn.

Python với numpy , 77 byte

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

Hãy thử trực tuyến!


Sử dụng from math import*là 85 byte và sử dụng import math+ math.gcd(...)là 84 byte. Áp dụng tương tự cho numpy.
Joel

@Joel Cảm ơn, tôi đã quên điều đó.
xnor

@Joel Cảm ơn, tôi đã quên cập nhật số byte, cả hai đều numpydài 77. là điểm hòa vốn cho import*.
xnor

Đúng. Trong trường hợp đó, tôi thích sử dụng hơn import numpynumpy.maxsẽ ghi đè tích hợp sẵn của Python max(tương tự min) nếu from numpy import*được sử dụng. Nó không gây ra vấn đề ở đây nhưng tất cả chúng ta đều biết rằng đó import*không phải là một thực hành lập trình tốt nói chung.
Joel

@Joel Mặc dù import*không nghi ngờ gì về thực tiễn xấu, tôi không nghĩ rằng nó thực sự ghi đè lên Python minmaxvì vậy, sự nhầm lẫn sẽ là ai đó mong đợi chức năng của numpy và có được cơ sở.
xnor


3

Thạch , 7 byte

Œṗæl/€Ṁ

Hãy thử trực tuyến!

Một liên kết đơn âm lấy một số nguyên làm đối số của nó và trả về một số nguyên.

Giải trình

Œṗ      | Integer partitions
  æl/€  | Reduce each using LCM
      Ṁ | Maximum

3

JavaScript (ES6), 92 byte

lcm(a1,,ak)a1++akn

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

Hãy thử trực tuyến!


JavaScript (ES6), 95 byte

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)

Hãy thử trực tuyến!

Làm sao?

Chúng tôi xác định:

{g(1)=0g(n)=j=1Npjkjforn>1andn=j=1Npjkj

(đây là A008485 )

Sau đó, chúng tôi sử dụng công thức (từ A000793 ):

f(n)=maxg(k)nk


3

Perl 6 , 50 byte

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

Hãy thử trực tuyến!

Kiểm tra tất cả các hoán vị trực tiếp, như giải pháp Ruby của @ histocrat.

Giải trình

                                     &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 Chúng ta có thể sử dụng bất kỳ chuỗi n mục riêng biệt nào cho việc kiểm tra, vì vậy chúng ta chỉ cần thực hiện phép hoán vị.

2 Nếu điểm cuối là một thùng chứa, ...toán tử trình tự sẽ khớp với mục đầu tiên. Vì vậy, chúng ta phải vượt qua một danh sách các yếu tố duy nhất.


2

Ruby , 77 byte

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

Hãy thử trực tuyến!

(1..) cú pháp phạm vi vô hạn là quá mới đối với TIO, vì vậy liên kết đặt giới hạn trên tùy ý.

Điều này sử dụng định nghĩa trực tiếp - liệt kê tất cả các hoán vị có thể, sau đó kiểm tra từng cái bằng cách biến đổi acho đến khi nó trở lại vị trí ban đầu (điều này cũng có nghĩa là tôi có thể thay đổi mảng ban đầu trong mỗi vòng lặp).


2

Gaia , 25 23 22 byte

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

Hãy thử trực tuyến!

Không có phân vùng LCM hoặc số nguyên làm cho cách tiếp cận này khá dài.

,:Π¤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 byte

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

Hãy thử trực tuyến!

Chỉnh sửa: -3 byte nhờ @xnor.


Tôi nghĩ rằng nó nên làm việc để làm mapM(:[1..n]), vì các yếu tố phụ là vô hại.
xnor

1

Python 3 + numpy, 115 102 99 byte

-13 byte nhờ @Daniel Shepler

-3 byte nữa từ @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))

Hãy thử trực tuyến!

Phương pháp Brute force: tìm tất cả các chuỗi có thể a, b, c, ... trong đó a + b + c + ... = n, sau đó chọn một chuỗi có lcm cao nhất.


Tình cờ, tôi có một giải pháp Python 3 + numpy chạy 87 byte.
Daniel Schepler

Tôi không biết đủ về numpy để tìm ra cách để làm điều đó, vì vậy tôi khuyên bạn chỉ nên đăng giải pháp riêng của mình.
Hiatsu

Vâng, tôi đã dự định chờ một thời gian để đăng nó.
Daniel Schepler

Tôi chỉ nhận ra bạn đăng thử thách này. Xin lỗi, tôi sẽ làm hết sức mình.
Hiatsu

1
Nếu bạn thay đổi cđể trả về một tập và memoize nó không làm nặng ở tất cả (mặc dù phải thừa nhận là nó ungolf một chút): tio.run/##RY1BCsIwEEX3PUWWM1CLoiuhV/AKEsfUTkkmIU3AWnr2Ggvq7vM@//...
Daniel Schepler

0

Bình thường , 24 15 byte

eSm.U/*bZibZd./

Hãy thử trực tuyến!

             ./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 byte: đã chú ý và nhận thấy rằng Pyth thực sự có nội dung GCD ( i).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.