Temukan garis singgung dari jumlah garis singgung terbalik

16

Latar Belakang

Dapat ditunjukkan bahwa untuk bilangan bulat apa pun k >= 0, f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))adalah bilangan rasional.

Tujuan

Tulis program atau fungsi lengkap yang ketika diberikan k >= 0, output f(k)sebagai fraksi tunggal yang dikurangi (pembilang dan penyebutnya adalah coprime).

Uji kasus

Beberapa nilai pertama adalah

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)

Aturan

  • Celah standar dilarang.
  • Input dan output mungkin dalam format apa pun yang nyaman. Anda dapat menampilkan f(k)sebagai string numerator/denominator, sebagai tupel dari dua bilangan bulat, sebagian kecil atau objek rasional, dll. Jika Anda menghasilkan string, berikan hanya dua bilangan bulat, yaitu, 3/2bukan keluaran 1 1/2.
  • Ini adalah kode-golf, jawaban terpendek (dalam byte) menang.
Ethan Ward
sumber
1
Bisakah Anda menentukan lebih lanjut dalam kasus uji Anda apa nilai input / output itu?
Ian H.
1
Apakah bilangan bulat dalam kisaran derajat atau radian?
Erik the Outgolfer
1
OEIS: A180657
Sisyphus
4
The atan(0)Istilah tidak perlu.
Adm
3
@ pizzapants184 f (0) = tan €∅ = tan 0 = 0
Adm

Jawaban:

4

M , 11 byte

×C÷@+
R0;ç/

Cobalah online!

Menggunakan formula OEIS x(n) = (x(n-1)+n)/(1-n*x(n-1))dengan x(0) = 0.

mil
sumber
11

Mathematica, 28 byte

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

Cobalah online!

Pendekatan yang lebih panjang, tetapi lebih menarik (32 byte):

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

Cobalah online!

alephalpha
sumber
+1 o'_'oMathematica dan o'_'o
bawaannya
3
@ Mr.Xcoder Tidak benar-benar dalam hal ini. OP menggunakan penjumlahan seri secara cerdik (jika saya membaca kode dengan benar).
Adm
11

Python 2 ,76 72 byte

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

Gunakan identitas:

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

Kita punya:

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

Cobalah online!

Terima kasih kepada Luis Mendo, simpan 4 byte.

tsh
sumber
1
Semoga Anda tidak keberatan: Saya menambahkan tautan TiO.
Tn. Xcoder
@LuisMendo LGTM, Diedit.
tsh
3

APL (Dyalog) , 14 byte

Membutuhkan ⎕FR←1287( 128 bit F loating-point R epresentation) untuk input kecil. Dibawa ksebagai argumen yang benar.

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

Cobalah online!

 bilangan bulat satu sampai k(nol tidak diperlukan karena 0 = arctan 0)

¯3+.○ jumlah garis singgung arcus

3○ garis singgung

1(... ) terapkan fungsi tacit berikut dengan 1 sebagai argumen kiri dan di atas sebagai argumen kanan:

 kelipatan umum terendah (dari 1 dan argumen yang benar); memberi pembilang

÷ dibagi dengan

, Rangkaian (dari 1 dan argumen yang benar); memberi pembilang dan penyebut

Adám
sumber
2

Haskell , 52 byte

Ini menggunakan ekspansi seri OEIS:

import Data.Ratio
f 0=0%1
f n|p<-f$n-1=(p+n)/(1-n*p)

Cobalah online!

Atau versi pointfree:

(scanl1(\f n->(f+n)/(1-n*f))[0%1..]!!)
ბიმო
sumber
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]

Mengembalikan pasangan [pembilang, penyebut]. Penjelasan: Biarkan f(n-1) = a/bkemudian f(n) = atan(tan(n)+tan(a/b)) = (n+a/b)/(1-n*a/b) = (b*n+a)/(b-n*a). Kemudian tetap untuk mengurangi fraksi ke ketentuan terendah.

Lingkungan ES6 Online

Neil
sumber
1

05AB1E , 33 26 byte

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

Cobalah online!

Penjelasan

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
Emigna
sumber
1

Casio-Basic, 35 byte

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

tan -1 harus dimasukkan sebagai yang ada di keyboard Trig; atau -1 dapat dimasukkan secara terpisah dari abc> Keyboard matematika. Menurut manual fx-CP400, ini adalah karakter dua byte tunggal (764).

Fungsi, 34 byte untuk kode, +1 byte untuk ditambahkan ksebagai argumen.

Penjelasan

seq(tan-1(n),n,0,k)menghasilkan semua nilai tan-1(n)dari 0 hingga k.

summenambahkan mereka semua bersama-sama, lalu tanmelakukan fungsi tangen pada mereka.

tExpand kemudian akan mengubahnya menjadi fraksi tunggal.

numbermaniac
sumber
@ Adám Ini Casio, bukan TI, jadi tidak dilakukan dengan cara yang sama.
numbermaniac
Menurut Wikipedia , dan ¹masing-masing dua byte; E5CCdan E5C1.
Adm
@ Adam oh bagus, saya tidak menyadari bahwa artikel itu ada! Namun, ini adalah fx-CP400, bukan 9860G; Saya baru saja memeriksa manual, dan superscript -1 sebenarnya adalah karakter tunggal, kode 764; jadi itu adalah karakter dua byte tunggal.
numbermaniac
0

Julia 0.6.0 40 byte

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

Ini merupakan implementasi langsung dari pertanyaan. Ketepatan merasionalisasi kadang-kadang bisa aneh tetapi berfungsi dengan baik 99% dari waktu.

Goysa
sumber