Mẫu số của loạt điều hòa


16

Trước đó, chúng tôi đã làm những pseudofactorial của một số, đó là LCM của các số từ 1đến n.

Nó sẽ hữu ích trong việc thêm các phân số với nhau.

Tuy nhiên, chúng tôi thấy rằng mẫu số của 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/620thay vì pseudofactorial của 6, đó là 60.

Nhiệm vụ của bạn là tìm mẫu số của 1/1 + 1/2 + ... + 1/nsố nguyên dương đã cho n.

Tủ thử

 n result
 1 1
 2 2
 3 6
 4 12
 5 60
 6 20
 7 140
 8 280
 9 2520
10 2520
11 27720
12 27720
13 360360
14 360360
15 360360
16 720720
17 12252240
18 4084080
19 77597520
20 15519504
21 5173168
22 5173168
23 118982864
24 356948592
25 8923714800
26 8923714800
27 80313433200
28 80313433200
29 2329089562800
30 2329089562800

Người giới thiệu

Bảng xếp hạng


Làm thế nào lớn của một đầu vào nó phải làm việc cho?
Brad Gilbert b2gills

@ BradGilbertb2gills Càng lớn càng hợp lý.
Rò rỉ Nun

Câu trả lời:


8

M , 9 6 byte

Cảm ơn FryAmTheEggman vì đã tiết kiệm 3 byte! Mã số:

RİSg¹İ

M có một lợi thế rất lớn ở đây, bởi vì nó hoạt động với phân số hơn là số float. Giải trình:

R       # Get the list [1 ... n].
 İ      # Inverse each, resulting into [1/1, 1/2, 1/3, ..., 1/n].
  S     # Sum it up. (86021/27720 for n=12)
   g¹   # Compute the greatest common denominator with n. (1/27720 for n=12)
     İ  # Calculate the inverse again. (27720 for n=12)

Sử dụng mã hóa Jelly . Hãy thử trực tuyến! .


Ngoài ra, có một giải pháp 4 byte , đôi khi tạo ra số 0 đứng đầu (ví dụ 280 -> 0280). Tôi không chắc điều này có được phép hay không:

RİSV

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


1
1. Giải thích về mã 6 byte không hoàn toàn chính xác. tính toán ước số chung nhất của phân số và n . Sử dụng g1có lẽ sẽ rõ ràng hơn. 2. Vép phân số thành một chuỗi và loại bỏ nó một cách vô nghĩa. <num>/là (không tích lũy) giảm bởi một toán tử niladic. Điều này là vô nghĩa, nhưng vì chỉ có một số (đối số ngầm 0 ), nên đơn giản là không có gì. Liên kết tiếp theo, mẫu số là niladic, vì vậy giá trị trả về trước đó được in ngầm và được thay thế bằng nilad đó.
Dennis

@Dennis Cảm ơn! Đã sửa lỗi giải thích.
Ad Nam

@Adnan Có tài liệu nào cho M không?
Trái cây Esolanging

@ Challenger5 Không phải tôi biết. Nó thực sự là một biến thể của Jelly, nhưng với các phân số chính xác tùy ý. Tài liệu Jelly có thể được sử dụng, nhưng hãy lưu ý rằng rất nhiều tính năng được triển khai trong Jelly không được triển khai ở M.
Adnan

5

Julia, 22 byte

Một chức năng ẩn danh.

n->1.//(1:n)|>sum|>den

Cùng chiều dài:n->sum(inv,1//1:n).den
Alex A.

4

Toán học, 27 byte

Một chức năng ẩn danh.

Denominator@*HarmonicNumber

Ví dụ:

 In[1] := (Denominator@*HarmonicNumber)[10]
 Out[1] = 2520

Bạn có thể tìm thấy giải pháp 26 byte nếu bạn tham gia vào cuộc trò chuyện :)
Leaky Nun

Oh! Tôi nên để Martin đăng cái đó, nếu anh ấy thích. Đây là một nghĩa đen đáng yêu, vì vậy tôi sẽ giữ nó.
Lynn

Bạn có thể làm rõ cách sử dụng mã không?
DavidC

3

Python 2, 69 67 byte

a=b=k=r=1
exec'a=a*k+b;b*=k;k+=1;'*input()
while r*a%b:r+=1
print r

Kiểm tra nó trên Ideone .

Làm thế nào nó hoạt động

Gọi H (n) là tổng các nghịch đảo nhân của n số nguyên dương đầu tiên . Tại mọi thời điểm, chúng ta có a / b = 1 + H (k - 1) . Trong thực tế, a , bk đều được khởi tạo thành 11/1 = 1 = 1 + H (0) .

Chúng tôi lặp lại đoạn mã

a=a*k+b;b*=k;k+=1;

(dưới dạng một chuỗi) n (đầu vào) lần và thực hiện kết quả. Trong mỗi bước, chúng tôi cập nhật a , bk bằng cách sử dụng danh tính a / b + 1 / k = ak / bk + b / bk = (ak + b) / bk .

Sau khi tất cả các bản sao đã được thực thi, a / b = 1 + H (n) , có cùng mẫu số là H (n) .

Dạng giảm hoàn toàn của a / b(a ÷ gcd (a, b)) / (b ÷ gcd (a, b)) . Thay vì tính ước số chung lớn nhất, chúng tôi khởi tạo r1 và tiếp tục tăng r cho đến khi ra là bội số của b .

Rõ ràng, làm cho này RA bội số chung nhỏ nhất của mộtb . Vì gcd (a, b) · lcm (a, b) = ab , nên ta có b ÷ gcd (a, b) = lcm (a, b) ÷ a = ra ÷ a = r , tạo ra r đầu ra mong muốn.


3

Haskell, 52

Import Data.Ratio
f n=denominator$sum[1%k|k<-[1..n]]

Nếu tệp được tải vào GHCI, f có thể được sử dụng làm hàm.


1
Có lẽ bạn có nghĩa là importchữ thường? Nó tiết kiệm một byte để sử dụng mapthay vì hiểu:sum$map(1%)[1..n]
xnor

2

Thạch, 9 byte

!©÷RSg®®÷

Hãy thử nó ở đây.

             Argument: n
! ÷R         Compute [n!÷1, n!÷2, … n!÷n].
 ©             (And store n! in the register.)
    S        Find the sum of this list.
     g®      GCD with n!.
       ®÷    Divide n! by this GCD.

Tôi tin rằng có thể đạt được cùng một số lượng mà không cần đăng ký.
Leaky Nun

2

MATL , 14 13 byte

:p:G:!/s1\&X<

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

Giải trình

Đối với đầu vào N , đầu ra được giới hạn trên bởi N ! (giai thừa của N ). Mã này tính n / k cho n = 1, ..., N ! và cho k = 1, ..., N . Sau đó, nó tính tổng k , cho số hài hòa nhân với mỗi n . Kết quả mong muốn là chỉ số n của giá trị đầu tiên trong số các giá trị đó là một số nguyên.


2

Ruby, 57 47 byte

->n{(1..n).reduce{|a,i|a+1.to_r/i}.denominator}

Cảm ơn Kevin Lau đã rút ngắn điều này bằng mười byte.


Chỉ định một biến để 1.to_rbạn không cần thực hiện chuyển đổi và tiêm chuỗi. Ngoài ra, vì mặc định của Ruby reducelà sử dụng phần tử đầu tiên làm phần tử ban đầu và 1/1=1, bạn không cần đặt cụ thể 0làm giá trị ban đầu.
Mực giá trị

2

Toán học, 26 byte

Denominator@Tr[1/Range@#]&

Một hàm không tên lấy nlàm đầu vào và trả về mẫu số. Sử dụng thủ thuật tiêu chuẩn của lạm dụng Tr(theo dõi) để tổng hợp danh sách các đối ứng.


1

JavaScript (ES6), 88 byte

m=>{for(d=1,i=0;i<m;d*=++i);for(n=i=0;i<m;n+=d/++i);for(g=d;g;[g,n]=[n%g,g]);return d/n}

Chỉ hoạt động tối đa m = 20 vì các giới hạn về độ chính xác số của JavaScript.


1

05AB1E , 8 byte

Mã số:

!йL/O¿/

Giải trình:

!         # Take the factorial of the input.
 Ð        # Triplicate this.
  ¹L      # Get the list [1 ... input].
    /O    # Divide and sum up.
      ¿   # Get the GCD of the sum and the factorial.
       /  # Divide the factorial by this.

Có thể có một số vấn đề chính xác cho n> 19 do phân chia của Python ... Sử dụng mã hóa CP-1252 .

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



0

J, 20 byte

(!%!+.[:+/!%1+i.)@x:

Dựa trên cách tiếp cận được sử dụng bởi giải pháp của @ Lynn .

Nếu độ chính xác là không cần thiết đối với các giá trị lớn của n hoặc nếu chúng ta có thể giả sử n sẽ được truyền dưới dạng một số nguyên mở rộng, được thêm vào bởi x, một giải pháp ngắn hơn có thể được sử dụng cho 15 byte .

!%!+.[:+/!%1+i.

Sử dụng

   f =: (!%!+.[:+/!%1+i.)@x:
   f 30
2329089562800
   (,:f"0) >: i. 15
1 2 3  4  5  6   7   8    9   10    11    12     13     14     15
1 2 6 12 60 20 140 280 2520 2520 27720 27720 360360 360360 360360

Giải trình

(!%!+.[:+/!%1+i.)@x:  Input: n
                  x:  Convert n into an extended integer
              i.      Creates the range [0, 1, ..., n-1]
            1+        Add one to each, range is now [1, 2, ..., n]
          !           Get factorial of n
           %          Divide n! by each value in the range [1, 2, ..., n]
      [:+/            Sum those values
   !                  Get n!
    +.                Get gcd between n! and the sum
 !                    Get n!
  %                   Divide n! by the gcd and return

0

Perl 6 ,  36  32 byte

{([+] 1.FatRat X/1..$_).denominator}
{([+] 1.FatRat X/1..$_).nude[1]}

Giải trình:

{
  (
    [+]        # reduce with &infix:<+>

      # the following produces a Seq of Rational numbers
      # 1/1, 1/2, 1/3 ... 1/n

      1.FatRat # FatRat.new: 1,1
      X/       # crossed using &infix:</>
      1 .. $_  # Range from 1 to the input inclusive

  ) # resulting in a FatRat

  .nude # (nu)merator (de)nominator
  .[1]  # grab the denominator
}

Kiểm tra:

my &hd = {([+] 1.FatRat X/1..$_).nude[1]}

say (1..10)».&hd; # (1 2 6 12 60 20 140 280 2520 2520)

say hd 100; # 2788815009188499086581352357412492142272
say chars hd 1000; # 433
say chars hd 10000; # 4345

0

Hoon , 95 byte

|=
@
=+
n=(gulf 1 +<)
=+
f=(roll n mul)
(div f d:(egcd f (roll (turn n |=(@ (div f +<))) add)))

Tạo danh sách [1...n], gấp nó lại ++mulcho giai thừa, tạo danh sách [n!/1, n!/2, ... n!/n]và tính tổng, tìm GCD của n!danh sách và chia giai thừa cho số đó.

Có lẽ có một cách dễ dàng hơn để tính mẫu số, nhưng tôi không thể tìm ra nó: /


Oh Hoon, tại sao mã thông báo của bạn cần nhiều khoảng trắng dư thừa?
Rò rỉ Nun

Tất cả các mục Hoon của tôi trông xấu xí vì các dòng mới :( Mã Hoon thông thường sử dụng hai khoảng trắng giữa các mã thông báo, nhưng một dòng mới ngắn hơn
RenderSinstall

0

Python 3, 153 150 146 142 byte

Tôi chắc chắn rằng điều này có thể chơi gôn hơn nữa. Nhưng tôi mới ở đây

f=lambda x:0**x or x*f(x-1)
z=int(input());i=f(z)
r=sum(i/y for y in range(1,z+1))  
p=lambda a,b:a if b<1else not a%b+b or p(b,a%b)
print(i/p(r,i))

Chào mừng đến với PPCG!
Rò rỉ Nun

0

Tiên đề, 34 byte

f(x)==denominator(sum(1/n,n=1..x))

kiểm tra

(24) -> [[i,f(i)] for i in 1..30]
   (24)
   [[1,1], [2,2], [3,6], [4,12], [5,60], [6,20], [7,140], [8,280], [9,2520],
    [10,2520], [11,27720], [12,27720], [13,360360], [14,360360], [15,360360],
    [16,720720], [17,12252240], [18,4084080], [19,77597520], [20,15519504],
    [21,5173168], [22,5173168], [23,118982864], [24,356948592],
    [25,8923714800], [26,8923714800], [27,80313433200], [28,80313433200],
    [29,2329089562800], [30,2329089562800]]
                                       Type: List List Expression Integer

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.