อนุพันธ์ทางคณิตศาสตร์


34

อนุพันธ์ของฟังก์ชั่นคือรากฐานที่สำคัญของคณิตศาสตร์, วิศวกรรม, ฟิสิกส์, ชีววิทยา, เคมี, และวิทยาศาสตร์อื่น ๆ จำนวนมากเช่นกัน วันนี้เรากำลังจะคำนวณบางอย่างที่เกี่ยวข้องตามตัวอักษร: อนุพันธ์ทางคณิตศาสตร์

คำนิยาม

อนุพันธ์เลขคณิตa(n)หรือn'กำหนดไว้ที่นี่ ( A003415 ) ตามจำนวนคุณสมบัติที่คล้ายกับอนุพันธ์ของฟังก์ชัน

  • a(0) = a(1) = 0,
  • a(p) = 1ที่ไหนที่pมีความสำคัญและ
  • a(mn) = m*a(n) + n*a(m).

กฎข้อที่สามจะขึ้นอยู่กับกฎสินค้าสำหรับความแตกต่างของการทำงาน: การทำงานf(x)และ,g(x) ดังนั้นด้วยตัวเลข(fg)' = f'g + fg'(ab)' = a'b + ab'

นอกจากนี้ยังทราบเนื่องจากอนุพันธ์ทางคณิตศาสตร์สามารถขยายไปยังจำนวนลบผ่านความสัมพันธ์แบบง่าย ๆ นี้ได้a(-n) = -a(n)อินพุตอาจเป็นลบ

กฎระเบียบ

  • เขียนโปรแกรมหรือฟังก์ชั่นที่ได้รับจำนวนเต็มใด ๆกลับอนุพันธ์เลขคณิตของnn
  • อินพุตจะเพื่อหลีกเลี่ยงปัญหาเกี่ยวกับขนาดและจำนวนเต็มที่มากเกินไปที่จะคำนึงถึงในระยะเวลาที่เหมาะสม อัลกอริทึมของคุณยังควรสามารถคำนวณทางทฤษฎีอนุพันธ์ทางคณิตศาสตร์ของตัวเลขที่อยู่นอกช่วงนี้-230 < n < 230
  • บิวด์อินสำหรับคณิตศาสตร์เชิงสัญลักษณ์อนุญาตให้มีการแยกตัวประกอบเฉพาะและสร้างความแตกต่างได้

ตัวอย่าง

> a(1)
0
> a(7)
1
> a(14)   # a(7)*2 + a(2)*7 = 1*2 + 1*7 = 9
9
> a(-5)   # a(-5) = -a(5) = -1
-1
> a(8)    # a(8) = a(2**3) = 3*2**2 = 12
12
> a(225)  # a(225) = a(9)*25 + a(25)*9 = 6*25 + 10*9 = 150 + 90 = 240
240
> a(299792458)  # a(299792458) = a(2)*149896229 + a(7)*42827494 + a(73)*4106746 + a(293339)*1022 = 1*149896229 + 1*42827494 + 1*4106746 + 1*1022 = 149896229 + 42827494 + 4106746 + 1022 = 196831491
196831491

เช่นเคยหากปัญหายังไม่ชัดเจนโปรดแจ้งให้เราทราบ ขอให้โชคดีและกอล์ฟที่ดี!


สิ่งที่ว่าเป็นprimeในa(prime)? มันเป็นเพียงจำนวนเฉพาะหรือไม่
Stackstuck

นอกจากนี้ฉันไม่เข้าใจว่าคุณย่อยตัวอย่างล่าสุดได้อย่างไร
Stackstuck

@Stackstuck ใช่มันเป็นนายกใด ๆ ฉันแก้ไขเพื่อความชัดเจน นอกจากนี้ฉันเพิ่มตัวอย่างสุดท้ายเพื่อหวังให้ชัดเจนยิ่งขึ้น
Sherlock9

คำตอบ:


10

MATLขนาด 12 ไบต์

|1>?GtYf/s}0

ลองออนไลน์!

คำอธิบาย

พิจารณาจำนวนเต็มaด้วย | a |> 1 และปล่อยให้ปัจจัยสำคัญของ (| ซ้ำไปซ้ำมา) a | จะ1 , ... , n แล้วผลที่ต้องการคือ· (1 / F 1 + ... + 1 / F n )

|1>     % take input's absolute value. Is it greater than 1?
?       % if so:
  Gt    %   push input twice
  Yf    %   prime factors. For negative input uses its absolute value
  /     %   divide element-wise
  s     %   sum of the array
}       % else:
  0     %   push 0

ผลรวมของปัจจัยหลักของ 1 เท่ากับ 0 หรือไม่? หรือว่าใช้งานไม่ได้ใน MATL?
wythagoras

@wythagoras จริง ๆ แล้ว1ให้1เป็นการสลายตัวของจำนวน "นายก" ของมัน มันเป็นผลลัพธ์ที่แปลก (อาเรย์ที่ว่างจะมีความหมายมากกว่านี้) แต่นั่นเป็นวิธีที่ Matlab ทำงาน และ CJam ดังนั้นฉันคิดว่าจะต้องมีเหตุผลที่ดีในการส่งออก1ในกรณีที่? คุณคิดอย่างไร? ฉันถูกล่อลวงให้กำหนดYfฟังก์ชั่นใหม่เพื่อส่งออกอาเรย์ที่ว่างเปล่าสำหรับ1แต่ฉันไม่แน่ใจ
หลุยส์เมนโด

1
Pyth ให้อาร์เรย์ว่างเปล่า fwiw
isaacg

@isaacg ขอบคุณ! บางทีฉันจะเปลี่ยนสิ่งนั้น
Luis Mendo

เดียวกันใน Mathematica (เกือบจะเป็นปัญหาครั้งเดียว)
เครื่องคิดเลข

7

Python ขนาด 59 ไบต์

f=lambda n,p=2:+(n*n>1)and(n%p and f(n,p+1)or p*f(n/p)+n/p)

ฟังก์ชั่นวนซ้ำ ปัจจัยที่มีขนาดใหญ่จะทำงานออกจากความลึกสแต็คในระบบปกติเว้นแต่คุณจะใช้มันกับสิ่งที่ต้องการStackless Python

คำจำกัดความซ้ำจะดำเนินการโดยตรงนับถึงการค้นหาปัจจัยสำคัญของผู้สมัคร เนื่องจากf(prime)=1หากnมีนายกรัฐมนตรีเป็นปัจจัยที่เรามีpf(n) == p*f(n/p)+n/p


คุณไม่ต้องการอินพุตและพิมพ์ใช่ไหม อย่างน้อยเมื่อฉันเรียกใช้ (Python 2) ฉันไม่ได้รับผลลัพธ์
wythagoras

@wythagoras โดยค่าเริ่มต้นฟังก์ชั่นจะได้รับอนุญาตเป็นทางเลือกให้กับโปรแกรม นอกจากนี้ความท้าทายนี้ยังบอกว่า "โปรแกรมหรือฟังก์ชั่น"
xnor

7

เยลลี่, 8 7 ไบต์

-1 ไบต์โดย @Dennis

ÆfḟṠ³:S

ใช้สูตรเดียวกันกับที่ทุกคนทำ แต่มีเคล็ดลับเล็ก ๆ น้อย ๆ 0ที่จะจัดการกับ

o¬AÆfİS×     Main link. Inputs: n
o¬             Logical OR of n with its logical NOT
               That is, 0 goes to 1 and everything else goes to itself.
  A            Then take the absolute value
   Æf          get its list of prime factors
     İ         divide 1 by those
      S        sum
       ×       and multiply by the input.

ลองมันนี่


คุณช่วยเพิ่มคำอธิบายได้ไหม? ฉันชอบคำตอบที่จะมีคำอธิบายก่อนที่ฉันจะลงคะแนนพวกเขา
Sherlock9

@ Sherlock9 เรียบร้อยแล้ว
lirtosiast

ฉันเห็นว่าคำตอบของคุณถูกตีกอล์ฟแล้วและคำอธิบายนั้นล้าสมัยแล้ว คุณช่วยแก้ไขได้ไหม ขอบคุณ: D
Sherlock9

5

Python 2, 87 78 76 74 ไบต์

a=b=input()
d=2
s=0
while d<=abs(b):
    if a%d==0:
        a=a/d
        s+=b/d
    else:
        d+=1
print s

การปรับปรุงต้องขอบคุณ @Maltysen:

a=b=input()
d=2
s=0
while d<=abs(b):
    if a%d==0:a/=d;s+=b/d
    else:d+=1
print s

ปรับปรุงเพิ่มเติมโดยสองไบต์:

a=b=input()
d=2
s=0
while abs(a)>1:
    if a%d<1:a/=d;s+=b/d
    else:d+=1
print s

การปรับปรุงเพิ่มเติมด้วย @xnor:

a=b=input()
d=2
s=0
while a*a>1:
    if a%d<1:a/=d;s+=b/d
    else:d+=1
print s

คำอธิบาย

อนุพันธ์เลขคณิตของaมีค่าเท่ากับครั้งผลรวมของส่วนกลับของปัจจัยสำคัญของa aไม่จำเป็นต้องมีข้อยกเว้นสำหรับ 1 เนื่องจากผลรวมของส่วนกลับของปัจจัยหลักของ 1 คือศูนย์


abs(a)>1a*a>1สามารถ
xnor

@xnor ใช่ขอบคุณ
wythagoras

แทนที่บรรทัดที่ 2 ด้วยd,s = 2,0
Agnishom Chattopadhyay

@AgnishomChattopadhyay ทั้งสองมีขนาด 8 ไบต์
wythagoras

4

Haskell, 203 90 ไบต์

ขอบคุณ @nimi!

ฉันยังไม่รู้ว่าเมื่อไหร่ที่การเยื้องทำให้เกิดการตีความนี่คือระยะทางที่สั้นที่สุดที่ฉันสามารถจัดการได้และเช่นเคยฉันแน่ใจว่ามันสามารถเล่นกอล์ฟได้มากขึ้น ฉันจะลองอีกครั้งในตอนเย็น

n#(x:_)|y<-div n x=x*a y+y*a x;_#_=1
a n|n<0= -a(-n)|n<2=0|1<2=n#[i|i<-[2..n-1],mod n i<1]

1
ขอบคุณมากคุณครู =) ฉันสามารถเรียนรู้ได้เสมอเมื่อใดก็ตามที่คุณช่วยฉันที่นี่! อย่าลังเลที่จะเพิ่มเวอร์ชันของคุณเป็นคำตอบของคุณเอง!
ข้อผิดพลาด

4

J, 30 27 19 ตัวอักษร

ขอบคุณ@Dennis ที่ตัดออก 3 ตัวอักษร

ขอบคุณ@Zgarbสำหรับการตัดอักขระ 8 ตัว

0:`(*[:+/%@q:@|)@.*

ลองออนไลน์!

ตัวอย่างอินพุต:

0:`(*[:+/%@q:@|)@.* _8
_12

0:`(*[:+/%@q:@|)@.* 0
0

0:`(*[:+/%@q:@|)@.* 8
12

มันทำงานอย่างไร:

0:`(*[:+/%@q:@|)@.* N
XX`YYYYYYYYYYYYY@.Z   if Z then Y else X end
0:                        X:  return 0
                  Z       Z:  signum(N)
   (*[:+/%@q:@|)          Y:  N*add_all(reciprocal_all(all_prime_factors(abs(N))))
                              N
    *                          *
      [:+/                      add_all(                                         )
          %@                            reciprocal_all(                         )
            q:@                                       all_prime_factors(      )
               |                                                        abs( )
                                                                            N

3

Pyth - 10 8 ไบต์

Lovin 'อินพุตโดยปริยาย! ควรนำมาเทียบกับเยลลี่สำหรับสิ่งส่วนใหญ่ (ยกเว้นทักษะการเล่นกอล์ฟของเดนนิส)

*scL1P.a

Test Suite

*             Times the input, implicitly (This also adds the sign back in)
 s            Sum
  cL1         Reciprocal mapped over lit
   P          Prime factorization
    .a        Absolute value of input, implicitly

3

Haskell, 59 ไบต์

n%p|n*n<2=0|mod n p>0=n%(p+1)|r<-div n p=r+p*r%2
(%2)

การดำเนินการตามคำนิยาม recursive โดยตรงกับตัวแปรเสริมนับว่าขึ้นเพื่อค้นหาปัจจัยสำคัญที่อาจเกิดขึ้นเริ่มต้นจากp 2บรรทัดสุดท้ายคือฟังก์ชั่นหลักซึ่งเสียบp=2กับฟังก์ชั่นไบนารีที่กำหนดไว้ในบรรทัดแรก

ฟังก์ชั่นการตรวจสอบแต่ละกรณีในทางกลับกัน:

  • หากn*n<2แล้วnเป็นหนึ่งและผลที่ได้คือ-1,0,10
  • หากnไม่ใช่จำนวนทวีคูณpให้เพิ่มpและดำเนินการต่อ
  • มิฉะนั้นแสดงn=p*rและโดยคุณสมบัติ "อนุพันธ์" ผลลัพธ์คือr*a(p)+p*a(r)ซึ่งลดความซับซ้อนลงr+p*a(r)เนื่องจากpมีความสำคัญ

กรณีสุดท้ายที่จะช่วยประหยัดไบต์โดยมีผลผูกพันrในยามที่ยังหลีกเลี่ยงสำหรับสำเร็จรูป1>0 otherwiseหากrสามารถถูกผูกไว้ก่อนหน้านี้เงื่อนไขที่สองmod n p>0สามารถตรวจสอบได้r*p==nซึ่งสั้นกว่า 3 ไบต์ แต่ฉันไม่เห็นวิธีการทำ


3

อย่างจริงจัง , 17 14 11 12 ไบต์

คำตอบแรกของฉันอย่างจริงจัง คำตอบนี้ขึ้นอยู่กับคำตอบ MATL ของ Luis Mendoและความคิดที่ว่าอนุพันธ์ทางคณิตศาสตร์ของตัวเลขmนั้นเท่ากับว่าทุกปัจจัยสำคัญของการ multiplicity นอกจากนี้ฉันคือที่จะทราบว่าถ้าแล้ว ขอบคุณMegoสำหรับการเล่นกอล์ฟและแก้ไขข้อผิดพลาด ลองออนไลน์!m·(1/p1 + 1/p2 + ... + 1/pn)p1...pnnm = p1e1·p2e2·...·pnena(m) = m·(e1/p1 + e2/p2 + ... + en/pn)

,;w`i@/`MΣ*l

Ungolfing:

,             get a single input
 ;w           duplicate input and get prime factorization, p_f
               for input [-1..1], this returns [] and is dealt with at the end
   `   `M     map the function inside `` to p_f
    i         pop all elements of p_f[i], the prime and the exponent, to the stack
     @        rotate so that the exponent is at the top of the stack
      /       divide the exponent by the prime
         Σ    sum it all together
          *   multiply this sum with the input
           l  map and multiply do not affect an empty list, so we just take the length, 0
               l is a no-op for a number, so the result is unchanged for all other inputs

3

Japt -x , 16 13 10 ไบต์

ÒU©a k £/X

- 6 ไบต์ขอบคุณ @Shaggy

ลองออนไลน์!


ทั้งสองล้มเหลวในการลบตัวเลขเพราะด้วยเหตุผลบางอย่างN.k()ไม่ทำงานกับพวกเขา
ปุย

นี่คือการแก้ไขกับการเล่นกอล์ฟ
ปุย

หรือเพิ่มอีก 2 ไบต์ด้วย-xค่าสถานะ
ปุย


@Shaggy ขอบคุณที่ดี
Quintec

3

APL (Dyalog Extended) , 13 9 ไบต์

ทางออกที่ง่าย รุ่น Dyalog Unicode เป็นรุ่นที่ยาวกว่าดังนั้นจึงถูกตัดออก

แก้ไข:บันทึกไว้ 4 ไบต์โดยการนำวิธีการในการแก้ปัญหาของวุ้น lirtosiast

{+/⍵÷⍭|⍵}

ลองออนไลน์!

Ungolfing

{+/⍵÷⍭|⍵}

{        }  A dfn, a function in {} brackets.
     ⍭|⍵   The prime factors of the absolute value of our input.
   ⍵÷      Then divide our input by the above array,
            giving us a list of products for the product rule.
 +/         We sum the above numbers, giving us our arithmetic derivative.

2

Ruby, 87 66 80 75 70 68 ไบต์

คำตอบนี้ขึ้นอยู่กับคำตอบMATL ของLuis Mendo , คำตอบPython ของ wythagorasและความคิดที่ว่าอนุพันธ์ทางคณิตศาสตร์ของตัวเลขmนั้นเท่ากับว่าทุกปัจจัยสำคัญของการเป็นทวีคูณm·(1/p1 + 1/p2 + ... + 1/pn)p1...pnn

->n{s=0;(2...m=n.abs).map{|d|(m/=d;s+=n/d)while m%d<1};m<2?0:s+0**s}

ฟังก์ชันนี้ถูกเรียกด้วยวิธีดังต่อไปนี้:

> a=->n{s=0;(2...m=n.abs).map{|d|(m/=d;s+=n/d)while m%d<1};m<2?0:s+0**s}
> a[299792458]
196831491

Ungolfing:

def a(n)
  s = 0
  m = n.abs
  (2...m).each do |z|
    while m%d == 0
      m /= d
      s += n / d
    end
  end
  if s == 0
    if n > 1
      s += 1 # if s is 0, either n is prime and the while loop added nothing, so add 1
             # or n.abs < 2, so return 0 anyway
             # 0**s is used in the code because it returns 1 if s == 0 and 0 for all other s
    end
  end
  return s
end

2

Julia, 72 43 ไบต์

n->n^2>1?sum(p->n÷/(p...),factor(n^2))/2:0

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่รับจำนวนเต็มและส่งคืนค่าทศนิยม หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

สำหรับอินพุทจำนวนเต็มnหากn 2 ≤ 1 ส่งคืน 0 มิฉะนั้นรับการแยกตัวประกอบเฉพาะของn 2เป็น a Dictจากนั้นสำหรับคู่ไพรม์ / เลขชี้กำลังแต่ละคู่ให้หารนายกด้วยเลขชี้กำลังแล้วหารnด้วยผลลัพธ์ นี้เป็นเพียงการคำนวณn x / Pที่Pเป็นปัจจัยสำคัญและxเป็นตัวแทนของ บริษัท ซึ่งเป็นเช่นเดียวกับข้อสรุปn / P , xครั้ง เรารวมอาเรย์ที่เกิดขึ้นแล้วหารด้วย 2 เนื่องจากเราได้รวมผลรวมเป็นสองเท่าตามที่เราต้องการ นั่นเป็นเพราะความจริงที่ว่าเรากำลังแยกตัวประกอบn 2มากกว่าn (การทำเช่นนั้นคือไบต์ที่สั้นกว่าแฟ | n |.)

บันทึก 29 ไบต์ขอบคุณ Dennis!


1

Jolf, 13 ไบต์

*jmauΜm)jd/1H

ความรุ่งโรจน์ของคำตอบของ MATL สำหรับอัลกอริทึม ลองได้ที่นี่ , หรือทดสอบพวกเขาทั้งหมดในครั้งเดียว (เอาต์พุต [คีย์ออก]] ในอาร์เรย์)

คำอธิบาย

*jmauΜm)jd/1H
*j             input times
      m)j         p.f. of input
     Μ   d/1H      mapped to inverse
    u            sum of
  ma            abs of

1

Mathematica 10.0, 39 ไบต์

Tr[If[#>1,#2/#,0]&@@@FactorInteger@#]#&

1
คุณช่วยเพิ่มคำอธิบายได้ไหม? ฉันชอบคำตอบที่จะมีคำอธิบายก่อนที่ฉันจะ upvote พวกเขา
Sherlock9

1
@ Sherlock9 นี่เป็นคำตอบที่ไม่น่าสนใจนักดังนั้นฉันไม่ได้วางแผนที่จะเพิ่ม มันก็โอเคถ้าไม่มีใครโหวตได้
feersum

เอาล่ะแล้ว ขอให้มีความสุขในวันนี้ :)
Sherlock9

ในเวอร์ชัน Mathematica ปัจจุบันFactorInteger@1ให้ผล{1,1}ดังนั้นจึงIfไม่จำเป็นต้องใช้ฟังก์ชันอีกต่อไปจึงประหยัดได้ 10 ไบต์
Greg Martin

@GregMartin อย่างจริงจัง? นั่นไม่สอดคล้องกันมากไปกว่าค่าที่{{1,1}}ส่งคืนโดยเวอร์ชันของฉัน ( {}เป็นผลลัพธ์ที่คาดหวังสำหรับฉัน)
feersum

1

APL (NARS), 35 ถ่าน, 70 ไบต์

{1≥a←∣⍵:0⋄1=≢k←πa:×⍵⋄c+m×∇c←⍵÷m←↑k}

ทดสอบและวิธีใช้:

  f←{1≥a←∣⍵:0⋄1=≢k←πa:×⍵⋄c+m×∇c←⍵÷m←↑k}
  f 14
9
  f 8
12
  f 225
240
  f ¯5
¯1
  f 299792458
196831491

ฉันคิดว่ามันจะไม่โอเคเพราะฉันไม่รู้ว่า c ประกอบด้วยตัวแปร (และไม่ใช่เฉพาะ) ... แต่ดูเหมือนจะโอเคสำหรับการทดสอบ ...


1

05AB1E , 7 4 ไบต์

ÄÒ÷O

ท่าเรือ@lirtosiast 's คำตอบวุ้น

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Ä     # Take the absolute value of the (implicit) input
 Ò    # Get all its prime factors (with duplicates)
  ÷   # Integer divide the (implicit) input by each of these prime factors
   O  # And take the sum (which is output implicitly)

0

Perl 5, 62 ไบต์

perl -MMath::Prime::Util=:all -E"map$i+=1/$_,factor abs($j=<>);say$i*$j"

ใช้สูตร (จาก OEIS): If n = Product p_i^e_i, a(n) = n * Sum (e_i/p_i).


0

Perl 6, 90

sub A(\n) {0>n??-A(-n)!!(n>1)*{$_??n/$_*A($_)+$_*A n/$_!!1}(first n%%*,2..^n)};say A slurp

นี่อาจจะช้าหน่อยสำหรับคนจำนวนมาก แทนที่2..^nด้วย2..n.sqrtรหัสที่ยาวขึ้น แต่เร็วกว่าการคำนวณ


0

หมึก 183 ไบต์

==function a(n)
{n<0:
~return-a(-n)
}
{n<2:
~return 0
}
~temp f=t(n,2)
{f:
~return a(n/f)*f+n/f
}
~return 1
==function t(n,i)
{n>1&&n-i:
{n%i:
~return t(n,i+1)
}
~return i
}
~return 0

ลองออนไลน์!

ฉันปฏิเสธที่จะเชื่อว่านี่เป็นวิธีแก้ปัญหาที่ดี แต่ฉันไม่เห็นวิธีที่จะปรับปรุงมันเช่นกัน


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