Trova la tangente della somma delle tangenti inverse


16

sfondo

Si può dimostrare che per ogni intero k >= 0, f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))è un numero razionale.

Obbiettivo

Scrivere un programma o una funzione completi che, se forniti k >= 0, vengono visualizzati f(k)come un'unica frazione ridotta (il numeratore e il denominatore sono coprimi).

Casi test

I primi valori sono

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)

Regole

  • Sono vietate le scappatoie standard .
  • L'input e l'output possono essere in qualsiasi formato conveniente. Puoi generare f(k)come stringa numerator/denominator, come una tupla di due numeri interi, una frazione o un oggetto razionale, ecc. Se produci una stringa, dai solo due numeri interi, ovvero output 3/2invece di 1 1/2.
  • Questo è code-golf, vince la risposta più breve (in byte).

1
Potete specificare ulteriormente nei vostri casi di test quali sono i valori di input / output?
Ian H.

1
Gli interi sono compresi nell'intervallo in gradi o radianti?
Erik the Outgolfer

1
OEIS: A180657
Sisifo

4
Il atan(0)termine non è necessario.
Adám,

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

Risposte:



11

Mathematica, 28 byte

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

Provalo online!

Un approccio più lungo, ma più interessante (32 byte):

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

Provalo online!


+1 o'_'oMathematica e i suoi incorporatio'_'o
Mr. Xcoder

3
@ Mr.Xcoder Non proprio in questo caso. OP sta usando abilmente la somma delle serie (se leggo bene il codice).
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)))

Usa l'identità:

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

Abbiamo:

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

Provalo online!

Grazie a Luis Mendo, risparmia 4 byte.


1
Spero non ti dispiaccia: ho aggiunto un link TiO.
Mr. Xcoder,

@LuisMendo LGTM, a cura di.
TSH

3

APL (Dyalog) , 14 byte

Richiede ⎕FR←1287( 128 bit F loating punto R ePresentation) per piccole ingresso. Prende kcome argomento giusto.

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

Provalo online!

 numeri interi da uno a kzero (zero non è necessario come 0 = arctan 0)

¯3+.○ somma delle tangenti dell'arco

3○ tangente

1(... ) applica la seguente funzione tacita con 1 come argomento di sinistra e quanto sopra come argomento di destra:

 il minimo comune multiplo (di 1 e l'argomento giusto); dà il numeratore

÷ diviso per

, la concatenazione (di 1 e l'argomento giusto); dà il numeratore e il denominatore


2

Haskell , 52 byte

Questo utilizza l'espansione della serie OEIS:

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

Provalo online!

O una versione senza punti:

(scanl1(\f n->(f+n)/(1-n*f))[0%1..]!!)

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]

Restituisce una coppia [numeratore, denominatore]. Spiegazione: Let f(n-1) = a/bthenf(n) = atan(tan(n)+tan(a/b)) = (n+a/b)/(1-n*a/b) = (b*n+a)/(b-n*a) . Resta quindi da ridurre la frazione ai termini più bassi.

Ambiente ES6 online



1

05AB1E , 33 26 byte

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

Provalo online!

Spiegazione

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 deve essere inserito come quello sulla tastiera Trig; o il -1 può essere inserito separatamente dalla tastiera abc> Math. Secondo il manuale di fx-CP400, è un singolo carattere a due byte (764).

Funzione, 34 byte per il codice, +1 byte da aggiungere k come argomento.

Spiegazione

seq(tan-1(n),n,0,k) genera tutti i valori per tan-1(n) da 0 a k.

sum li somma tutti insieme, quindi tan esegue la funzione tangente su di essi.

tExpand li trasformerà quindi in un'unica frazione.


@Adám Questo è Casio, non TI, quindi non è fatto allo stesso modo.
numbermaniac

Secondo Wikipedia , e ¹sono due byte ciascuno; E5CCe E5C1.
Adám,

@ Adám oh bello, non mi ero reso conto che esistesse l'articolo! Tuttavia, questo è un FX-CP400, non il 9860G; Ho appena controllato il manuale e l'apice -1 è in realtà un singolo carattere, codice 764; quindi è un singolo carattere a due byte.
numbermaniac

0

Julia 0.6.0 40 byte

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

È una semplice implementazione della domanda. La precisione della razionalizzazione a volte può essere strana ma funziona bene il 99% delle volte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.