def point_double(a):
    """
   
    compute A = X1^2
        compute B = Y1^2
        compute C = B^2
        compute D = 2 ((X1 + B)^2 - A - C)
        compute E = 3 A
        compute F = E^2
        compute X3 = F - 2 D
        compute Y3 = E (D - X3) - 8 C
        compute Z3 = 2 Y1 Z1
    """
    A = a.x.square()
    B = a.y.square()
    C = B.square()
    t = a.x + B
    t = t.square()
    D = t - A - C
    D = D.double()
    E = A.double() + A
    F = E.square()
    C8 = C.double().double().double()
    c_x = F - D.double()
    c_y = E * (D - c_x) - C8
    c_z = (a.y * a.z).double()
    return a.__class__(c_x, c_y, c_z)
