ตัวส่วนของชุดฮาร์มอนิก


16

ก่อนหน้านี้เราได้pseudofactorialของตัวเลขซึ่งเป็น LCM ของตัวเลขจากไป1n

มันจะมีประโยชน์ในการเพิ่มเศษส่วนเข้าด้วยกัน

อย่างไรก็ตามเราพบว่าส่วนของการ1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6เป็น20แทน pseudofactorial ของซึ่งเป็น660

งานของคุณคือการหาตัวหารของจำนวนเต็มบวกให้1/1 + 1/2 + ... + 1/nn

Testcases

 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

อ้างอิง

ลีดเดอร์บอร์ด


การป้อนข้อมูลมีขนาดใหญ่เพียงใด
Brad Gilbert b2gills

@ BradGilbertb2gills ใหญ่พอสมควร
Leun Nun

คำตอบ:


8

M , 9 6 ไบต์

ขอบคุณFryAmTheEggmanสำหรับการบันทึก 3 ไบต์! รหัส:

RİSg¹İ

Mมีข้อได้เปรียบอย่างมากที่นี่เพราะทำงานได้กับเศษส่วนแทนที่จะเป็นแบบลอย คำอธิบาย:

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)

ใช้การเข้ารหัสวุ้น ลองออนไลน์! .


นอกจากนี้ยังมีวิธีแก้ปัญหา4 ไบต์ซึ่งบางครั้งก็เป็นศูนย์นำหน้า (เช่น280 -> 0280) ฉันไม่แน่ใจว่าได้รับอนุญาตหรือไม่:

RİSV

ลองออนไลน์! .


1
1. คำอธิบายของรหัส 6 ไบต์ไม่ถูกต้องนัก คำนวณหารกัน gratest ของส่วนและn การใช้g1อาจจะชัดเจนขึ้น 2. Vปลดเปลื้องส่วนให้เป็นสตริงและลบล้างมันแบบไร้ศูนย์ <num>/is (ไม่สะสม) ลดโดยผู้ดำเนินการ niladic นี่เป็นเรื่องไร้สาระ แต่เนื่องจากมีเพียงหมายเลขเดียว (อาร์กิวเมนต์โดยนัย0 ) มันจึงไม่ทำอะไรเลย ลิงก์ถัดไปตัวส่วนคือ niladic ดังนั้นค่าส่งคืนก่อนหน้าจะถูกพิมพ์โดยปริยายและแทนที่ด้วย nilad นั้น
Dennis

@ เดนนิสขอบคุณ! แก้ไขคำอธิบาย
Adnan

@Adnan มีเอกสารสำหรับ M หรือไม่
แยกผลไม้

@ Challenger5 ไม่ใช่ที่ฉันรู้ ที่จริงแล้วมันเป็นตัวแปรของเยลลี่ แต่มีเศษส่วนความแม่นยำตามอำเภอใจ สามารถใช้เอกสาร Jelly ได้ แต่น่าเสียดายที่ฟีเจอร์มากมายที่นำมาใช้ใน Jelly ไม่ได้ถูกนำมาใช้ใน M.
Adnan


4

Mathematica ขนาด 27 ไบต์

ฟังก์ชั่นที่ไม่ระบุชื่อ

Denominator@*HarmonicNumber

ตัวอย่างเช่น:

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

คุณสามารถหาโซลูชันขนาด 26 ไบต์หากคุณเจาะเข้าไปในการแชท :)
รั่วนูน

Oh! ฉันควรปล่อยให้มาร์ตินโพสต์อันนั้นถ้าเขาชอบ อันนี้เป็นตัวอักษรที่น่ารักดังนั้นฉันจะเก็บมันไว้
Lynn

คุณช่วยยกตัวอย่างวิธีการใช้รหัสได้หรือไม่?
DavidC

3

Python 2, 69 67 ไบต์

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

ทดสอบบนIdeone

มันทำงานอย่างไร

ให้H (n)เป็นผลรวมของผู้ผกผันทวีคูณของจำนวนเต็มบวกn ตัวแรก ทุกครั้งที่เรามีที่A / B = 1 + H (k - 1) ในความเป็นจริง, , และkทุกคนเริ่มต้นได้ที่1และ1/1 = 1 = 1 + H (0)

เราทำซ้ำข้อมูลโค้ด

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

(เป็นสตริง) n (อินพุต) คูณและดำเนินการผลลัพธ์ ในแต่ละขั้นตอนเราปรับปรุง, และkโดยใช้บัตรประจำตัวA / B + 1 / K = AK / bk + b / bk = (AK + B) / bk

หลังจากสำเนาทั้งหมดได้รับการดำเนินการ, A / B = 1 + H (n)ซึ่งมีส่วนเช่นเดียวกับH (n)

ลดลงได้อย่างเต็มที่ในรูปแบบของA / Bคือ(เป็น÷ GCD (A, B)) / (ข÷ GCD (A, B)) แทนที่จะคำนวณตัวหารร่วมมากเราเริ่มต้นrเป็น1และให้การเพิ่มRจนกว่าRAมีหลายข

เห็นได้ชัดว่านี้จะทำให้raตัวคูณร่วมน้อยของและข ตั้งแต่gcd (a, b) · lcm (a, b) = abเรามีสิ่งนั้น b ÷ gcd (a, b) = lcm (a, b) ÷ a = ra ÷ a = rทำให้rเป็นเอาต์พุตที่ต้องการ


3

Haskell, 52

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

หากไฟล์ถูกโหลดลงใน GHCI คุณสามารถใช้ f เป็นฟังก์ชันได้


1
คุณหมายถึงimportตัวพิมพ์เล็กหรือไม่ มันจะช่วยประหยัดไบต์ที่จะใช้mapแทนความเข้าใจ:sum$map(1%)[1..n]
XNOR

2

เยลลี่ขนาด 9 ไบต์

!©÷RSg®®÷

ลองที่นี่

             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.

ฉันเชื่อว่าเป็นไปได้ที่จะได้รับ bytecount เดียวกันโดยไม่ต้องลงทะเบียน
Leun Nun

2

MATL , 14 13 ไบต์

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

ลองออนไลน์!

คำอธิบาย

สำหรับอินพุตNเอาต์พุตจะถูกล้อมรอบด้วยN ! (แฟกทอเรียลของN ) รหัสคำนวณn / kสำหรับn = 1, ... , N ! และk = 1, ... , N จากนั้นก็จะสรุปกว่าkซึ่งจะช่วยให้จำนวนฮาร์โมนิคูณแต่ละn ผลลัพธ์ที่ต้องการคือดัชนีnของค่าแรกที่เป็นจำนวนเต็ม


2

Ruby, 57 47 ไบต์

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

ขอบคุณKevin Lau ที่ย่อให้สั้นลงสิบไบต์


กำหนดตัวแปรให้1.to_rดังนั้นคุณไม่จำเป็นต้องทำการฉีดสตริงและการแปลง นอกจากนี้เนื่องจากค่าเริ่มต้นของ Ruby สำหรับreduceคือการใช้องค์ประกอบแรกเป็นค่าเริ่มต้นและ1/1=1คุณไม่จำเป็นต้องตั้งค่า0เป็นค่าเริ่มต้นโดยเฉพาะ
ค่าหมึก

2

Mathematica ขนาด 26 ไบต์

Denominator@Tr[1/Range@#]&

ฟังก์ชันที่ไม่มีชื่อซึ่งใช้nเป็นอินพุตและส่งคืนตัวหาร ใช้เคล็ดลับมาตรฐานของการใช้งานที่ไม่เหมาะสมTr(ติดตาม) เพื่อรวมรายการของส่วนกลับ


1

JavaScript (ES6), 88 ไบต์

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}

ใช้งานได้มากถึง m = 20 เนื่องจากข้อ จำกัด ของความแม่นยำตัวเลขของ JavaScript


1

05AB1E , 8 ไบต์

รหัส:

!йL/O¿/

คำอธิบาย:

!         # 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.

อาจมีปัญหาความแม่นยำสำหรับ n> 19 เนื่องจากการแบ่งของ Python ... ใช้CP-1252เข้ารหัส

ลองออนไลน์! .



0

J, 20 ไบต์

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

ขึ้นอยู่กับวิธีการที่ใช้โดยลินน์ @ วิธีการแก้ปัญหา

หากมีความแม่นยำไม่จำเป็นสำหรับค่ามากnหรือถ้าเราสามารถสมมติnจะถูกส่งผ่านเป็นจำนวนเต็มขยาย suffixed โดยxเป็นทางออกที่สั้นสามารถใช้สำหรับ15 ไบต์

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

การใช้

   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

คำอธิบาย

(!%!+.[:+/!%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 ไบต์

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

คำอธิบาย:

{
  (
    [+]        # 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
}

ทดสอบ:

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

ฮุน 95 ไบต์

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

สร้างรายการ[1...n]พับลงไป++mulสำหรับ factorial สร้างรายการ[n!/1, n!/2, ... n!/n]และหาผลรวมค้นหา GCD ของn!และรายการและหารแฟกทอเรียลด้วยหมายเลขนั้น

อาจเป็นวิธีที่ง่ายกว่ามากในการคำนวณตัวส่วน แต่ฉันไม่สามารถหาได้: /


โอฮุนทำไม tokenizer ของคุณต้องการพื้นที่ว่างเหลือเฟือมากมาย?
Leun Nun

รายการ Hoon ทั้งหมดของฉันดูน่าเกลียดเพราะขึ้นบรรทัดใหม่ :( รหัส Hoon ปกติใช้ช่องว่างสองอันระหว่างโทเค็น แต่ขึ้นบรรทัดใหม่หนึ่งบรรทัด
RenderSettings

0

Python 3, 153 150 146 142 ไบต์

ฉันแน่ใจว่านี่สามารถเล่นกอล์ฟต่อไปได้ แต่ฉันใหม่ที่นี่

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

ยินดีต้อนรับสู่ PPCG!
Leun Nun

0

ความจริง 34 ไบต์

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

ทดสอบ

(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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.