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 cadenanumerator/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 en3/2lugar de1 1/2.
- Este es el código de golf, gana la respuesta más corta (en bytes).

atan(0)término es innecesario.Respuestas:
M , 11 bytes
Pruébalo en línea!
Utiliza la fórmula OEIS
x(n) = (x(n-1)+n)/(1-n*x(n-1))conx(0) = 0.fuente
Mathematica, 28 bytes
Pruébalo en línea!
Un enfoque más largo pero más interesante (32 bytes):
Pruébalo en línea!
fuente
o'_'oMathematica y sus incorporadoso'_'oPython 2 ,
7672 bytesUsa la identidad:
Tenemos:
Pruébalo en línea!
Gracias a Luis Mendo, ahorre 4 bytes.
fuente
APL (Dyalog) , 14 bytes
Requiere
⎕FR←1287( 128 bit F loating punto R ePresentation) para la pequeña entrada. Tomakcomo argumento correcto.Pruébalo en línea!
⍳enteros uno a travésk(cero no es necesario como 0 = arctan 0)¯3+.○suma de tangentes arcus3○tangente1(...)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 denominadorfuente
Haskell , 52 bytes
Esto utiliza la expansión de la serie OEIS:
Pruébalo en línea!
O una versión sin puntos:
fuente
JavaScript (ES6), 80 bytes
Devuelve un par [numerador, denominador]. Explicación: Let
f(n-1) = a/bentoncesf(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
fuente
Pari / GP , 36 bytes
Pruébalo en línea!
O la misma longitud:
Pruébalo en línea!
fuente
05AB1E ,
3326 bytesPruébalo en línea!
Explicación
fuente
Octava , 30 bytes
Pruébalo en línea!
fuente
Casio-Basic, 35 bytes
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 valorestan-1(n)de 0 a k.sumlos agrega todos juntos, luegotanrealiza la función tangente en ellos.tExpandluego los convertirá en una sola fracción.fuente
⁻y¹son dos bytes cada uno;E5CCyE5C1.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.
fuente