谐波系列的分母


16

之前,我们对数字进行了伪析因运算,即从1到的数字的LCM n

将分数相加会很有用。

但是,我们发现的分母为1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/620而不是的伪因式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 '16

@ BradGilbertb2gills尽可能大。
Leaky Nun

Answers:


8

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

使用Jelly编码在线尝试!


此外,还有一个4字节的解决方案,有时会输出前导零(例如280 -> 0280)。我不确定是否允许这样做:

RİSV

在线尝试!


1
1. 6字节代码的解释不太正确。计算分数和n的最强通用除数。使用g1可能会更清晰。2. V将分数转换为字符串,然后对其进行无效评估。<num>/是(非累积的)归零法运算符。这是胡说八道,但是由于只有一个数字(隐式参数0),因此它什么也不做。下一个链接(分母)是尼拉度数,因此隐式打印前一个返回值,并用该尼拉度数代替。
丹尼斯

@丹尼斯谢谢!修正了说明。
阿德南

@Adnan是否有有关M的文档?
硕果累累

@ Challenger5我不知道。它实际上是Jelly的变体,但是具有任意精度分数。可以使用Jelly文档,但请注意,在M中没有实现Jelly中实现的许多功能。–
Adnan

5

朱莉娅,22个字节

匿名函数。

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

相同长度:n->sum(inv,1//1:n).den
Alex A.16年

4

Mathematica,27个字节

匿名函数。

Denominator@*HarmonicNumber

例如:

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

如果您聊天,则可以找到26字节的解决方案:)
Leaky Nun

哦! 如果他愿意,我应该让马丁发布那个。这个名字很真实,所以我会保留下来。
林恩

您能举例说明代码的使用方式吗?
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)。实际上,abk都初始化为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更新abk

执行完所有副本后,a / b = 1 + H(n),其分母与H(n)相同

a / b的完全归约形式为(a÷gcd(a,b))/(b÷gcd(a,b))。不用计算最大公因数,我们将r初始化为1并保持递增r直到rab的倍数。

显然,这使raab的最小公倍数。由于gcd(a,b)·lcm(a,b)= ab,我们得到b÷gcd(a,b)= lcm(a,b)÷a = ra÷a = r,使r成为期望的输出。


3

哈斯克尔(52)

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

如果将文件加载到GHCI中,则f可以用作函数。


1
大概是import小写吗?它保存一个字节以使用a 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.

我相信没有该寄存器也可以实现相同的字节数。
Leaky Nun

2

MATL14 13字节

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

在线尝试!

说明

对于输入N,输出上限为N!(N的阶乘)。的代码计算ñ / ķÑ = 1,...,Ñ!并且对于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是使用第一个元素作为初始值and 1/1=1,因此您无需专门设置0为初始值。
Value Ink

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将作为扩展整数(后缀为)传递,则可以将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

Hoon,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]并将其求和,找到n!和的GCD ,然后将阶乘除以该数字。

计算分母的方法可能更简单,但我无法弄清楚:/


哦,哦,为什么您的令牌生成器需要那么多冗余空白?
Leaky Nun

我所有的勋条目看起来很丑,因为换行:(普通勋代码使用代币之间的两个空间,但一个换行符是短
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!
Leaky 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.