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/2
lugar 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'_'o
Mathematica y sus incorporadoso'_'o
Python 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. Tomak
como 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/b
entoncesf(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
k
como argumento.Explicación
seq(tan-1(n),n,0,k)
genera todos los valorestan-1(n)
de 0 a k.sum
los agrega todos juntos, luegotan
realiza la función tangente en ellos.tExpand
luego los convertirá en una sola fracción.fuente
⁻
y¹
son dos bytes cada uno;E5CC
yE5C1
.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