Encontre a tangente da soma das tangentes inversas

16

fundo

Pode-se mostrar que, para qualquer número inteiro k >= 0, f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))é um número racional.

Objetivo

Escreva um programa ou função completa que, quando fornecida k >= 0, produz f(k)uma única fração reduzida (o numerador e o denominador são coprime).

Casos de teste

Os primeiros valores são

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)

Regras

  • As brechas padrão são proibidas.
  • A entrada e a saída podem estar em qualquer formato conveniente. Você pode produzir f(k)como uma string numerator/denominator, como uma tupla de dois inteiros, uma fração ou objeto racional, etc. Se você produzir uma string, forneça apenas dois inteiros, ou seja, em 3/2vez de 1 1/2.
  • Isso é código-golfe, a resposta mais curta (em bytes) vence.
Ethan Ward
fonte
1
Você pode especificar em seus casos de teste quais são os valores de entrada / saída?
Ian H.
1
Os números inteiros no intervalo são em graus ou radianos?
Erik the Outgolfer 08/08/19
1
OEIS: A180657
Sísifo
4
O atan(0)termo é desnecessário.
Adám 8/08/17
3
@ pizzapants184 f (0) = tan∑∅ = tan 0 = 0
Adám

Respostas:

4

M , 11 bytes

×C÷@+
R0;ç/

Experimente online!

Usa a fórmula OEIS x(n) = (x(n-1)+n)/(1-n*x(n-1))com x(0) = 0.

milhas
fonte
11

Mathematica, 28 bytes

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

Experimente online!

Uma abordagem mais longa, mas mais interessante (32 bytes):

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

Experimente online!

alefalpha
fonte
+1 o'_'oMathematica e seus built-inso'_'o
Sr. Xcoder 08/08/17
3
@ Mr.Xcoder Não é realmente neste caso. OP está usando o somatório de séries de maneira inteligente (se eu ler o código corretamente).
Adám 08/08/19
11

Python 2 ,76 72 bytes

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

Use a identidade:

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

Nós temos:

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

Experimente online!

Graças a Luis Mendo, economize 4 bytes.

tsh
fonte
1
Espero que você não se importe: eu adicionei um link TiO.
Mr. Xcoder
@LuisMendo LGTM, Editado.
tsh
3

APL (Dyalog) , 14 bytes

Requer ⎕FR←1287( 128 bits M ponto-loating R ePresentation) para entrada pequeno. Toma kcomo argumento certo.

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

Experimente online!

 números inteiros de um a kzero (zero não é necessário, pois 0 = arctan 0)

¯3+.○ soma das tangentes do arco

3○ tangente

1() Aplique a seguinte função tácita com 1 como argumento à esquerda e acima como argumento à direita:

 o menor múltiplo comum (de 1 e o argumento correto); dá ao numerador

÷ dividido por

, a concatenação (de 1 e o argumento correto); dá o numerador e o denominador

Adão
fonte
2

Haskell , 52 bytes

Isso usa a expansão da série OEIS:

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

Experimente online!

Ou uma versão sem pontos:

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

Retorna um par [numerador, denominador]. Explicação: Deixe f(n-1) = a/bentão f(n) = atan(tan(n)+tan(a/b)) = (n+a/b)/(1-n*a/b) = (b*n+a)/(b-n*a). Resta então reduzir a fração aos seus termos mais baixos.

Ambiente on-line ES6

Neil
fonte
1

05AB1E , 33 26 bytes

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

Experimente online!

Explicação

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

Casio-Basic, 35 bytes

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

tan -1 deve ser inserido como o do teclado Trig; ou o -1 pode ser inserido separadamente no teclado abc> Math. De acordo com o manual da fx-CP400, é um caractere único de dois bytes (764).

Função, 34 bytes para o código, +1 byte para adicionar kcomo argumento.

Explicação

seq(tan-1(n),n,0,k)gera todos os valores tan-1(n)de 0 a k.

sumos adiciona todos juntos e, em seguida tan, a função tangente neles.

tExpand irá transformá-los em uma única fração.

numbermaniac
fonte
@ Adám Este é Casio, não TI, então não é feito da mesma maneira.
numbermaniac
De acordo com Wikipedia , e ¹tem dois bytes cada; E5CCe E5C1.
Adám 8/08/17
@ Adám oh legal, eu não sabia que esse artigo existia! No entanto, este é um fx-CP400, não o 9860G; Acabei de verificar o manual, e o sobrescrito -1 é na verdade um único caractere, código 764; portanto, é um caractere único de dois bytes.
numbermaniac
0

Julia 0.6.0 40 bytes

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

É uma implementação direta da questão. Às vezes, a precisão da racionalização pode ser estranha, mas funciona bem 99% do tempo.

Goysa
fonte