Знайдіть дотичну до суми обернених дотичних


16

Фон

Можна показати , що для будь-якого цілого числа k >= 0, f(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/denominator, як кордону з двох цілих чисел, дробу або раціонального об'єкта і т. Д. Якщо виводите рядок, дайте лише два цілі числа, тобто виведіть 3/2замість1 1/2 .
  • Це кодовий гольф, найкоротша відповідь (у байтах) виграє.

1
Чи можете ви додатково вказати у своїх тестових випадках, що таке значення введення / виводу?
Ян Х.

1
Чи цілі числа в діапазоні в градусах чи радіанах?
Erik the Outgolfer

1
OEIS: A180657
Сізіф

4
atan(0)Термін НЕ є необхідним.
Adám

3
@ pizzapants184 f (0) = tan∑∅ = tan 0 = 0
Adám

Відповіді:



11

Математика, 28 байт

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

Спробуйте в Інтернеті!

Більш тривалий, але цікавіший підхід (32 байти):

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

Спробуйте в Інтернеті!


+1 o'_'oMathematica та його вбудовані пристроїo'_'o
містер Xcoder

3
@ Mr.Xcoder Не дуже в цьому випадку. ОП спритно використовує підсумовування серій (якщо я правильно прочитав код).
Adám

11

Пітон 2 ,76 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

Спробуйте в Інтернеті!

Завдяки Луїсу Мендо збережіть 4 байти.


1
Сподіваюся, ви не заперечуєте: я додав посилання TiO.
Містер Xcoder

@LuisMendo LGTM, Відредаговано.
tsh

3

APL (Dyalog) , 14 байт

Потрібно ⎕FR←1287( 128 біт F loating точка R epresentation) для малого входу. Вважається kправильним аргументом.

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

Спробуйте в Інтернеті!

 цілі числа один на один k(нуль не потрібно, оскільки 0 = арктан 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

05AB1E , 33 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> Math. Відповідно до посібника 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

За даними Вікіпедії , і ¹є два байти кожен; E5CCі E5C1.
Адам

@ Adám о приємно, я не розумів, що стаття існує! Однак це fx-CP400, а не 9860G; Я щойно перевірив посібник, і суперскрипт -1 - це фактично один символ, код 764; тож це єдиний двобайтовий символ.
numbermaniac

0

Джулія 0.6.0 40 байт

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

Це прямо реалізація питання. Точність раціоналізації іноді може бути дивною, але спрацьовує 99% часу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.