고조파 계열의 분모


16

앞서, 우리는 한 pseudofactorial 에서 숫자의 LCM 인 숫자의 1에를 n.

분수를 더하는 데 유용합니다.

그러나, 우리의 분모를 찾을 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6것입니다 20대신 pseudofactorial의 6입니다 60.

당신의 임무는 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 합리적인만큼 큰.
Leaky Nun

답변:


8

M , 9 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)

젤리 인코딩을 사용합니다 . 온라인으로 사용해보십시오! .


또한 4 바이트 솔루션이 있으며 때로는 0을 앞에 오는 0을 출력합니다 280 -> 0280. 이것이 허용되는지 확실하지 않습니다.

RİSV

온라인으로 사용해보십시오! .


1
1. 6 바이트 코드에 대한 설명이 정확하지 않습니다. 분수와 n 의 가장 큰 제수를 계산합니다 . g1아마 사용 이 더 명확 할 것입니다. 2. V분수를 문자열로 캐스트하고이를 기수 적으로 증발시킵니다. <num>/닐라 딕 연산자에 의해 (비누 적) 감소됩니다. 이것은 말이되지 않지만 하나의 숫자 (암시 적 인수 0 ) 만 있기 때문에 아무 것도 수행하지 않습니다. 다음 링크 인 분모는 닐라 스틱이므로 이전 반환 값이 암시 적으로 인쇄되어 해당 닐라 드로 대체됩니다.
Dennis

@Dennis 감사합니다! 설명을 수정했습니다.
Adnan

@Adnan M에 대한 문서가 있습니까?
Esolanging 과일

@ Challenger5 내가 아는 바가 없습니다. 실제로 Jelly의 변형이지만 임의의 정밀 분수가 있습니다. Jelly 문서를 사용할 수는 있지만 Jelly에서 구현 된 많은 기능이 M에서는 구현되지 않았다는 사실에 경이로울 수 있습니다.
Adnan

5

줄리아, 22 바이트

익명의 기능.

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

동일한 길이 :n->sum(inv,1//1:n).den
Alex A.

4

Mathematica, 27 바이트

익명의 기능.

Denominator@*HarmonicNumber

예를 들면 다음과 같습니다.

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

채팅에 발굴하면 26 바이트 솔루션을 찾을 수 있습니다 :)
Leaky Nun

오! 마틴이 원한다면 그 게시물을 게시하도록해야합니다. 이건 정말 문자 그대로이므로 계속하겠습니다.
Lynn

코드 사용 방법을 예시 해 주시겠습니까?
DavidC

3

파이썬 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) 입니다. 실제로 a , bk 는 모두 1로 초기화 되고 1 / 1 = 1 = 1 + H (0) 입니다.

코드 스 니펫을 반복합니다

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

(문자열로) n (입력) 번하고 결과를 실행하십시오. 각 단계에서 a , bk를 업데이트 합니다 에서 ID a / b + 1 / k = ak / bk + b / bk = (ak + b) / bk를 사용하여 를 .

모든 사본이 실행 된 후 a / b = 1 + H (n) 은 분모가 동일합니다. H (n) .

완전히 축소 된 a / b 형식 은 (a ÷ gcd (a, b)) / (b ÷ gcd (a, b)) 입니다. 최대 공약수를 계산하는 대신 r1 로 초기화 하고 rab 의 배수가 될 때까지 r을 계속 증가시킵니다 .

분명히 이것은 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소문자 를 의미 합니까? 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

MATL , 14 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.
Value Ink

2

Mathematica, 26 바이트

Denominator@Tr[1/Range@#]&

명명되지 않은 함수 n는 입력을 취하고 분모를 반환합니다. 역행의 Tr목록을 합치기 위해 표준 학대의 트릭 (추적)을 사용합니다 .


1

자바 스크립트 (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

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

list를 작성 하고 계승으로 [1...n]접고 ++mul,리스트를 작성 [n!/1, n!/2, ... n!/n]하고 합산하고, n!목록의 GCD를 찾은 다음 계승을 해당 숫자로 나눕니다.

분모를 계산하는 훨씬 쉬운 방법이 있지만 알아낼 수는 없습니다.


오훈, 왜 당신의 토크 나이저에 많은 여분의 공백이 필요합니까?
Leaky Nun

내 모든 훈 항목 때문에 줄 바꿈으로 예쁘게 :( 일반 훈 코드가 토큰 사이에 두 개의 공백을 사용하지만 하나의 줄 바꿈이 짧은
RenderSettings

0

파이썬 3, 153150146142 바이트

나는 이것이 더 골프를 칠 수 있다고 확신합니다. 하지만 난 여기 새로 왔어

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.