逆正接の合計の正接を見つける


16

バックグラウンド

任意の整数に対してk >= 0f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))有理数であることを示すことができます。

ゴール

与えられたときに単一の簡約された分数としてk >= 0出力する完全なプログラムまたは関数を書きますf(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/denominator2つの整数のタプル、分数や合理的なオブジェクト、などあなたは、出力文字列は、唯一の2つの整数を与えると、として、出力3/2の代わりに1 1/2
  • これはコードゴルフで、最短の回答(バイト単位)が勝ちです。

1
テストケースで入力/出力値をさらに指定できますか?
イアンH.

1
整数の範囲は度またはラジアンですか?
エリックアウトゴルファー

1
OEIS:A180657
Sisyphus

4
このatan(0)用語は不要です。
アダム

3
@ pizzapants184 f(0)= tan∑∅ = tan 0 = 0
アダム

回答:



11

Mathematica、28バイト

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

オンラインでお試しください!

より長く、しかしより興味深いアプローチ(32バイト):

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

オンラインでお試しください!


+1 o'_'oMathematicaとその組み込みo'_'o
Mr. Xcoder

3
@ Mr.Xcoderこの場合はそうではありません。OPはシリーズの合計を巧みに使用しています(コードを正しく読んだ場合)。
アダム

11

Python 276 72バイト

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

IDを使用します。

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

オンラインでお試しください!

ルイスメンドーのおかげで、4バイト節約できます。


1
気にしないでください:TiOリンクを追加しました。
氏Xcoder

@LuisMendo LGTM、編集済み。
tsh

3

APL(Dyalog)、14バイト

必要⎕FR←1287128ビットF loating点Rの小さな入力用epresentation)。取りk右引数として。

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

オンラインでお試しください!

 整数1からk(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キーボードで入力する必要があります。または、abc> Mathキーボードとは別に-1を入力できます。fx-CP400のマニュアルによると、単一の2バイト文字(764)です。

関数、コード用の34バイトk、引数として追加する+1バイト。

説明

seq(tan-1(n),n,0,k)tan-1(n)0からkまでのすべての値を生成します。

sumそれらをすべて加算し、それらに対してtan接線関数を実行します。

tExpand その後、それらを単一の分数に変換します。


@AdámこれはTIではなくカシオであるため、同じ方法ではありません。
numbermaniac

ウィキペディアによると、¹それぞれ2バイトです。E5CCおよびE5C1
アダム

@Adámいいね、記事が存在することに気づかなかった!ただし、これはfx-CP400であり、9860Gではありません。マニュアルを確認したところ、上付き文字-1は実際には単一の文字、コード764です。単一の2バイト文字です。
numbermaniac

0

ジュリア0.6.0 40バイト

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

それは質問の簡単な実装です。合理化の精度は奇妙な場合もありますが、99%で正常に機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.