역 탄젠트의 합의 탄젠트 구하기


16

배경

임의의 정수 k >= 0f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))대해 합리적인 숫자 임을 알 수 있습니다 .

주어진 경우 k >= 0, f(k)하나의 축소 된 분수로 출력 되는 완전한 프로그램이나 함수를 작성하십시오 (분자와 분모는 코 프라임).

테스트 사례

처음 몇 값은

f(0) = (0,1)
f(1) = (1,1)
f(2) = (-3,1)
f(3) = (0,1)
f(4) = (4,1)
f(5) = (-9,19)
f(6) = (105,73)

규칙

  • 표준 허점 은 금지되어 있습니다.
  • 입력 및 출력 은 편리한 형식 일 수 있습니다. 두 개의 정수, 분수 또는 합리적인 객체 등의 튜플로 f(k)string으로 출력 할 수 있습니다 . 문자열 numerator/denominator을 출력하는 경우 두 개의 정수만 제공하십시오 (즉, 3/2대신 출력 ) 1 1/2.
  • 이것은 가장 짧은 답변 (바이트)이이기는 코드 골프입니다.

1
테스트 케이스에서 입력 / 출력 값이 무엇인지 추가로 지정할 수 있습니까?
Ian H.

1
도 또는 라디안 범위의 정수입니까?
아웃 골퍼 Erik

1
OEIS : A180657
Sisyphus

4
atan(0)용어는 불필요합니다.
Adám

3
@ pizzapants184 f (0) = tan∑∅ = tan 0 = 0
Adám

답변:




11

파이썬 2 ,76 72 바이트

from fractions import*
f=lambda k:Fraction(k and(k+f(k-1))/(1-k*f(k-1)))

정체성을 사용하십시오 :

tan(A + B) = (tan(A) + tan(B)) / (1 - tan(A) * tan(B))

우리는 :

f(k) = 0                                    if k = 0
     = (k + f(k - 1)) / (1 - k * f(k - 1))  if k > 0

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

Luis Mendo 덕분에 4 바이트를 절약 할 수 있습니다.


1
신경 쓰지 않기를 바랍니다 : TiO 링크를 추가했습니다.
Mr. Xcoder

@LuisMendo LGTM, 편집.
tsh

3

APL (Dyalog) , 14 바이트

요구 ⎕FR←1287( 128 비트 F loating 점 R의 작은 입력 epresentation). 소요 k오른쪽 인자로.

1(∧÷,)3○¯3+.○⍳

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

 1부터 1까지의 정수 k(0 = arctan 0이므로 0이 필요하지 않음)

¯3+.○ 원호 탄젠트의 합

3○ 접선

1() 1을 왼쪽 인수로, 위를 오른쪽 인수로하여 다음의 암묵적 기능을 적용하십시오.

 최저 공배수 (1과 오른쪽 인수); 분자를 제공합니다

÷ 로 나눈

, 연결 (1과 올바른 주장); 분자와 분모를 제공합니다



2

자바 스크립트 (ES6), 80 바이트

f=n=>n?([a,b]=f(n-1),g=(a,b)=>a?g(b%a,a):b,c=g(d=b*n+a,e=b-n*a),[d/c,e/c]):[0,1]

[분자, 분모] 쌍을 반환합니다. 설명 : Letf(n-1) = a/b 다음 f(n) = atan(tan(n)+tan(a/b)) = (n+a/b)/(1-n*a/b) = (b*n+a)/(b-n*a). 그런 다음 분수를 가장 낮은 항으로 줄입니다.

온라인 ES6 환경



1

05AB1E , 33 26 바이트

0X)Iƒ©`N*+®`sN*-‚D¿D_i\¤}/

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

설명

0X)                          # initialize stack with [0,1]
   Iƒ                        # for N in range [0 ... input] do:
     ©                       # store a copy of the current pair in the register
      `                      # push the pair separately to the stack
       N*                    # multiply the denominator with N
         +                   # add the numerator
          ®`s                # push the denominator then the numerator to the stack
             N*              # multiply the numerator by N
               -             # subtract it from the denominator
                D¿D          # get 2 copies of the greatest common divisor
                   0Qi  }    # if the gcd equals 0
                      \¤     # replace it with the denominator
                         /   # divide the pair with this number


1

카시오 기본, 35 바이트

tExpand(tan(sum(seq(tan⁻¹(n),n,0,k

tan -1 은 Trig 키보드에있는 것으로 입력해야합니다. 또는 -1 은 abc> Math 키보드와 별도로 입력 할 수 있습니다. fx-CP400의 매뉴얼에 따르면, 이것은 2 바이트 문자 (764)입니다.

함수, 코드의 경우 34 바이트 k, 인수 로 추가 할 +1 바이트

설명

seq(tan-1(n),n,0,k)tan-1(n)0에서 k까지의 모든 값을 생성합니다 .

sum그것들을 모두 tan합한 다음 탄젠트 기능을 수행합니다.

tExpand 그런 다음 단일 분수로 바꿉니다.


@ Adám TI가 아닌 Casio이므로 동일한 방식으로 수행되지 않습니다.
numbermaniac

에 따르면 위키 백과 , ¹두 바이트 각각; E5CC그리고 E5C1.
Adám

@ Adám oh nice, 나는 기사가 존재한다는 것을 몰랐다! 그러나 이것은 9860G가 아닌 fx-CP400입니다. 방금 매뉴얼을 확인했으며 위첨자 -1은 실제로 단일 문자 코드 764입니다. 단일 2 바이트 문자입니다.
numbermaniac

0

Julia 0.6.0 40 바이트

k->rationalize(tan(sum(x->atan(x),1:k)))

그것은 질문의 간단한 구현입니다. 합리화의 정밀도는 때때로 이상 할 수 있지만 99 %의 시간 동안 잘 작동합니다.

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