求反正切之和的正切


16

背景

可以证明,对于任何整数k >= 0f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))都是有理数。

目标

编写一个完整的程序或函数,如果给定k >= 0f(k)则将其输出为单个减少的分数(分子和分母为互质数)。

测试用例

前几个值是

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)

规则

  • 禁止出现标准漏洞
  • 输入和输出可以采用任何方便的格式。您可以将其输出f(k)为字符串numerator/denominator,两个整数的元组,分数或有理对象等。如果输出字符串,则仅提供两个整数,即输出3/2而不是1 1/2
  • 这是代码高尔夫球,最短的答案(以字节为单位)获胜。

1
您能否在测试案例中进一步指定输入/输出值是什么?
伊恩H.17年

1
整数是度数还是弧度?
暴民埃里克(Erik the Outgolfer)'17年


4
atan(0)术语是不必要的。
2015年

3
@ pizzapants184 f(0)= tan∑∅ = tan 0 = 0
2015年

Answers:




11

Python 276 72个字节

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

使用身份:

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

我们有:

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

在线尝试!

感谢Luis Mendo,节省了4个字节。


1
希望您不要介意:我添加了TiO链接。
Xcoder先生17年

@LuisMendo LGTM,已编辑。
tsh

3

APL(Dyalog),14字节

要求⎕FR←1287128˚F loating点- [R epresentation)为小的输入。注意到k作为右边的参数。

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

在线尝试!

 整数1到k0(因为0 = arctan 0,所以不需要零)

¯3+.○ 反正切线之和

3○ 切线

1() 应用以下默认函数,其中1作为左参数,而上面的作为右参数:

 最小公倍数(1和正确的参数);给出分子

÷ 除以

, 串联(1和正确的参数);给出分子和分母



2

JavaScript(ES6),80个字节

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]

返回一个[分子,分母]对。说明:f(n-1) = a/b然后f(n) = atan(tan(n)+tan(a/b)) = (n+a/b)/(1-n*a/b) = (b*n+a)/(b-n*a)。然后,仍然需要将分数降低到最低水平。

在线ES6环境



1

05AB1E33 26字节

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

在线尝试!

说明

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个字节

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

tan -1应该作为Trig键盘上的数字输入;或-1可以与abc>数学键盘分开输入。根据fx-CP400的手册,它是一个两个字节的字符(764)。

功能,代码为34个字节,添加为+1个字节 k参数。

说明

seq(tan-1(n),n,0,k) 生成所有值 tan-1(n)从0到k的。

sum 将它们全部加在一起,然后 tan对它们执行切线功能。

tExpand 然后将它们变成单个分数。


@Adám这是Casio,不是TI,所以操作方式不同。
numbermaniac

根据Wikipedia所述并且¹每个都是两个字节;E5CCE5C1
亚当

@Adám哦,天哪,我没有意识到该文章存在!但是,这是fx-CP400,而不是9860G。我刚刚检查了手册,上标-1实际上是一个字符,代码764;所以这是一个两个字节的字符。
numbermaniac

0

朱莉娅0.6.0 40字节

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

这是问题的直接实现。合理化的准确性有时可能很奇怪,但在99%的时间中效果很好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.