ค้นหาแทนเจนต์ของผลรวมของแทนเจนต์ผกผัน


16

พื้นหลัง

ก็สามารถที่จะแสดงให้เห็นว่าสำหรับจำนวนเต็มใด ๆk >= 0, f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))เป็นจำนวนจริง

เป้าหมาย

เขียนโปรแกรมหรือฟังก์ชั่นที่สมบูรณ์ซึ่งเมื่อได้รับk >= 0ผลลัพธ์จะf(k)เป็นส่วนที่ลดลงเพียงครั้งเดียว (ตัวเศษและส่วนคือ coprime)

กรณีทดสอบ

ค่าแรก ๆ คือ

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/21 1/2
  • นี่คือ code-golf คำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

1
คุณสามารถระบุเพิ่มเติมในกรณีทดสอบของคุณว่าค่าอินพุต / เอาต์พุตเป็นอย่างไร
เอียนเอช

1
จำนวนเต็มในช่วงเป็นองศาหรือเรเดียนหรือไม่
Erik the Outgolfer

1
OEIS: A180657
Sisyphus

4
atan(0)ระยะที่ไม่จำเป็น
อดัม

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

คำตอบ:



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

งูหลาม 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

ลองออนไลน์!

ขอบคุณ Luis Mendo, บันทึก 4 ไบต์


1
หวังว่าคุณจะไม่รังเกียจ: ฉันเพิ่มลิงค์ TiO
Mr. Xcoder

@LuisMendo LGTM ถูกแก้ไข
tsh

3

APL (Dyalog)ขนาด 14 ไบต์

ต้องใช้⎕FR←1287( 128บิตFกระแสน้ำจุดR epresentation) สำหรับการป้อนข้อมูลที่มีขนาดเล็ก ใช้kเป็นอาร์กิวเมนต์ที่ถูกต้อง

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

ลองออนไลน์!

 จำนวนเต็มหนึ่งถึงk(ไม่จำเป็นต้องมีศูนย์เท่ากับ 0 = arctan 0)

¯3+.○ ผลรวมของ arcus tangents

3○ สัมผัสกัน

1() ใช้ฟังก์ชัน tacit ต่อไปนี้โดยที่ 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 keyboard ตามคู่มือของ 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

@ Adámโอ้ดีฉันไม่ได้ตระหนักถึงบทความที่มีอยู่! อย่างไรก็ตามนี่คือ fx-CP400 ไม่ใช่ 9860G ฉันเพิ่งตรวจสอบคู่มือและตัวยก -1 เป็นจริงอักขระเดียวรหัส 764; ดังนั้นมันจึงเป็นอักขระสองไบต์เดียว
numbermaniac

0

Julia 0.6.0 40 ไบต์

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

เป็นการใช้คำถามที่ตรงไปตรงมา ความแม่นยำของการหาเหตุผลเข้าข้างตนเองบางครั้งอาจแปลก แต่ใช้งานได้ดี 99% ของเวลา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.