Ermitteln Sie den Tangens der Summe der inversen Tangenten

16

Hintergrund

Es kann , dass für jede ganze Zahl angezeigt k >= 0, f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))eine rationale Zahl ist.

Tor

Schreiben Sie ein komplettes Programm oder eine Funktion, die bei Angabe als einzelner reduzierter Bruch ausgegeben k >= 0wird f(k)(Zähler und Nenner sind Koprime).

Testfälle

Die ersten Werte sind

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)

Regeln

  • Standardlücken sind verboten.
  • Die Ein- und Ausgabe kann in jedem beliebigen Format erfolgen. Sie können f(k)als Zeichenfolge numerator/denominator, als Tupel aus zwei Ganzzahlen, als Bruch oder als rationales Objekt usw. ausgeben. Wenn Sie eine Zeichenfolge ausgeben, geben Sie nur zwei Ganzzahlen an, d. H. Ausgabe 3/2anstelle von 1 1/2.
  • Dies ist Code-Golf, die kürzeste Antwort (in Bytes) gewinnt.
Ethan Ward
quelle
1
Können Sie in Ihren Testfällen die Ein- / Ausgabewerte näher spezifizieren?
Ian H.
1
Sind die ganzen Zahlen im Bereich in Grad oder Bogenmaß?
Erik der Outgolfer
1
OEIS: A180657
Sisyphus
4
Der atan(0)Begriff ist unnötig.
Adám
3
@ pizzapants184 f (0) = tan∑∅ = tan 0 = 0
Adám

Antworten:

11

Mathematica, 28 Bytes

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

Probieren Sie es online!

Ein längerer, aber interessanterer Ansatz (32 Bytes):

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

Probieren Sie es online!

Alephalpha
quelle
+1 o'_'oMathematica und seine eingebauteno'_'o
Mr. Xcoder
3
@ Mr.Xcoder Nicht wirklich in diesem Fall. OP setzt die Reihensummierung geschickt ein (wenn ich den Code richtig lese).
Adám
11

Python 2 ,76 72 Bytes

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

Verwenden Sie die Identität:

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

Wir haben:

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

Probieren Sie es online!

Dank Luis Mendo sparen Sie 4 Bytes.

tsh
quelle
1
Ich hoffe, es macht Ihnen nichts aus: Ich habe einen TiO-Link hinzugefügt.
Mr. Xcoder
@ LuisMendo LGTM, bearbeitet.
Dienstag,
3

APL (Dyalog) , 14 Bytes

Erfordert ⎕FR←1287( 128 Bits F loating Punkt R ePresentation) für kleinen Eingang. Nimmt kals richtiges Argument.

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

Probieren Sie es online!

 ganze Zahlen von eins bis k(null wird nicht benötigt, da 0 = arctan 0)

¯3+.○ Summe der Arcustangenten

3○ Tangente

1() Wende die folgende implizite Funktion mit 1 als linkem Argument und der obigen als rechtem Argument an:

 das niedrigste gemeinsame Vielfache (von 1 und dem richtigen Argument); gibt den Zähler an

÷ geteilt durch

, die Verkettung (von 1 und dem richtigen Argument); gibt den Zähler und den Nenner an

Adam
quelle
2

Haskell , 52 Bytes

Dies verwendet die Erweiterung der OEIS-Serie:

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

Probieren Sie es online!

Oder eine pointfree Version:

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

Gibt ein Paar [Zähler, Nenner] zurück. Erklärung: f(n-1) = a/bDann lass f(n) = atan(tan(n)+tan(a/b)) = (n+a/b)/(1-n*a/b) = (b*n+a)/(b-n*a). Es bleibt dann, den Bruchteil auf den niedrigsten Stand zu bringen.

Online ES6-Umgebung

Neil
quelle
1

05AB1E , 33 26 Bytes

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

Probieren Sie es online!

Erläuterung

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
quelle
1

Casio-Basic, 35 Bytes

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

tan -1 sollte als das auf der Trig-Tastatur eingegeben werden; oder -1 kann getrennt von der Tastatur abc> Math eingegeben werden. Gemäß dem Handbuch des fx-CP400 handelt es sich um ein einzelnes Zwei-Byte-Zeichen (764).

Funktion, 34 Byte für den Code, +1 Byte zum Hinzufügen kals Argument.

Erläuterung

seq(tan-1(n),n,0,k)generiert alle Werte tan-1(n)von 0 bis k.

sumFügt sie alle zusammen und tanübernimmt dann die Tangensfunktion für sie.

tExpand wird sie dann in eine einzige Fraktion verwandeln.

numbermaniac
quelle
@ Adám Das ist Casio, nicht TI, also geht es nicht genauso.
Numbermaniac
Laut Wikipedia , und ¹sind jeweils zwei Bytes; E5CCund E5C1.
Adám
@Adam oh schön, ich wusste nicht, dass dieser Artikel existiert! Dies ist jedoch ein FX-CP400, nicht der 9860G; Ich habe gerade das Handbuch durchgesehen, und das hochgestellte -1 ist tatsächlich ein einzelnes Zeichen, Code 764; Es ist also ein einzelnes Zwei-Byte-Zeichen.
Numbermaniac
0

Julia 0.6.0 40 Bytes

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

Es ist eine einfache Implementierung der Frage. Die Präzision des Rationalisierens kann manchmal komisch sein, funktioniert aber in 99% der Fälle einwandfrei.

Goysa
quelle