Фон
Можно показать , что для любого целого числа 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
. - Это код-гольф, самый короткий ответ (в байтах) выигрывает.
atan(0)
Срок не является необходимым.Ответы:
М , 11 байт
Попробуйте онлайн!
Использует формулу OEIS
x(n) = (x(n-1)+n)/(1-n*x(n-1))
сx(0) = 0
.источник
Mathematica, 28 байт
Попробуйте онлайн!
Более длинный, но более интересный подход (32 байта):
Попробуйте онлайн!
источник
o'_'o
Mathematica и его встроенные модулиo'_'o
Python 2 ,
7672 байтаИспользуйте личность:
У нас есть:
Попробуйте онлайн!
Благодаря Луису Мендо, сэкономьте 4 байта.
источник
APL (Dyalog) , 14 байтов
Требуется
⎕FR←1287
( 128- битная F -точка позиционирования R ) для небольшого ввода. Принимает вk
качестве правильного аргумента.Попробуйте онлайн!
⍳
целые числа от одного доk
нуля (ноль не требуется, так как 0 = arctan 0)¯3+.○
сумма арктических касательных3○
касательный1(
…)
Применить следующую молчаливую функцию с 1 в качестве левого аргумента и выше, как правый аргумент:∧
наименьший общий множитель (1 и правильный аргумент); дает числитель÷
деленное на,
конкатенация (из 1 и правильный аргумент); дает числитель и знаменательисточник
Haskell , 52 байта
Это использует расширение серии OEIS:
Попробуйте онлайн!
Или точечная версия:
источник
JavaScript (ES6), 80 байт
Возвращает пару [числитель, знаменатель]. Пояснение: давай
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
источник
Пари / ГП , 36 байт
Попробуйте онлайн!
Или той же длины:
Попробуйте онлайн!
источник
05AB1E ,
3326 байтПопробуйте онлайн!
объяснение
источник
Октава , 30 байт
Попробуйте онлайн!
источник
Casio-Basic, 35 байт
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
затем превратит их в одну дробь.источник
⁻
и¹
два байта каждый;E5CC
иE5C1
.Юлия 0.6.0 40 байт
k->rationalize(tan(sum(x->atan(x),1:k)))
Это прямая реализация вопроса. Точность рационализации иногда может быть странной, но работает хорошо в 99% случаев.
источник