def prove(Eq):
    p = Symbol.p(complex=True)    
    n = Symbol.n(domain=Interval(1, oo, integer=True))
    x = Symbol.x(shape=(n,), given=True, complex=True)
    y = Symbol.y(shape=(n,), given=True, complex=True)
    k = Symbol.k(domain=Interval(1, oo, integer=True))
    
    given = Equality(x @ LAMBDA[k:n](p ** k), y @ LAMBDA[k:n](p ** k))
    
    Eq << apply(given)
    Eq << algebre.vector.cosine_similarity.apply(*given.lhs.args)
    Eq << algebre.vector.cosine_similarity.apply(*given.rhs.args)
    
    Eq << given.subs(Eq[-1], Eq[-2])
    
    Eq << matmul_equality.apply(Eq[-1])
def prove(Eq):
    p = Symbol.p(complex=True)
    n = Symbol.n(domain=Interval(1, oo, integer=True))
    x = Symbol.x(shape=(n, ), complex=True, given=True)
    y = Symbol.y(shape=(n, ), complex=True, given=True)
    k = Symbol.k(domain=Interval(1, oo, integer=True))

    assert x.is_given and y.is_given

    given = Equality(LAMBDA[k:n](p**k) @ x, LAMBDA[k:n](p**k) @ y)

    Eq << apply(given)

    i = Symbol.i(domain=Interval(1, n, integer=True))
    Eq << given.subs(p, i)

    Eq << Eq[-1].forall((i, ))

    Eq << Eq[-1].as_Equal()

    Eq.statement = Eq[-1].T

    i, k = Eq.statement.lhs.args[1].variables

    Eq << vandermonde.basicForm.apply(LAMBDA[i:n](i + 1))

    Eq << Unequal(Eq[-1].rhs, 0, plausible=True)

    Eq << Eq[-1].subs(Eq[-2].reversed)

    j, i = Eq[-1].lhs.arg.variables
    Eq << Eq[-1].this.lhs.arg.limits_subs(i, k)

    Eq << Eq[-1].this.lhs.arg.limits_subs(j, i)

    Eq << algebre.matrix.inequality.equality.apply(Eq[-1], Eq.statement)