調和級数の分母


16

前に、数値の疑似因子分析を行いました。これは、から1までの数値のLCMですn

分数を一緒に追加するのに役立ちます。

しかし、我々は分母がいることを見つけること1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/620はなく、pseudofactorialです660

あなたの仕事は、1/1 + 1/2 + ... + 1/n与えられた正の整数の分母を見つけることnです。

テストケース

 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

参照資料

リーダーボード


どのくらいの入力を処理する必要がありますか?
ブラッドギルバートb2gills

@ BradGilbertb2gills妥当な大きさ。
リーキー修道女

回答:


8

M9 6バイト

3バイトを節約してくれたFryAmTheEggmanに感謝します!コード:

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)

Jellyエンコーディングを使用しますオンラインでお試しください!


また、4バイトのソリューションがあり、先行ゼロを出力する場合があります(例:)280 -> 0280。これが許可されているかどうかはわかりません:

RİSV

オンラインでお試しください!


1
1. 6バイトコードの説明は、まったく正しくありません。分数とnの最大公約数を計算します。使用g1する方がおそらく明確になるでしょう。2. V分数を文字列にキャストし、niladicallyに評価します。<num>/ニラディック演算子による(非累積)リデュースです。これはナンセンスですが、1つの数字(暗黙的な引数0)しかないため、何もしません。次のリンクである分母はniladicであるため、以前の戻り値は暗黙的に出力され、そのniladに置き換えられます。
デニス

@デニスありがとう!説明を修正しました。
アドナン

@Adnan Mのドキュメントはありますか?
エソランジングフルーツ

@ Challenger5私が知っていることではない。これは実際にはJellyのバリアントですが、任意の精度の小数部を備えています。Jellyのドキュメントを使用できますが、Jellyに実装されている多くの機能がMに実装されていないことに注意してください。–
Adnan


4

Mathematica、27バイト

匿名関数。

Denominator@*HarmonicNumber

例えば:

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

チャットを掘り下げると、26バイトのソリューションを見つけることができます:)
リーキーy

ああ!彼が好きなら、私はマーティンにそれを投稿させるべきです。これは文字通り愛らしいので、私はそれを保持します。
リン

コードの使用方法を例示していただけますか?
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)です。実際、ab、およびkはすべて1に初期化され、1/1 = 1 = 1 + H(0)です。

コードスニペットを繰り返します

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

(文字列として)n(入力)回、結果を実行します。各ステップで、アイデンティティa / b + 1 / k = ak / bk + b / bk =(ak + b)/ bkを使用してab、およびkを更新ます。

すべてのコピーが実行された後、a / b = 1 + H(n)、これはH(n)と同じ分母を持ちます。

完全還元型/ bがある(÷GCD(A、B))/(B÷GCD(b)参照)。最大公約数を計算する代わりに、r1に初期化し、rabの倍数になるまでrをインクリメントし続けます。

明らかに、これはraabの最小公倍数にます。以降GCD(A、B)・LCM(A、B)= AB、我々は持っているB÷GCD(A、B)= LCM(B)÷A = RA÷A = R、製造R所望の出力を。


3

ハスケル、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.

そのレジスタなしで同じバイトカウントを達成することは可能だと思います。
リーキー修道女

2

MATL14 13バイト

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

オンラインでお試しください!

説明

入力Nの場合、出力の上限はNです!(Nの階乗)。コードは、n = 1、...、Nに対してn / kを計算します!そして、のためのk = 1、...、N。次に、kを合計します。これにより、各nに乗算された調和数が得られます。望ましい結果は、整数であるこれらの値の最初のインデックスnです。


2

ルビー、57 47バイト

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

これを10バイト短縮してくれた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}

JavaScriptの数値精度の制限のため、m = 20までしか機能しません。


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.

Pythonの除算が原因で、n> 19の精度に問題がある可能性があります... CP-1252エンコーディングをます。

オンラインでお試しください!



0

J、20バイト

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

@Lynnが使用するアプローチに基づいて ソリューションでます

nの値が大きい場合に精度が必要ない場合、またはnが接尾辞の付いた拡張整数として渡されると想定できる場合はx15バイトの短いソリューションを使用できます

!%!+.[:+/!%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、リストを作成します[n!/1, n!/2, ... n!/n]をして合計し、GCD n!とリストを見つけ、階乗をその数で除算します。

おそらく分母を計算するはるかに簡単な方法がありますが、私はそれを理解することはできません:/


Oh Hoon、なぜあなたのトークナイザーは非常に多くの冗長な空白を必要としますか?
リーキー修道女

改行があるため、すべてのHoonエントリがlookいように見えます:(通常のHoonコードはトークン間に2つのスペースを使用しますが、1つの改行は短くなります
-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へようこそ!
リーキー修道女

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.