Encuentre la tangente de la suma de tangentes inversas


16

Antecedentes

Se puede demostrar que para cualquier número entero k >= 0, f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))es un número racional.

Objetivo

Escriba un programa o función completa que, cuando se proporciona k >= 0, se genera f(k)como una fracción reducida única (el numerador y el denominador son coprimos).

Casos de prueba

Los primeros pocos valores son

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)

Reglas

  • Las lagunas estándar están prohibidas.
  • La entrada y salida pueden estar en cualquier formato conveniente. Puede generar f(k)una cadena numerator/denominator, como una tupla de dos enteros, una fracción u objeto racional, etc. Si genera una cadena, dé solo dos enteros, es decir, la salida en 3/2lugar de 1 1/2.
  • Este es el código de golf, gana la respuesta más corta (en bytes).

1
¿Puede especificar más en sus casos de prueba cuáles son los valores de entrada / salida?
Ian H.

1
¿Están los enteros en el rango en grados o radianes?
Erik the Outgolfer

1
OEIS: A180657
Sísifo

44
El atan(0)término es innecesario.
Adám

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

Respuestas:



11

Mathematica, 28 bytes

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

Pruébalo en línea!

Un enfoque más largo pero más interesante (32 bytes):

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

Pruébalo en línea!


+1 o'_'oMathematica y sus incorporadoso'_'o
Sr. Xcoder

3
@ Mr.Xcoder No realmente en este caso. OP está utilizando la suma de series de manera inteligente (si leo el código correctamente).
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)))

Usa la identidad:

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

Tenemos:

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

Pruébalo en línea!

Gracias a Luis Mendo, ahorre 4 bytes.


1
Espero que no te importe: agregué un enlace de TiO.
Sr. Xcoder

@LuisMendo LGTM, Editado.
tsh

3

APL (Dyalog) , 14 bytes

Requiere ⎕FR←1287( 128 bit F loating punto R ePresentation) para la pequeña entrada. Toma kcomo argumento correcto.

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

Pruébalo en línea!

 enteros uno a través k(cero no es necesario como 0 = arctan 0)

¯3+.○ suma de tangentes arcus

3○ tangente

1(... ) aplique la siguiente función tácita con 1 como argumento izquierdo y lo anterior como argumento derecho:

 el múltiplo común más bajo (de 1 y el argumento correcto); da el numerador

÷ dividido por

, la concatenación (de 1 y el argumento correcto); da el numerador y el denominador



2

JavaScript (ES6), 80 bytes

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]

Devuelve un par [numerador, denominador]. Explicación: Let f(n-1) = a/bentonces f(n) = atan(tan(n)+tan(a/b)) = (n+a/b)/(1-n*a/b) = (b*n+a)/(b-n*a). Luego queda reducir la fracción a sus términos más bajos.

Entorno ES6 en línea



1

05AB1E , 33 26 bytes

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

Pruébalo en línea!

Explicación

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 bytes

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

tan -1 debe ingresarse como el del teclado Trig; o -1 puede ingresarse por separado desde el teclado abc> Math. Según el manual del fx-CP400, es un solo carácter de dos bytes (764).

Función, 34 bytes para el código, +1 byte para agregar kcomo argumento.

Explicación

seq(tan-1(n),n,0,k)genera todos los valores tan-1(n)de 0 a k.

sumlos agrega todos juntos, luego tanrealiza la función tangente en ellos.

tExpand luego los convertirá en una sola fracción.


@ Adám Este es Casio, no TI, por lo que no se hace de la misma manera.
numbermaniac

Según Wikipedia , y ¹son dos bytes cada uno; E5CCy E5C1.
Adám

@ Adám ¡qué bien, no me di cuenta de que ese artículo existía! Sin embargo, este es un fx-CP400, no el 9860G; Acabo de consultar el manual, y el superíndice -1 es en realidad un solo carácter, código 764; entonces es un solo carácter de dos bytes.
numbermaniac

0

Julia 0.6.0 40 bytes

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

Es una implementación directa de la pregunta. La precisión de racionalizar a veces puede ser extraña, pero funciona bien el 99% del tiempo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.