def prove(Eq): n = 5 a = Symbol.a(shape=(n, ), complex=True, zero=False) b = Symbol.b(shape=(n, ), complex=True, zero=False) Eq << apply(a, b) Eq << Symbol.L(shape=(n, n), definition=Eq[0].lhs.arg).this.definition Eq << Eq[-1].this.rhs.as_Matrix() Eq << Eq[-1] @ Multiplication(n, 0, 1 / a[0]) Eq << Eq[-1] @ Multiplication(n, n - 1, 1 / b[n - 1]) Eq << Eq[-1] @ Multiplication(n, n - 2, 1 / b[n - 2]) Eq << Multiplication(n, n - 1, b[n - 2]) @ Eq[-1] Eq << Eq[-1].det() Eq << Eq[-1].subs(Eq[1]) Eq << Eq[-1].subs(Eq[0]) Eq << Eq[-1].this.lhs.doit() Eq << Eq[-1].this.lhs.expand()
def prove(Eq): n = 6 A = Symbol.A(shape=(n, n), complex=True) Eq << apply(A) Eq << Symbol.L(shape=(n, n), definition=Eq[0].lhs.arg).this.definition shift = Eq[-1].rhs.function.args[0].base Eq.L_definition = Eq[-1].this.rhs.doit() Eq << (shift @ A).this.expand() Eq << Eq[-1].this.rhs.doit() Eq << shift @ Eq[-1] Eq << shift @ Eq[-1] Eq << shift @ Eq[-1] Eq << shift @ Eq[-1] Eq << Eq[-1] + Eq[-2] + Eq[-3] + Eq[-4] + Eq[-5] Eq << Eq.L_definition.subs(Eq[-1]) Eq << Addition(n, 0, 1) @ Eq[-1] Eq << Addition(n, 0, 2) @ Eq[-1] Eq << Addition(n, 0, 3) @ Eq[-1] Eq << Addition(n, 0, 4) @ Eq[-1] Eq << Addition(n, 0, 5) @ Eq[-1] Eq << Multiplication(n, 0, S.One / (n - 1)) @ Eq[-1] Eq << Multiplication(n, 1, -1) @ (Addition(n, 1, 0, -1) @ Eq[-1]) Eq << Multiplication(n, 2, -1) @ (Addition(n, 2, 0, -1) @ Eq[-1]) Eq << Multiplication(n, 3, -1) @ (Addition(n, 3, 0, -1) @ Eq[-1]) Eq << Multiplication(n, 4, -1) @ (Addition(n, 4, 0, -1) @ Eq[-1]) Eq << Multiplication(n, 5, -1) @ (Addition(n, 5, 0, -1) @ Eq[-1]) Eq << Addition(n, 0, 1, -1) @ Eq[-1] Eq << Addition(n, 0, 2, -1) @ Eq[-1] Eq << Addition(n, 0, 3, -1) @ Eq[-1] Eq << Addition(n, 0, 4, -1) @ Eq[-1] Eq << Addition(n, 0, 5, -1) @ Eq[-1] Eq << Eq[-1].det() * (n - 1) Eq << -Eq[-1].subs(Eq[1])
def apply(given): assert isinstance(given, Equality) lhs = given.lhs assert isinstance(lhs, summations.Sum) limit = lhs.limits[0] j, a, b = limit n = b - a + 1 t = LAMBDA[j:0:n - 1](lhs.function).simplify() assert n >= 2 x = Symbol.x(shape=(n, ), real=True) y = Symbol.y(shape=(n, ), definition=softmax(x)) L = Symbol.L(definition=-t @ sympy.log(y)) return Equality(Derivative(L, x), y - t, given=given)