⍝ M a t h e m a t i c a l d e f i n i t i o n s ← ∆() ⍝ derivative wrt ⍵ sin(1∘○) cos(2∘○) tan(3∘○) ⍝ sin, cos, tan ln(⍟) exp(*) ⍝ natural log, exp -(-) ⍝ neg (unary minus) → ∧(*) ⍝ pow ← *(×) /(÷) ⍝ mul div ← +(+) -(-) ⍝ add sub ← =() ≡() ⍝ reduction equivalence ← ,() ⍝ argument separator ⍝ R e d u c t i o n R u l e s ⍝ Pattern matching variables See →notes.Expression_simplification← i j k :: ← 0 → ⍝ literal numbers. ¯i ¯j ¯k :: ← ⍝ negative literal numbers. x y z :: ∊ ⍺ ⍝ non-simple expressions or variables. a b c :: ⍺ ⍝ var names for differentiation. p q r :: ⍝ any values. ⍝ Add / Sub i+x = x+i ⍝ move constant to right. x+0 = x x-0 = x 0-x = -x x-x = 0 -x+y = y-x x+-y = x-y -(x-y) = y-x -x-y = -(x+y) --y = y x--y = x+y x+¯j = x--¯j ⍝ reclaim negative literal. ¯i+y = y--¯i x-¯j = x+-¯j (x+i)+j = x+(i+j) ⍝ + associative: collect literals. (x-i)-j = x-(i+j) (x+i)-j = x+(i-j) (x-i)+j = x-(i-j) (i-x)+j = i+j-x (i-x)-j = i-j-x i-(x+j) = i-j-x i-(x-j) = i+j-x i-(j-x) = i-j+x (x+i)+y = x+y+i (x+i)-y = x-y+i (x-i)+y = x+y-i (x-i)-y = x-y-i (i-x)+y = y-x+i (i-x)-y = -x-y+i x-(y+i) = x-y-i x-(y-i) = x-y+i x-(i-y) = x+y-i x+(y+i) = x+y+i x+(y-i) = x+y-i x+(i-y) = x-y+i ⍝ Mul / Div x*i = i*x ⍝ move constant to left. 0*x = 0 1*x = x ¯1*x = -x 0/x = 0 x/x = 1 x/1 = x -x*y = -(x*y) x*-y = -(x*y) -(i*x) = -i*x i*-x = -i*x i*(j*x) = (i*j)*x i*(j/x) = (i*j)/x i/(j*x) = (i/j)/x i/(j/x) = (i/j)*x i*(x/j) = (i/j)*x i/(x/j) = (i*j)/x (i/x)/j = (i/j)/x (i*x)/j = (i/j)*x (x/i)/j = x/(i*j) x*(i*y) = i*(x*y) x*(i/y) = i*(x/y) x/(i*y) = (x/y)/i x/(i/y) = (x*y)/i x*(y/i) = (x*y)/i x/(y/i) = i*(x/y) (i*x)*y = i*(x*y) (i*x)/y = i*(x/y) (i/x)*y = i*(y/x) (i/x)/y = i/(x*y) (x/i)/y = (x/y)/i (x/i)*y = (x*y)/i ⍝ Power x∧0 = 1 x∧1 = x x*x = x∧2 x∧p*x = x∧(p+1) x*x∧p = x∧(p+1) x/x∧p = x∧(1-p) x∧p/x = x∧(p-1) (x∧p)∧q = x∧(p*q) x∧p/x∧q = x∧(p-q) (p∧q)*(p∧r) = p∧(q+r) (p∧q)/(p∧r) = p∧(q-r) x*y/y∧i = x/y∧(i-1) p/q∧-r = p*q∧r p*q∧-r = p/q∧r p/q∧¯i = p*q∧-¯i ⍝ reclaim literal -ive. p*q∧¯i = p/q∧-¯i ⍝ Factoring / distribution p+p = 2*p (p*q)+q = (p+1)*q p+(q*p) = (q+1)*p (p*q)-q = (p-1)*q p-(q*p) = (1-q)*p (p*q)+(p*r) = p*(q+r) (p*r)+(q*r) = (p+q)*r (p*q)-(p*r) = p*(q-r) (q*r)-(q*r) = (p-q)*r (p/r)+(q/r) = (p+q)/r (p/r)-(q/r) = (p-q)/r ⍝ Collect common terms p+q+p = q+2*p ⍝ add/sub q+p+p = q+2*p p+(p+q) = 2*p+q p+(q+p) = 2*p+q p+q-p = q q+p-p = q p+(p-q) = 2*p-q p+(q-p) = q p-q+p = 2*p-q q-p+p = q p-(p+q) = -q p-(q+p) = -q p-q-p = -q q-p-p = q-2*p p-(p-q) = q p-(q-p) = 2*p-q p*q*p = q*p∧2 ⍝ mul/div q*p*p = q*p∧2 p*(p*q) = q*p∧2 p*(q*p) = q*p∧2 p*q/p = q q*p/p = q p*(p/q) = q*p∧2 p*(q/p) = q p/q*p = p∧2/q q/p*p = q p/(p*q) = 1/q p/(q*p) = 1/q p/q/p = 1/q q/p/p = q/p∧2 p/(p/q) = q p/(q/p) = p∧2/q ⍝ Cosmetics: remove redundant ()s p+(q+r) = p+q+r ⍝ + associative x*(q*r) = x*q*r ⍝ * associative ⍝ Trig cos(q)*sin(p) = sin(p)*cos(q) ⍝ allows sin*cos - cos*sin => 0 sin(x)/cos(x) = tan(x) ⍝ D i f f e r e n t i a t i o n See →notes.Differentiation← ⍝ Base Cases (i)∆a = 0 (a)∆a = 1 ⍝ Arithmetic (p+q)∆a = p∆a + q∆a (p-q)∆a = p∆a - q∆a (-p)∆a = -p∆a (p*q)∆a = p∆a * q + p * q∆a (p/q)∆a = p∆a / q - p * q∆a / q∧2 (p∧q)∆a = p∆a * q * p∧(q-1) + q∆a * (ln p) * p∧q ⍝ Log / Exp (ln p)∆a = p∆a / p (exp p)∆a = p∆a * (exp p) ⍝ Trig (sin p)∆a = p∆a * (cos p) (cos p)∆a = -p∆a * (sin p) (tan p)∆a = p∆a * 1/(cos p)∧2 ⍝ Test cases: ⍝ ⍝ 1+x+2 -> x+3 ⍝ collect constants ⍝ -----x -> -x ⍝ 1+x+y+z+x+y+z+2 -> x+y+z+x+y+z+3 ⍝ (not optimal, ⍝ 2*x*y*z*x*y*z*3 -> 6*(x*y*z*x*y*z) ⍝ see notes.Bugs) ⍝ x∧x+y*x∧x -> (y+1)*x∧x ⍝ x+x+x+x*x*x -> 3*x+x∧3 ⍝ 2*x + x*3 -> 5*x ⍝ x∧2 * x∧3 -> x∧5 ⍝ (x∧y)∧z -> x∧(y*z) ⍝ (x+3-x)+(x*4/x) -> 7 ⍝ x+y+z, x=y+y, y=z+z, z=3 -> 21 ⍝ (2∧x+x∧2)∆x -> 0.69315*2∧x+2*x ⍝ (ln(x∧x))∆x, x=2 -> 1+⍟2 ⍝ (4*x∧3 + 3*x∧2 + 2*x∧1 + 1*x∧0)∆x -> 12*x∧2+6*x+2 ⍝ sin(x)∧2 + cos(x)∧2, x=42 -> 1 ⍝ (sin(x)∧2 + cos(x)∧2)∆x -> 0 ⍝ 1st differential ⍝ (ln x)∆x∆x -> -1/x∧2 ⍝ 2nd .. ⍝ (ln x)∆x∆x∆x -> 2/x∧3 ⍝ 3rd .. ⍝ (ln x)∆x∆x∆x∆x∆x, x=1 -> 24 ⍝ 5th .. ⍝ (ln x)∆x∆x∆x∆x∆x∆x -> -120/x∧6 ⍝ 6th .. ⍝ ln exp ln exp 99 -> 99 ⍝ (x/exp(x))∆x -> (1-x)/exp(x) ⍝ x+-3 -> x-3 ⍝ x/y∧-2 -> x*y∧2 ⍝ 2∆3 -> 2∆3 ⍝ a+(b+(c+d)) -> a+b+c+d ⍝ + associative ⍝ a*(b*(c*d)) -> a*b*c*d ⍝ * associative ⍝ ⍝ Back to: Contents