Znajdź styczną sumę odwrotnych stycznych

16

tło

Można wykazać, że dla dowolnej liczby całkowitej k >= 0, f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))jest liczbą wymierną.

Cel

Napisz kompletny program lub funkcję, która, jeśli zostanie podana k >= 0, wyprowadza f(k)jako pojedynczy ułamek zredukowany (licznik i mianownik są pierwszymi liczbami).

Przypadki testowe

Pierwsze kilka wartości to

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)

Zasady

  • Standardowe luki są zabronione.
  • Dane wejściowe i wyjściowe mogą być w dowolnym dogodnym formacie. Możesz wyprowadzać dane f(k)jako ciąg znaków numerator/denominator, jako krotkę dwóch liczb całkowitych, ułamek zwykły lub obiekt wymierny itp. Jeśli wyprowadzasz ciąg znaków, podaj tylko dwie liczby całkowite, to znaczy dane wyjściowe 3/2zamiast 1 1/2.
  • To jest golf golfowy, wygrywa najkrótsza odpowiedź (w bajtach).
Ethan Ward
źródło
1
Czy możesz dodatkowo określić w swoich testach, jakie są wartości wejściowe / wyjściowe?
Ian H.
1
Czy liczby całkowite w zakresie są w stopniach lub radianach?
Erik the Outgolfer
1
OEIS: A180657
Syzyf
4
atan(0)Określenie nie jest konieczne.
Adám
3
@ pizzapants184 f (0) = tan∑∅ = tan 0 = 0
Adám

Odpowiedzi:

11

Mathematica, 28 bajtów

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

Wypróbuj online!

Dłuższe, ale bardziej interesujące podejście (32 bajty):

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

Wypróbuj online!

alephalpha
źródło
+1 o'_'oMathematica i jej wbudowaneo'_'o
Mr. Xcoder
3
@ Mr.Xcoder Niezupełnie w tym przypadku. OP używa sprytnie sumowania serii (jeśli dobrze przeczytam kod).
Adám
11

Python 2 ,76 72 bajty

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

Użyj tożsamości:

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

Mamy:

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

Wypróbuj online!

Dzięki Luis Mendo zaoszczędź 4 bajty.

tsh
źródło
1
Mam nadzieję, że nie masz nic przeciwko: dodałem link TiO.
Pan Xcoder,
@LuisMendo LGTM, edytowany.
tsh
3

APL (Dyalog) , 14 bajtów

Wymaga ⎕FR←1287( 128- bitowej reprezentacji F punktu reprezentacji R ) dla małych danych wejściowych. Uważa się kza słuszny argument.

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

Wypróbuj online!

 liczby całkowite od jednego do drugiego k zera (zero nie jest potrzebne, ponieważ 0 = arctan 0)

¯3+.○ suma stycznych arcus

3○ tangens

1() Zastosuj następującą ukrytą funkcję z 1 jako lewym argumentem i powyższym jako prawym argumentem:

 najniższa wspólna wielokrotność (1 i odpowiedni argument); podaje licznik

÷ podzielony przez

, konkatenacja (1 i właściwego argumentu); podaje licznik i mianownik

Adám
źródło
2

Haskell , 52 bajty

Wykorzystuje to rozszerzenie serii OEIS:

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

Wypróbuj online!

Lub wersja bez punktów:

(scanl1(\f n->(f+n)/(1-n*f))[0%1..]!!)
ბიმო
źródło
2

JavaScript (ES6), 80 bajtów

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]

Zwraca parę [licznik, mianownik]. Objaśnienie: Niech f(n-1) = a/bwięc f(n) = atan(tan(n)+tan(a/b)) = (n+a/b)/(1-n*a/b) = (b*n+a)/(b-n*a). Następnie pozostaje zredukować ułamek do najniższych wartości.

Online ES6 Environment

Neil
źródło
1

05AB1E , 33 26 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
źródło
1

Casio-Basic, 35 bajtów

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

tan -1 należy wpisać jako ten na klawiaturze Trig; lub -1 można wprowadzić oddzielnie od klawiatury abc> Math. Zgodnie z instrukcją fx-CP400 jest to pojedynczy dwubajtowy znak (764).

Funkcja, 34 bajty na kod, +1 bajt do dodania kjako argument.

Wyjaśnienie

seq(tan-1(n),n,0,k)generuje wszystkie wartości tan-1(n)od 0 do k.

sumdodaje je wszystkie razem, a następnie tanwykonuje na nich funkcję styczną.

tExpand zamieni je następnie w jedną frakcję.

NumberManiac
źródło
@ Adám To jest Casio, a nie TI, więc nie jest zrobione w ten sam sposób.
numbermaniac
Według Wikipedii , i ¹są dwa bajty każda; E5CCa E5C1.
Adám,
@ Adám oh miło, nie zdawałem sobie sprawy, że ten artykuł istnieje! Jest to jednak FX-CP400, a nie 9860G; Właśnie sprawdziłem instrukcję, a indeks górny -1 to właściwie pojedynczy znak, kod 764; więc jest to dwubajtowy znak.
numbermaniac
0

Julia 0.6.0 40 bajtów

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

To prosta implementacja pytania. Precyzja racjonalizacji może czasem być dziwna, ale działa dobrze przez 99% czasu.

Goysa
źródło