Tìm tiếp tuyến của tổng tiếp tuyến nghịch đảo


16

Lý lịch

Nó có thể được chỉ ra rằng đối với bất kỳ số nguyên nào k >= 0, f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))là một số hữu tỷ.

Mục tiêu

Viết một chương trình hoặc hàm hoàn chỉnh mà khi được đưa ra k >= 0, xuất ra f(k)dưới dạng một phần giảm duy nhất (tử số và mẫu số là số nguyên).

Các trường hợp thử nghiệm

Một vài giá trị đầu tiên là

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)

Quy tắc

  • Sơ hở tiêu chuẩn bị cấm.
  • Đầu vào và đầu ra có thể ở bất kỳ định dạng thuận tiện. Bạn có thể xuất ra f(k)dưới dạng một chuỗi numerator/denominator, dưới dạng một bộ gồm hai số nguyên, một phân số hoặc đối tượng hợp lý, v.v. Nếu bạn xuất một chuỗi, chỉ cung cấp hai số nguyên, nghĩa là đầu ra 3/2thay vì 1 1/2.
  • Đây là code-golf, câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.

1
Bạn có thể xác định rõ hơn trong các trường hợp thử nghiệm của mình các giá trị đầu vào / đầu ra là gì không?
Ian H.

1
Là các số nguyên trong phạm vi tính bằng độ hoặc radian?
Erik the Outgolfer

1
OEIS: A180657
Sisyphus

4
Các atan(0)hạn là không cần thiết.
Adám

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

Câu trả lời:



11

Toán học, 28 byte

Fold[+##/(1-##)&,0,Range@#]&

Hãy thử trực tuyến!

Một cách tiếp cận dài hơn nhưng thú vị hơn (32 byte):

Im@#/Re@#&@Product[1+n I,{n,#}]&

Hãy thử trực tuyến!


+1 o'_'oMathicala và các phần mềm tích hợp của nóo'_'o
Ông Xcoder

3
@ Mr.Xcoder Không thực sự trong trường hợp này. OP đang sử dụng tổng kết chuỗi một cách khéo léo (nếu tôi đọc đúng mã).
Adám

11

Python 2 ,76 72 byte

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

Sử dụng danh tính:

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

Chúng ta có:

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

Hãy thử trực tuyến!

Nhờ Luis Mendo, tiết kiệm 4 byte.


1
Hy vọng bạn không phiền: Tôi đã thêm một liên kết TiO.
Ông Xcoder

@LuisMendo LGTM, Đã chỉnh sửa.
tsh

3

APL (Dyalog) , 14 byte

Yêu cầu ⎕FR←1287( 128 chút F loating điểm R epresentation) cho đầu vào nhỏ. Đưa ra knhư là lý lẽ đúng.

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

Hãy thử trực tuyến!

 số nguyên từ một đến k(không cần 0 là 0 = arctan 0)

¯3+.○ tổng tiếp tuyến

3○ tiếp tuyến

1(... ) áp dụng các chức năng ngầm sau với 1 như là đối số bên trái và bên trên như là đối số đúng:

 bội số chung thấp nhất (của 1 và đối số đúng); đưa ra tử số

÷ chia

, sự kết hợp (của 1 và đối số đúng); đưa ra tử số và mẫu số



2

JavaScript (ES6), 80 byte

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]

Trả về cặp [tử số, mẫu số]. Giải thích: Hãy để f(n-1) = a/bsau đó f(n) = atan(tan(n)+tan(a/b)) = (n+a/b)/(1-n*a/b) = (b*n+a)/(b-n*a). Sau đó, nó vẫn còn để giảm các phần đến các điều khoản thấp nhất của nó.

Môi trường ES6 trực tuyến



1

05AB1E , 33 26 byte

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

Hãy thử trực tuyến!

Giải trình

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

Casio-Basic, 35 byte

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

tan -1 nên được nhập dưới dạng một trên bàn phím Trig; hoặc -1 có thể được nhập riêng từ bàn phím abc> Math. Theo hướng dẫn của fx-CP400, đó là một ký tự hai byte (764).

Hàm, 34 byte cho mã, +1 byte để thêm klàm đối số.

Giải trình

seq(tan-1(n),n,0,k)tạo ra tất cả các giá trị tan-1(n)từ 0 đến k.

sumcộng tất cả chúng lại với nhau, sau đó tanthực hiện chức năng tiếp tuyến trên chúng.

tExpand sau đó sẽ biến chúng thành một phần nhỏ


@ Adám Đây là Casio, không phải TI, vì vậy nó không được thực hiện theo cách tương tự.
numbermaniac

Theo Wikipedia , ¹là hai byte mỗi; E5CCE5C1.
Adám

@ Adám ồ, tôi không nhận ra bài báo đó tồn tại! Tuy nhiên, đây là fx-CP400, không phải 9860G; Tôi vừa kiểm tra hướng dẫn, và siêu ký tự -1 thực sự là một ký tự đơn, mã 764; vì vậy nó là một ký tự hai byte.
numbermaniac

0

Julia 0,6,0 40 byte

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

Đó là một cách thực hiện đơn giản của câu hỏi. Độ chính xác của hợp lý hóa đôi khi có thể là lạ nhưng hoạt động tốt 99% thời gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.